五子棋游戏规则:
- 五子棋分黑棋、白棋,两人轮流下棋,任意方向满五个即可胜利。
- 下棋操作:输入棋子的座标进行下棋
注意:已经有棋子的地方不能进行二次下棋
游戏思路:
- 初始化棋盘 initBoard()
- 打印棋盘 printBoard()
- 开始游戏 startGame()
- 下棋(黑白) putDownChess()
- 判断输赢 isGameOver()
首先,将board数据定义为全局变量,即任何函数都可以访问的变量,因为游戏思路中所展示的的方法都会使用数据board,每次将board当做参数传递给函数的时候会比较麻烦,所以将board数据定义为全局变量。定义为全局变量的数据还有,黑白棋以及输入座标。下面代码中就会涉及。
注:全局变量定义在函数的外面,类的里面,必须以 public static 开头
第一步:初始化棋盘
public static void initBoard(){
board=new String[15][15];//创建的棋盘为15行,15列
for(int i=0;i<board.length;i++){
for(int j=0;j<board[i].length;j++){
board[i][j]="+";
}
}
}
棋盘的表示:创建一个String的二维数组来表示棋盘,数组中存放 字符 " + "
第二步:打印棋盘
public static void printBoard(){//打印棋盘
for(int i = 0;i<board.length;i++){
for(int j=0;j<board[i].length;j++){
System.out.print(board[i][j] + " ");
}
System.out.println();
}
}
打印棋盘展示:
第三步:开始游戏
public static void startGame(){//开始游戏
System.out.println("游戏开始");
while(true){
if(player % 2==0){
System.out.println("请黑方下棋");
if(!putDownChess(BLACK_CHESS)){
continue;
}
}else{
System.out.println("请白方下棋");
if(!putDownChess(WHITE_CHESS)){
continue;
}
}
if(isGameOver()){
break;
}
player++;
}
}
第四步:下棋
public static boolean putDownChess(String chess){
int x=scanner.nextInt()-1;
int y=scanner.nextInt()-1;
if(!board[x][y].equals("+")){
System.out.println("此处已有棋子,请重新下棋");
return false;
}
board[x][y]=chess;
printBoard();//下一次棋打印一次棋盘
return true;
}
第五步:判断输赢
public static boolean isGameOver(){
for(int i = 0;i<board.length;i++){
for(int j= 0;j<board[i].length;j++){
if(!board[i][j].equals("+")){
if(j<board[i].length-4){//向右
boolean flag=true;
for(int c = j+1;c<j+5;c++){
if(board[i][j]!= board[i][c]){
flag=false;
break;
}
}
if(flag){
System.out.println("游戏结束");
return true;
}
}
if(i<board.length-4){//向下
boolean flag=true;
for(int c = i+1;c<i+5;c++){
if(board[i][j]!= board[c][j]){
flag=false;
break;
}
}
if(flag){
System.out.println("游戏结束");
return true;
}
}
if(j<board[i].length-4 && i<board.length-4){//向右下
boolean flag=true;
for(int c = j+1,d = i+1;c<j+5;c++,d++){
if(board[i][j]!= board[d][c]){
flag=false;
break;
}
}
if(flag){
System.out.println("游戏结束");
return true;
}
}
if(i>3 && j<board.length-4){//向右上
boolean flag=true;
for(int c = i-1,d = j+1;d<j+5;c--,d++){
if(board[i][j]!= board[c][d]){
flag=false;
break;
}
}
if(flag){
System.out.println("游戏结束");
return true;
}
}
}
}
}
return false;
}
参考上图,就可以很轻松的写出判断游戏输赢的逻辑啦~上述代码中,主要应用了二维数组中连续相等问题的思路。其中一共分了4个方向,只要任意一个方向有5个棋子连成,游戏就结束啦。之所以分4个方向是因为,其他四个方向和图中四个方向是等效的,例如右下就等于左上,以此类推。
主函数代码展示:
public static String[][] board;//定义全局变量棋盘
public static String BLACK_CHESS="O"; //黑棋
public static String WHITE_CHESS="X"; //白棋
public static Scanner scanner=new Scanner(System.in);//输入棋子座标
public static int player = 0;//判断棋子颜色
public static void main(String[] args){
initBoard();
printBoard();
startGame();
}
可以发现主函数的代码量十分简洁,这就是定义方法的优势。
代码优化:
- 游戏结束时,加上判断棋子颜色,如:游戏结束,黑棋获胜。实现此功能新增一个方法调用即可。方法代码展示如下:
public static void Colur(){
if(player % 2==0){
System.out.println("游戏结束,黑棋获胜");
}else{
System.out.println("游戏结束,白棋获胜");
}
}
结果展示:
- 为棋盘加上行序和列序,即对printBoard()方法进行了优化,代码展示如下:
public static void printBoard(){//打印棋盘
System.out.print(" ");//为了让列标与棋盘对齐,在数字1前加入适当空格即可
for(int k = 1;k<=15;k++){//打印列标
System.out.printf("%-3d",k);
}
System.out.println();
for(int i = 0;i<board.length;i++){
System.out.printf("%2d ",i+1);//打印行标
for(int j=0;j<board[i].length;j++){
System.out.print(board[i][j] + " ");
}
System.out.println();
}
}
棋盘展示:
其他优化,再做补充~