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