控制台五子棋
2016-03-17 13:00
281 查看
注:控制台程序,电脑生成棋子算法较为简单;另外,判断右斜的五子连珠有待添加
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 a9fc .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的格式"); } } }
相关文章推荐