Java五子棋小游戏
2.0版本,增加Ai机器人算法,优化一些小bug,点击进入
一边写一边修复BUG感觉写完快吐血了
奋斗了将近3个小时多,终于搞定了
没有加UI还是,但还是勉强可以玩
下面是Java代码
import java.util.Scanner;
/**
* 控制台五子棋游戏
*/
public class Gobang {
private boolean gameover = false;
//15*15棋盘
private char[][] table = new char[16][16];
//两个玩家
private Player p1,p2;
//回合
private int huihe = 0;
public void createGame(Player p1,Player p2){
this.p1=p1;
this.p2=p2;
}
/** 展示棋局 **/
private void show(){
int xx =0;
System.out.println(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ");
for(char[] cs :table){
System.out.print(" "+xx+(xx>9?"":" ")+" ");
for(char c : cs){
if(c==0) System.out.print("·");
System.out.print(c+" ");
}
System.out.println();
xx++;
}
}
/** 获取下一个走棋的 **/
private Player getPlayer(){
//p1先走
if (huihe==0) return p1;
if (huihe%2!=0) return p2;
return p1;
}
/** 判断是否获胜 **/
private boolean isWin(int x,int y,char c){
/*
x 和 y 代表坐标
* xx :x方向需要增加的值
* yy :y方向需要增加的值
*
* 例如xx = -1 yy= -1
* 代表需要获取(x-1,y-1)的棋子颜色
*
* xx = 1 yy= 1
* 代表需要获取(x+1,y+1)的棋子颜色
*
* */
int xx = 0,yy=0;
for (int i =1 ;i<9 ;i++ ){
switch (i){
case 1:
xx=-1;yy=-1;
break;
case 2:
xx=-1;yy=1;
break;
case 3:
xx=-1;yy=0;
break;
case 4:
xx = 1;yy = -1;
break;
case 5:
xx = 1;yy = 1;
break;
case 6:
xx = 1 ;yy = 0;
break;
case 7:
xx = 0;yy = -1;
break;
case 8:
xx = 0;yy = 1;
break;
}
int n = ishas(x,y,xx,yy,0,c)+ishas(x,y,-xx,-yy,0,c);
if(n>=4)return true;
}
return false;
}
/**
* 检测是否有棋子
* @param x x坐标
* @param y y坐标
* @param xx x方向
* @param yy y方向
* @param size 缓存
* @param c 颜色
* @return 权重
*/
private int ishas(int x,int y,int xx,int yy,int size ,char c){
if((x==0&&xx==-1)|| (x==15&&xx==1) || (y==0&&yy==-1) || (y== 15&&yy==1)) return size;
if(table[x+xx][y+yy] == c){
return ishas(x+xx,y+yy,xx,yy,size+1,c);
}
return size;
}
/** 下棋 **/
public boolean put(int x,int y,Player p){
if (table[x][y]==0) {
table[x][y] = p.getColor();
if(isWin(x,y,p.color)){
gameover = true;
System.out.println(p.username+"("+p.color+")赢得了胜利");
}
return true;
}
return false;
}
/** 游戏运行 **/
public void start(){
Player p = null;
Scanner scan = new Scanner(System.in);
String[] strArr = new String[2];
while (!gameover){
if(p==null)p=getPlayer();
System.out.println("第"+(huihe/2+1)+"回合,下子方:"+p.getUsername()+"("+p.getColor()+")");
System.out.println("请输入你要下的位置(空格隔开) 例如 10 5");
//下棋失败重新开始本回合
try {
String in = scan.nextLine().trim();
if ("exit".equals(in)) break;
strArr = in.split(" ");
if (!put( Integer.parseInt(strArr[0]),Integer.parseInt(strArr[1]),p))continue;
}catch (Exception e){
e.printStackTrace();
}
show();
p=null;
huihe++;
}
System.out.println("游戏结束");
}
/** 游戏入口 */
public static void main(String[] args) {
Gobang game = new Gobang();
Player p1 = new Player("玩家1",'黑');
Player p2 = new Player("玩家2",'白');
game.createGame(p1,p2);
game.start();
}
}
/** 玩家类 **/
class Player{
String username;
char color;
public Player(String username, char color) {
this.username = username;
this.color = color;
System.out.println(username+"携带"+color+"颜色的棋子加入游戏");
}
public String getUsername() {
return username;
}
public char getColor() {
return color;
}
}
游戏运行结果
这里我就很简单的复制了一个结果
第9回合,下子方:玩家2(白)
请输入你要下的位置(空格隔开) 例如 10 5
9 5
玩家2(白)赢得了胜利
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 · · · · · · · · · · · · · · · ·
1 · · · · · · · · · · · · · · · ·
2 · · · · · · · · · · · · · · · ·
3 · · · · · · · · · · · · · · · ·
4 · · · · · · · · · · · · · · · ·
5 · · · · · 白 黑 · · · · · · · · ·
6 · · · · · 白 · · · 黑 · · · · · ·
7 · · · · · 白 黑 · · · · · · · · ·
8 · · · · · 白 黑 · · · · · · · · ·
9 · · · · · 白 · · · · · · · · · ·
10 · · · · · · · · · · · · · · · ·
11 · · · · · · · · · · · · · · · ·
12 · · · · · · · · · · · · · · · ·
13 · · · · · · · · · · · · · · · ·
14 · · · · · · · · · · · · · · · ·
15 · · · · · · · · · · · · · · · ·
游戏结束