五子棋游戏
Q7nl1s admin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import java.util.Scanner;

// 五子棋有棋盘、棋子,两个元素

public class Gobang{
// 定义棋盘大小
public static int BOARD_SIZE = 15;
// 定义一个二维数组来充当棋盘
public static String[][] board = new String[BOARD_SIZE][BOARD_SIZE];

String black = "●"; // 黑子
String white = "○"; // 白子

/*
* 初始化械盘数组
*/
public void initBoard(){

// 把每个元素赋为"╋",用于在控制台画出棋盘
for(int i = 0;i < BOARD_SIZE;i++){
for(int j = 0;j < BOARD_SIZE;j++){
board[i][j] = "╋";
}
}
}

/**
* 在控制台输出棋盘的方法
*/
public void printBoard(){
// 打印每个数组元素
for(int i = 0;i < BOARD_SIZE;i++){
for(int j = 0;j < BOARD_SIZE;j++){
// 打印数组元素后不换行
System.out.println(board[i][j]);
}
// 每打印完一行数组元素后输出一个换行符
System.out.print("\n");
}
}
/**
* 判断输赢的方法
*/
public static boolean isWin(int x,int y,String color){
if(color.equals("black")){
color = "●";
}
if(color.equals("white")){
color = "○";
}
// 横向
for(int i = 0;i < board.length - 5;i++){
if(board[x][i].equals(color) && board[x][i + 1].equals(color)
&& board[x][i + 2].equals(color) && noard[x][i + 3].equals(color)
&& board[x][i + 4].equals(color)){
return true;
}
}
// 竖向
for(int i = 0;i < board.length - 5;i++){
if(board[i][y].equals(color) && board[i + 1][y].equals(color)
&& board[i + 2][y].equals(color) && board[i + 3][y].equals(color)
&& board[i + 4][y].equals(color)){
return true;
}
}
return false;
}

/**
*判断指定位置是否有棋子
*/
public static boolean isOk(int x,int y){
return board[x - 1][y - 1].equals("╋");
}

/**
* 电脑下棋
*/
public static String computer(String color){
int x = (int)(Math.random() * 14) + 1; // 生成一个1~14之间的随机数
int y = (int)(Math.random() * 14) + 1; // 生成一个1~14之间的随机数
// 判断电脑下棋的坐标有无棋子,有棋子则再重新生成随机数
if(isOk(x,y)){
if(color.equal("black")){
board[x][y] = "●";
}else if (color.equals("white")){
board[x][y] = "○";
}
}else{
computer(color);
}
return "x,y";
}

public static void main(String[] args) throws Exception{
Gobang gb = new Gobang();
gb.initBoard();
gb.printBoard();
// 这是用于获取键盘输入的方法
Scanner input = new Scanner(System.in);
System.out.println("你想要选择什么颜色的棋,black或white,请输入:");
String peopleColor = input.next(); // 定义用户选择棋子的颜色并返回用户输入的字符串

// 如果用户选择的是白棋,则电脑先下(五子棋中黑棋先下)
if(peopleColor.equals("white")){
System.out.println("您的选择是白棋");
computer("black");
gb.printBoard();
}
String inputStr;
do{
System.out.println("输入您下棋的坐标,应以x,y的格式:");
inputStr = input.next();
// 定义数组并赋值坐标x,y
String[] posStrArr = inputStr.split(",");
int x = Integer.parseInt(posStrArr[0]);
int y = Integer.parseInt(posStrArr[1]);
// 如果输入坐标已有棋子,则重新输入坐标
if(!isOk(x,y)){
System.out.println("此处已有棋子,请换位置!");
continue;
}
// 将上面分隔完以后的字符串转换成用户下棋的坐标
int xPos = x;
int yPos = y;

// 定义电脑棋子颜色
String comColor = null;
// 根据用户选择的棋子颜色给对应的数组元素赋值
if(peopleColor.equals("black")){
gb.board[xPos - 1][yPos - 1] = "●";
comColor = "white";
}else if(peopleColor.equals("white")){
gb.board[xPos - 1][yPos - 1] = "○";
comColor = "black";
}
computer(comColor);
gb.printBoard();
// 判断输赢
if(isWin(xPos - 1,yPos -1,peopleColor)){
System.out.println(peopleColor + "获胜!");
break;
}
if(isWin(xPos - 1,yPos - 1,comColor)){
System.out.println(comColor + "获胜!");
break;
}
}while(inputStr != null);
}
}

运行以上程序,最终代码如下图所示

gobang-0

跟据图可知,黑点是棋手下的棋,白棋是电脑下的。本次实战我用的是随机生成的两个坐标值来控制电脑下棋,当然也可以添加人工智能来控制下棋。

如果你仔细阅读代码,会发现程序只对横竖是否有五个棋连在一起,进行输赢判断。并且在判断输赢时,既不可以及时地显示某一方玩家赢了(可能导致双方都赢局面的出现),也无法正确的对电脑玩家的输赢判定,因为xPos和yPos中存放的是用户当前的棋子坐标,而不是电脑当前的棋子坐标。完整代码待我日后来改进。

 Comments
Comment plugin failed to load
Loading comment plugin
Powered by Hexo & Theme Keep
Unique Visitor Page View