本文實例為大家分享了Java實現(xiàn)五子棋的具體代碼,供大家參考,具體內(nèi)容如下
任務(wù)概述:
五子棋是全國智力運動會競技項目之一,是一種兩人對弈的純策略型棋類游戲。通常雙方分別使用黑白兩色的棋子,下在棋盤直線與橫線的交叉點上,先形成五子連線者獲勝。
任務(wù)過程:
1.繪制棋盤
2.提示黑方(用 1 表示)和白方(用 2 表示)分別下棋(X,Y 軸位置)并重新繪制棋盤
3.每當一方下棋后判斷是否獲勝
重點講解:
1.關(guān)于勝利的判斷:
根據(jù)用戶所下棋子的位置對其周圍進行檢測,分為以下情況:
橫向:當前下棋位置左右各4顆棋子連續(xù)相同5顆
豎向:當前下棋位置上下各4顆棋子連續(xù)相同5顆
斜向:當前下棋位置左上右下各4顆棋子連續(xù)相同5顆、當前下棋位置左下右上各4顆棋子連續(xù)相同5顆
在檢測時要注意數(shù)組的下標,若用戶下棋位置處于棋盤邊緣,則周圍坐標很可能已經(jīng)在棋盤之外,要注意加上相應(yīng)的判斷避免下標越界!
2.關(guān)于棋盤下滿:
我的思路是,先認為棋盤已經(jīng)下滿,然后在打印棋盤的同時,若當前打印值為0,則認為棋盤未滿,可繼續(xù)下棋操作,若棋盤已經(jīng)打印完畢,仍然沒有打印值為0的情況,則認為棋盤下滿,雙方平局,游戲結(jié)束。
其余內(nèi)容在代碼上有詳細的注釋,以下為代碼:
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
import java.util.Scanner; public class Chess { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int order = 1 ; //儲存順序,當order為1時輪到黑方下棋,當order為2時輪到白方下棋 int row = 0 ; //用來儲存要下棋的行數(shù) int column = 0 ; //用來儲存要下棋的列數(shù) int win = 0 ; //用來儲存獲勝者編號,為0則雙方均未獲勝,為1則白方獲勝,為2則黑方獲勝 int count1 = 0 ; //用來儲存當前下棋位置左右各4顆棋子的相同數(shù)量 int count2 = 0 ; //用來儲存當前下棋位置上下各4顆棋子的相同數(shù)量 int count3 = 0 ; //用來儲存當前下棋位置左上右下各4顆棋子的相同數(shù)量 int count4 = 0 ; //用來儲存當前下棋位置左下右上各4顆棋子的相同數(shù)量 int full = 1 ; //用來判斷棋盤是否下滿,默認值1認為已滿,只要有1處空則置0 int board[][] = new int [ 16 ][ 16 ]; //用來記錄棋盤 //為棋盤的坐標賦值 for ( int i = 0 ;i< 16 ;i++) { board[i][ 0 ] = i; //為棋盤的Y軸賦值 } for ( int j = 0 ;j< 16 ;j++) { board[ 0 ][j] = j; //為棋盤的X軸賦值 } //開始下棋,無限循環(huán)直到有一方勝利或棋盤下滿 while ( true ) { //首先輸出棋盤 for ( int i = 0 ;i< 16 ;i++) { for ( int j = 0 ;j< 16 ;j++) { if (board[i][j] == 0 ) //若棋盤有1處空則認為棋盤未滿 full = 0 ; System.out.print(board[i][j]+ "\t" ); } System.out.println(); } //然后判斷棋盤是否下滿 if (full == 1 ) { //棋盤自始至終未有空值,則認為棋盤已經(jīng)下滿 System.out.print( "棋盤已下滿,雙方平局,游戲結(jié)束!" ); break ; //跳出循環(huán) } //棋盤未滿,進入下棋過程 if (order == 1 ) { //order為1黑方下棋 order = 2 ; //切換order,下一次則白方下棋 //無限循環(huán)直到下棋點可以正常下棋 while ( true ) { System.out.println( "請黑方下棋,請先輸入X軸位置(列數(shù),1-15):" ); column = scanner.nextInt(); //儲存要下棋的列數(shù) System.out.println( "請黑方下棋,請輸入Y軸位置(行數(shù),1-15):" ); row = scanner.nextInt(); //儲存要下棋的行數(shù) if (board[row][column] != 0 ) //下棋點已有棋子,需重新下棋 System.out.println( "此次下棋無效,請重新下棋!" ); else { board[row][column] = 1 ; //放置黑棋 break ; //跳出循環(huán) } } } else { //order為2白方下棋 order = 1 ; //切換order,下一次則黑方下棋 //無限循環(huán)直到下棋點可以正常下棋 while ( true ) { System.out.println( "請白方下棋,請先輸入X軸位置(列數(shù),1-15):" ); column = scanner.nextInt(); //儲存要下棋的列數(shù) System.out.println( "請白方下棋,請輸入Y軸位置(行數(shù),1-15):" ); row = scanner.nextInt(); //儲存要下棋的行數(shù) if (board[row][column] != 0 ) //下棋點已有棋子,需重新下棋 System.out.println( "此次下棋無效,請重新下棋!" ); else { board[row][column] = 2 ; //放置白棋 break ; //跳出循環(huán) } } } //本次下棋完畢,判斷是否有人獲勝 for ( int i = - 4 ;i < 4 ;i++) { //判斷當前下棋位置左右各4顆棋子的相同數(shù)量,連續(xù)4組相同則獲勝 if (column+i> 0 && column+i+ 1 < 16 ) { //防止下標越界 if (board[row][column+i] == board[row][column+i+ 1 ] && board[row][column+i] != 0 ) { count1++; if (count1 == 4 ) { //連續(xù)4組相同,獲勝 win = order; break ; } } else count1 = 0 ; //未連續(xù)相同,清除相同計數(shù) } //判斷當前下棋位置上下各4顆棋子的相同數(shù)量,連續(xù)4組相同則獲勝 if (row+i> 0 && row+i+ 1 < 16 ) { //防止下標越界 if (board[row+i][column] == board[row+i+ 1 ][column] && board[row+i][column] != 0 ) { count2++; if (count2 == 4 ) { //連續(xù)4組相同,獲勝 win = order; break ; } } else count2 = 0 ; //未連續(xù)相同,清除相同計數(shù) } //判斷當前下棋位置左上右下各4顆棋子的相同數(shù)量,連續(xù)4組相同則獲勝 if (column+i> 0 && column+i+ 1 < 16 && row+i> 0 && row+i+ 1 < 16 ) { //防止下標越界 if (board[row+i][column+i] == board[row+i+ 1 ][column+i+ 1 ] && board[row+i][column+i] != 0 ) { count3++; if (count3 == 4 ) { //連續(xù)4組相同,獲勝 win = order; break ; } } else count3 = 0 ; //未連續(xù)相同,清除相同計數(shù) } //判斷當前下棋位置左下右上各4顆棋子的相同數(shù)量,連續(xù)4組相同則獲勝 if (column+i> 0 && column+i+ 1 < 16 && row-i- 1 > 0 && row-i< 16 ) { //防止下標越界 if (board[row-i][column+i] == board[row-i- 1 ][column+i+ 1 ] && board[row-i][column+i] != 0 ) { count4++; if (count4 == 4 ) { //連續(xù)4組相同,獲勝 win = order; break ; } } else count4 = 0 ; //未連續(xù)相同,清除相同計數(shù) } } //有人獲勝,輸出棋盤及獲勝者,跳出循環(huán) if (win == 2 ) { //由于win是order的值,order輪到白方,說明黑方獲勝 //輸出棋盤 for ( int i = 0 ;i< 16 ;i++) { for ( int j = 0 ;j< 16 ;j++) { System.out.print(board[i][j]+ "\t" ); } System.out.println(); } System.out.println( "恭喜黑方獲勝,游戲結(jié)束!" ); break ; //跳出循環(huán) } else if (win == 1 ) { //由于win是order的值,order輪到黑方,說明白方獲勝 //輸出棋盤 for ( int i = 0 ;i< 16 ;i++) { for ( int j = 0 ;j< 16 ;j++) { System.out.print(board[i][j]+ "\t" ); } System.out.println(); } System.out.println( "恭喜白方獲勝,游戲結(jié)束!" ); break ; //跳出循環(huán) } //無人獲勝,清除相同棋子計數(shù),開始新循環(huán) count1 = 0 ; count2 = 0 ; count3 = 0 ; count4 = 0 ; full = 1 ; //再次認為棋盤已滿 } } } |
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/qq_35221384/article/details/108347818