看书的时候看到一个不完整的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;
}
}
}
}