第一次先实现了自己跟自己下棋,也就是自己先执黑子输入一个位置,接着判断输赢;然后自己再执白子输入一个位置,判断输赢,如此循环直到有人胜出;
第二次实现了人机对战,也就是让一方为电脑随机生成坐标,自己为另一方,循环判断输赢。
程序里较为重要的是输赢判断的时候需要判断横、竖、左斜、右斜四条线是否有同一方的五子相连,这里用到的是两个长度为8的数组,记录坐标变化的规律,以当前坐标为中心,一条线上双向寻找。
程序如下:
package com.school;
import java.util.Random;
import java.util.Scanner;
public class Chess {
//定义棋盘大小
private static int BOARD_SIZE=30;
//定义棋盘二维数组
private static char[][] board=new char[BOARD_SIZE][BOARD_SIZE];
//已下子数目
private static int cnt;
//分别代表玩家1,2的棋子
private static char[] qizi={'$','@'};
//8个方向检索有没有连着的
private static int[] dx={-1,0,-1,-1,1,1,0,1};
private static int[] dy={0,-1,-1,1,-1,1,1,0};
//初始化
static void init(){
cnt=0;
for (int i=0;i<=15;i++){
for (int j=1;j<=15;j++){
board[i][j]='+';
}
}
}
//输出棋盘
static void printBoard(){
int i,j;
for (i=1;i<=15;i++){
for (j=1;j<=15;j++){
System.out.print(board[i][j]+" ");
}
System.out.println();
}
}
//输入检测,输入的坐标出不是+的为不合法输入,即不能在已落子的地方落子
private static int CheckInput(int x,int y){
if (x<1||x>15||y<1||y>15){
return 0;
}
if (board[x][y]!='+'){
return 0;
}
return 1;
}
//边界检测
private static int Check(int x,int y){
if (x<1||x>15||y<1||y>15){
return 0;
}
return 1;
}
//检测玩家是否获胜,需要传入玩家编号及当前落子位置
private static int checkWinner(int num,int x,int y){
if (cnt==15*15){
return 1;
}
//横竖、左斜、右斜四个方向判断是否有五个棋子连载一起
for (int i=0;i<4;i++){
int sum=1;
int xx=x+dx[i];
int yy=y+dy[i];
while (board[xx][yy]==qizi[num]&&Check(xx,yy)==1){//以当前坐标为基准,正向往四个方向检查
sum++;
xx=xx+dx[i];
yy=yy+dy[i];
}
xx=x+dx[7-i];
yy=y+dy[7-i];
while (board[xx][yy]==qizi[num]&&Check(xx,yy)==1){//以当前坐标为基准,反向往四个方向检查
sum++;
xx=xx+dx[i];
yy=yy+dy[i];
}
if (sum>=5){//双向总和
return 1;
}
}
return 0;
}
public static int run(){
int x,y;
init();
//当前棋手编号,默认0号先下
int num=0;
printBoard();
while (true){
System.out.print(num+"号选手输入您的落子坐标,应以x y形式:");
Scanner sc=new Scanner(System.in);
while (true){
x=sc.nextInt();
y=sc.nextInt();
if (CheckInput(x,y)==1)
break;
System.out.print("输入坐标不合法,请重新输入:");
}
board[x][y]=qizi[num];
printBoard();
if (checkWinner(num,x,y)==1){
return num;
}
num=1-num;
//人机大战
int x1,y1;
do {
Random random = new Random();
x1=random.nextInt()%16;
y1=random.nextInt()%16;
}while (CheckInput(x1,y1)!=1);
System.out.println(num+"号电脑选手输入的落子坐标是"+x1+" "+y1);
board[x1][y1]=qizi[num];
printBoard();
if (checkWinner(num,x1,y1)==1){
return num;
}
num=1-num;
}
}
public static void main(String[] args) throws Exception{
//自己跟自己下棋^_^
//自己跟电脑下棋!!!
Chess chess=new Chess();
System.out.println("请在范围15内的范围内落子:");
int number=chess.run();
System.out.println(number+"号胜利");
}
}
运行截图如下:
人人:
人机: