注:控制台程序,电脑生成棋子算法较为简单;另外,判断右斜的五子连珠有待添加
import java.util.regex.*;
import java.util.*;
import java.io.*;
public class Gobang
{
//定义棋盘的大小
private static int BOARD_SIZE=15;
//定义一个二维数组用来保存电脑随机生成的数组
public String[][] computerBoard=new String[150][2];
//定义一个二维数组来充当棋盘
private static String[][] board;
//初始化棋盘的方法initBoard
public void initBoard()
{
board = new String[BOARD_SIZE][BOARD_SIZE];
for(int i=0;i<board.length;i++)
{
for(int j=0;j<board[i].length;j++)
{
board[i][j]="十";
}
}
}
//在控制台输出棋盘printBoard
public void printBoard()
{
System.out.print(" ");
for(int k=0;k<15;k++)
{
if(k<9)
{
System.out.print(k+1+" ");
}
else
{
System.out.print(k+1);
}
}
System.out.println();
for(int i=0;i<board.length;i++)
{
if(i<9)
{
System.out.print(i+1+" ");
}
else
{
System.out.print(i+1);
}
for(int j=0;j<board[i].length;j++)
{
System.out.print(board[i][j]);
}
System.out.println();
}
}
//定义一个方法用来返回是否存在点
public static boolean exist(int a,int b)
{
if(board[a][b]=="●"||board[a][b]=="○")
{
return false;
}
else
{
return true;
}
}
//定义一个方法用来表示电脑生成一个不重复位置的点
public void computerDot()
{
//不智能电脑随机生成的方法
/*int x,y;
do
{
x=new Random().nextInt(14);
y=new Random().nextInt(14);
}while(board[x][y]=="●"&&board[x][y]=="○");
board[x][y]="○";
*/
//智能电脑生成法
int x,y;
do
{
x=new Random().nextInt(14);
y=new Random().nextInt(14);
}while(board[x][y]=="●"&&board[x][y]=="○");
board[x][y]="○";
}
//定义一个方法检查是否已经有五个子连成一条线了
public int check()
{
for(int i=0;i<11;i++)
{
for(int j=0;j<11;j++)
{
if(board[i][j]=="●"&&board[i][j+1]=="●"&&board[i][j+2]=="●"
&&board[i][j+3]=="●"&&board[i][j+4]=="●"
||board[i][j]=="●"&&board[i+2][j]=="●"&&board[i+3][j]=="●"
&&board[i+4][j]=="●"&&board[i+1][j]=="●"
||board[i][j]=="●"&&board[i+1][j+1]=="●"&&board[i+2][j+2]=="●"
&&board[i+3][j+3]=="●"&&board[i+4][j+4]=="●")
{
return 1;
}
if(board[i][j]=="○"&&board[i][j+1]=="○"&&board[i][j+2]=="○"
&&board[i][j+3]=="○"&&board[i][j+4]=="○"
||board[i][j]=="○"&&board[i+2][j]=="○"&&board[i+3][j]=="○"
&&board[i+4][j]=="○"&&board[i+1][j]=="○"
||board[i][j]=="○"&&board[i+1][j+1]=="○"&&board[i+2][j+2]=="○"
&&board[i+3][j+3]=="○"&&board[i+4][j+4]=="○")
{
return 2;
}
}
}
return 0;
}
public static void main(String[] args) throws Exception
{
Gobang gb=new Gobang();
gb.initBoard();
gb.printBoard();
//获取用户输入
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
String inputStr=null;
while((inputStr=br.readLine())!=null&&!inputStr.equals("exit"))
{
String rex="\\d{1,12},\\d{1,2}";
Pattern pat=Pattern.compile(rex);
Matcher matcher=pat.matcher(inputStr);
if(matcher.matches())
{
String[] posStrArr=inputStr.split(",");
int xPos=Integer.parseInt(posStrArr[0]);
int yPos=Integer.parseInt(posStrArr[1]);
if(1<=xPos&&xPos<=15&&1<=yPos&&yPos<=15)
{
gb.board[xPos-1][yPos-1]="●";
//检查电脑生成的有没有重复
if(xPos==1||xPos==15||yPos==1||yPos==15)
{
int x,y;
do
{
x=new Random().nextInt(14);
y=new Random().nextInt(14);
}while(board[x][y]=="●"&&board[x][y]=="○");
board[x][y]="○";
}
else
{
int a=new Random().nextInt(7);
if(exist(xPos-2,yPos-2))
{
board[xPos-2][yPos-2]="○";
}
else if(exist(xPos-2,yPos-1))
{
board[xPos-2][yPos-1]="○";
}
else if(exist(xPos-2,yPos))
{
board[xPos-2][yPos]="○";
}
else if(exist(xPos-1,yPos-2))
{
board[xPos-1][yPos-2]="○";
}
else if(exist(xPos-1,yPos))
{
board[xPos-1][yPos]="○";
}
else if(exist(xPos,yPos-2))
{
board[xPos][yPos-2]="○";
}
else if(exist(xPos,yPos-1))
{
board[xPos][yPos-1]="○";
}
else if(exist(xPos,yPos))
{
board[xPos][yPos]="○";
}
else
{
gb.computerDot();
}
}
//gb.computerDot();
/*
电脑随机生成两个整数,作为电脑下棋的坐标,赋给board数组,还涉及
1.坐标的有效性,只能是数字,不能超出棋盘范围
2.下的棋的点,不能重复下棋
3.每次下棋后,需要扫描谁赢了
*/
gb.printBoard();
switch(gb.check())
{
case 0:
break;
case 1:
System.out.println("哎哟,您真的好厉害啊。。。恭喜您,您赢了!,小女子愿以身相许");
System.out.println("---------------华丽的分割线,您真厉害-------------");
return;
case 2:
System.out.println("很遗憾,电脑战胜了你这个笨蛋!!!");
System.out.println("----(ㄒoㄒ)------(ㄒoㄒ)------(ㄒoㄒ)------");
return;
}
}
else
{
System.out.println("请按照范围输入:1=< x <=15;1=< y <=15");
}
}
else
{
System.out.println("对不起,请您严格按照要求来输入!形如:x,y");
}
System.out.println("请输入您下棋的坐标,应以x,y的格式");
}
}
}