看书的时候看到一个不完整的Java编写的一个五子棋小游戏,为了恢复一下编程能力刚刚把这个小程序完成了。
实现的功能很简单,两人对下五子棋,程序自动回判断输赢。在ubuntu下搞得,没有装什么高端的输入法的程序,所以用“*”和“X”来代表两个不同的棋子。
这个程序虽然简单但是还是有很多值得学习的地方。
首先,整个棋盘用二维数组表示。在Java中声明一个二维数组使用 type[][] arrName;的语句。
其次,我们需要给数组赋值,开始的时候是画棋盘使用的是“+”,给二维数组开辟空间和一维数组差不多。e.g.: arrName= new type[len1][len2];
判断游戏时候结束我们需要判断四个方向的棋子是不是连成了5个棋子。是的话游戏继续,否则退出。
整个代码的主要架构如下图所示:
其中initBoard负责初始化,printBoard负责打印更新整个面板,main做点常规操作赋值之类的,WinOrLose则负责判断游戏时候结束。
比较有价值的代码是输入这部分,可以根据特定符号分割输入的数据,值得收藏的代码:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String inputStr = null; inputStr=br.readLine(); String[] str = inputStr.split(",");
以下为完整的代码。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Gobang { private String[][] board; private static int BOARD_SIZE = 15; private void initBoard(){ board = new String[BOARD_SIZE][BOARD_SIZE]; for (int i = 0; i<BOARD_SIZE; i++) { for (int j = 0; j<BOARD_SIZE; j++) { board[i][j]="十"; } } } public void printBoard(){ for (int i = 0 ; i < BOARD_SIZE;i++) { for(int j = 0; j< BOARD_SIZE; j++) { System.out.print(board[i][j]); } System.out.print("\n"); } } public int winOrLose(int x, int y, String star){ int end = 0; int xPos=x,yPos=y; int s1=0,s2=0,sum=0,time = 4; star = board[x][y]; while(time !=0) { //左斜 for(int i = x-1,j=y-1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); i--,j--) { s1++; } for (int i=x+1,j=y+1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); i++, j++) { s2++; } sum = s1 + s2; if(sum==5) { end = 1; break; } else { s1=0; s2 = 0; sum = 0; } //右斜 for(int i = x-1,j=y-1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); i++,j--) { s1++; } for (int i=x+1,j=y+1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); i--, j++) { s2++; } sum = s1 + s2; if(sum==5) { end = 1; break; } else { s1=0; s2 = 0; sum = 0; } //north and south for(int i = x-1,j=y-1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); j--) { s1++; } for (int i=x+1,j=y+1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); j++) { s2++; } sum = s1 + s2; if(sum==5) { end = 1; break; } else { s1=0; s2 = 0; sum = 0; } //we for(int i = x-1,j=y-1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); i++) { s1++; } for (int i=x+1,j=y+1; board[i][j] == star && (i>=0 && i< BOARD_SIZE) && (j>=0 && j< BOARD_SIZE); i--) { s2++; } sum = s1 + s2; if(sum==5) { end = 1; break; } else { s1=0; s2 = 0; sum = 0; } } return end; } /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO Auto-generated method stub Gobang gb = new Gobang(); gb.initBoard(); gb.printBoard(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String inputStr = null; int flag=0; int end=0; while ((inputStr = br.readLine()) != null ) { String[] posStrArr = inputStr.split(","); int xPos = Integer.parseInt(posStrArr[0]); int yPos = Integer.parseInt(posStrArr[1]); if(flag==0) { gb.board[xPos-1][yPos-1] = "*"; } else { gb.board[xPos-1][yPos-1] = "X"; } flag++; gb.printBoard(); end=gb.winOrLose(xPos-1, yPos-1, gb.board[xPos-1][yPos-1]); if(end ==1) { break; } } } }
原文:http://blog.csdn.net/chichoxian/article/details/20471343