五子棋游戏(Java)
本篇文章参考了一下两篇文章:
1.控制台五子棋java_java实现简单控制台五子棋游戏
2.Java实现五子棋小游戏(对新手极为友好的版本)
在本章中,主要是参考了第一篇文章!五子棋判断输赢的核心算法是参考的第二篇!
五子棋项目大概构成
在本项目中主要含有3个类。参考如下图:
三个类(Coordinate、GameMain、Gobang)
Coordinate类
package gobang;
/*
* 棋子坐标
*/
public class Coordinate {
private int x;
private int y;
public Coordinate(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
Gobang类-游戏主体
package gobang;
/*
* 游戏地图设计,规则设计
*/
public class Gobang {
public int scale = 20;//规模
public String color;//当局颜色是白?还是黑
public String mark = "╋";
public String white = "○";
public String black = "●";
public String[][] map = new String[scale][scale];
public String[] border = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑",
"⒒", "⒓", "⒔", "⒕", "⒖", "⒗", "⒘","⒙", "⒚", "⒛" };
public Gobang() {
initMap();//初始化地图
}
/**
* 初始化地图
*/
public void initMap() {
for(int i = 0;i < scale;i++) {
for(int j = 0;j < scale;j++) {
if(i == scale - 1) { //棋盘下边界处
map[i][j] = border[j];
}else if(j == scale - 1) { //棋盘左边界处
map[i][j] = border[i];
}else {
map[i][j] = mark;
}
}
}
//打印地图
printMap();
}
/**
* 打印地图
*/
public void printMap() {
for(int i = 0;i < scale;i++) {
for(int j = 0;j < scale;j++) {
System.out.print(map[i][j]);
}
System.out.println();
}
}
/**
* 解析坐标:在输入的坐标值处下子
* @param coordinate 用户输入的落子坐标的字符串
* @return 返回落子的坐标类
*/
public Coordinate analyCoordinate(String coordinate) {
String[] coordinates = coordinate.split(",");//分离出逗号,并赋值给coordinates字符串数组
int x = Integer.parseInt(coordinates[0]) - 1;
int y = Integer.parseInt(coordinates[1]) - 1;
return new Coordinate(x,y);//创建坐标对象,将x,y值传入Coordinate类
}
/**
* 落子
* @param coordinate 落子坐标
* @param color 当局落子颜色
*/
public boolean putDownPieces(Coordinate coordinate,Boolean color) {
//判断是否出界
if(coordinate.getX() < 0 || coordinate.getX() > 18 ||
coordinate.getY() < 0 || coordinate.getY() > 18) {
return false;//坐标出界,落子失败
}
//判断落子的地方是否被占用
if(map[coordinate.getX()][coordinate.getY()] != mark) {
return false;//该地方已经被下子,落子失败
}
//将坐标的位置上的mark改成white或者black,完成落子!
map[coordinate.getX()][coordinate.getY()] = color ? white : black;
return true;//落子成功
}
/**
* 判断输赢
* @param coordinate 棋子坐标
* @param color 当局下棋的颜色
* @return
*/
public boolean isWin(Coordinate coordinate,boolean color) {
//垂直方向
if((extend(coordinate,0,color)+extend(coordinate,4,color)) >= 4) {
return true;//游戏结束,本局中在垂直方向上有5个相同色的棋子已成功连接
}
//副对角线
if((extend(coordinate,1,color)+extend(coordinate,5,color)) >= 4) {
return true;//游戏结束
}
//水平方向
if((extend(coordinate,2,color)+extend(coordinate,6,color)) >= 4) {
return true;//游戏结束
}
//主对角线
if((extend(coordinate,3,color)+extend(coordinate,7,color)) >= 4) {
return true;//游戏结束
}
return false;//游戏尚未结束,在本局中没有5个相同棋子连接起来
}
/**
* 判断延展方向上是否有4个相同的颜色的棋子
* @param coordinate 坐标
* @param direction 0向上 1右上 2右 3右下 4下 5左下 6左 7左上
* @param color 当局颜色
* @return 相同颜色个数在同一方向上
*/
public int extend(Coordinate coordinate,int direction,boolean color) {
int count = 0;//记录相同颜色在同一方向上的个数
int x = coordinate.getX();
int y = coordinate.getY();
//在延展方向上(不包括刚落下的棋子)判断4个即可
for(int i = 0;i < 4;i++) {
switch(direction) {
case 0: x--;break;
case 1: x--;y++;break;
case 2: y++;break;
case 3: x++;y++;break;
case 4: x++;break;
case 5: x++;y--;break;
case 6: y--;break;
case 7: x--;y--;break;
}
//判断坐标递减后是否出界
if(x < 0 || x > 18 || y < 0 || y > 18) {
break;
}
//判断颜色是否为当局颜色
if(map[x][y].equals(color?white:black)) {
count++;
}else {
break;//不相等,跳出循环
}
}
return count;
}
}
GameMain类
package gobang;
import java.util.Scanner;
/*
* 游戏主体,程序的入口
*/
public class GameMain {
public static String white = "白方";
public static String black = "黑方";
public static boolean color = false;//白色:TRUE 黑色:FALSE
public static String storagePoint;//存储坐标
public static void main(String[] args) {
Gobang gobang = new Gobang();
Scanner scanner = new Scanner(System.in);
while(true) {
System.out.print("请"+(color?white:black)+"落子:(格式:竖,横)");
storagePoint = scanner.next();//格式:x,y 如3,4
Coordinate coordinate = gobang.analyCoordinate(storagePoint);//输入的落子坐标
//落子(putDownPieces)并打印更新棋盘(printMap)
if(gobang.putDownPieces(coordinate, color)) {//开局默认为黑色
gobang.printMap();
//落子后,判断输赢
if(gobang.isWin(coordinate, color)) {
System.out.println("恭喜"+(color?white:black)+"赢了!!");
scanner.close();//游戏结束,关闭scanner
break;//一方胜利,结束游戏并退出程序
}
//交换下棋
color = !color;
}
}
}
}
参考坐标系
在游戏中x指的是行,y指的是列,如上图所示!
玩法
在开始时,要求你输入棋子的落下坐标(黑子开局):
3,4
输入后,棋子会在第3行第4列,落下棋子。之后白子落棋,直至有一方五子连起来结束游戏!
完结