- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C语言实现三子棋的步骤和代码详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
用c语言实现三子棋.
在写三子棋的代码之前,我们来看看实现这个游戏的逻辑:
1.菜单界面选择开始或者退出游戏。 2.创建棋盘并初始化。 3.打印棋盘。 4.玩家落子(玩家输入行列坐标的方式来落子),'x'表示玩家落子。 5.判定胜负关系(输,赢,和棋),'q'表示和棋。 6.电脑落子(随机位置落子) ,'o'表示电脑落子。 7.判定胜负关系。 8.回到 步骤2 继续执行.
1.开始游戏 0.退出游戏 。
1
2
3
4
5
6
7
8
9
10
|
int
menu(){
printf
(
"--------------------------\n"
);
printf
(
"--------1.开始游戏--------\n"
);
printf
(
"--------0.退出游戏--------\n"
);
printf
(
"--------------------------\n"
);
int
choice = 0;
printf
(
"请输入你的选择:"
);
scanf
(
"%d"
, &choice);
return
choice;
}
|
棋盘:使用3行3列的二维数组来表示,元素类型是char。 使用宏定义的原因: 1.推高代码可读性,后续代码中遇到3,方便理解含义。 2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便.
1
2
3
|
#define max_row 3
#define max_col 3
char
chessboard[max_row][max_col] = { 0 };
|
' '表示棋盘上的空白区域 。
1
2
3
4
5
6
7
|
void
init(
char
chessboard[max_row][max_col]){
for
(
int
row = 0; row < max_row; row++){
for
(
int
col = 0; col < max_col; col++){
chessboard[row][col] =
' '
;
}
}
}
|
(1)简陋方法:
1
2
3
4
5
6
7
8
|
void
print_chessboard(
char
chessboard[max_row][max_col]){
for
(
int
row = 0; row <max_row; row++){
for
(
int
col = 0; col < max_col; col++){
printf
(
"%c"
,chessboard[row][col]) ;
}
printf
(
"\n"
);
}
}
|
结果:
注意: 这里不是棋盘没打印出来,而是我们使用' '表示空白区域,所以我们看到的棋盘是一片黑色。 这样看的不是很清楚,所以我们选用更加美观的方法打印.
(2)美观方法:
1
2
3
4
5
6
7
8
|
void
print_chessboard(
char
chessboard[max_row][max_col]){
printf
(
"+---+---+---+\n"
);
for
(
int
row = 0; row <max_row; row++) {
printf
(
"| %c | %c | %c |\n"
, chessboard[row][0],
chessboard[row][1], chessboard[row][2]);
printf
(
"+---+---+---+\n"
);
}
}
|
结果
玩家输入行列坐标表示落子,使用'x'表示玩家落子.
注意: 1.玩家落子需要在棋盘范围内。 2.玩家要在棋盘上空的地方落子。 3.如果输入的坐标不满足要重新输入.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
void
playermove(
char
chessboard[max_row][max_col]){
while
(1){
int
row = 0;
int
col = 0;
printf
(
"请输入坐标(row col):"
);
scanf
(
"%d %d"
, &row, &col);
if
(row < 0 || row >= max_row || col < 0 || col >= max_col){
printf
(
"您的坐标不在合法范围内 [0, 2],请重新输入:\n"
);
continue
;
}
if
(chessboard[row][col] !=
' '
){
printf
(
"您的坐标位置已经有子了!\n"
);
continue
;
}
chessboard[row][col] =
'x'
;
break
;
}
}
|
电脑随机产生行列坐标,'o'表示电脑落子.
注意: 1.要在主函数中使用srand((unsigned int)time(0)) 将时间作为随机数种子,确保得到的行列坐标是真随机。 2.要在棋盘上空的地方下棋.
1
2
3
4
5
6
7
8
9
10
11
|
void
computermove(
char
chessboard[max_row][max_col]){
while
(1){
int
row =
rand
() % max_row;
int
col =
rand
() % max_col;
if
(chessboard[row][col] !=
' '
) {
continue
;
}
chessboard[row][col] =
'o'
;
break
;
}
}
|
此处约定返回结果的含义: (1)‘x' 表示玩家获胜 (2)‘o' 表示电脑获胜 (3)' ' 表示胜负未分 (4) ‘q' 表示和棋 。
1.判定是否和棋 (1)调用isfull函数。 (2)如果数组中有元素为' ‘,那么没满,返回0。如果全不为' ',满了,返回1。 (3)如果棋盘满了未分出胜负,和棋。 2.判定电脑玩家胜利 (1)判定所有的行 (2)判定所有的列 (3)判定两条对角线 。
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
|
int
isfull(
char
chessboard[max_row][max_col]){
for
(
int
row = 0; row < max_row; row++){
for
(
int
col = 0; col < max_col; col++){
if
(chessboard[row][col] ==
' '
){
return
0;
}
}
}
return
1;
}
char
iswin(
char
chessboard[max_row][max_col]){
for
(
int
row = 0; row < max_row; row++) {
if
(chessboard[row][0] !=
' '
&& chessboard[row][0] == chessboard[row][1]
&& chessboard[row][0] == chessboard[row][2]) {
return
chessboard[row][0];
}
}
for
(
int
col = 0; col < max_col; col++) {
if
(chessboard[0][col] !=
' '
&& chessboard[0][col] == chessboard[1][col]
&& chessboard[0][col] == chessboard[2][col]) {
return
chessboard[0][col];
}
}
if
(chessboard[0][0] !=
' '
&& chessboard[0][0] == chessboard[1][1]
&& chessboard[0][0] == chessboard[2][2]) {
return
chessboard[0][0];
}
if
(chessboard[2][0] !=
' '
&& chessboard[2][0] == chessboard[1][1]
&& chessboard[2][0] == chessboard[0][2]) {
return
chessboard[2][0];
}
if
(isfull(chessboard)) {
return
'q'
;
}
return
' '
;
}
|
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
|
#define _crt_secure_no_warnings
#define max_row 3
#define max_col 3
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void
init(
char
chessboard[max_row][max_col]){
for
(
int
row = 0; row < max_row; row++){
for
(
int
col = 0; col < max_col; col++){
chessboard[row][col] =
' '
;
}
}
}
void
print_chessboard(
char
chessboard[max_row][max_col]){
printf
(
"+---+---+---+\n"
);
for
(
int
row = 0; row <max_row; row++) {
printf
(
"| %c | %c | %c |\n"
, chessboard[row][0],
chessboard[row][1], chessboard[row][2]);
printf
(
"+---+---+---+\n"
);
}
}
void
playermove(
char
chessboard[max_row][max_col]){
while
(1){
int
row = 0;
int
col = 0;
printf
(
"请输入坐标(row col):"
);
scanf
(
"%d %d"
, &row, &col);
if
(row < 0 || row >= max_row || col < 0 || col >= max_col){
printf
(
"您的坐标不在合法范围内 [0, 2],请重新输入:\n"
);
continue
;
}
if
(chessboard[row][col] !=
' '
){
printf
(
"您的坐标位置已经有子了!\n"
);
continue
;
}
chessboard[row][col] =
'x'
;
break
;
}
}
void
computermove(
char
chessboard[max_row][max_col]){
while
(1){
int
row =
rand
() % max_row;
int
col =
rand
() % max_col;
if
(chessboard[row][col] !=
' '
) {
continue
;
}
chessboard[row][col] =
'o'
;
break
;
}
}
int
isfull(
char
chessboard[max_row][max_col]){
for
(
int
row = 0; row < max_row; row++){
for
(
int
col = 0; col < max_col; col++){
if
(chessboard[row][col] ==
' '
){
return
0;
}
}
}
return
1;
}
char
iswin(
char
chessboard[max_row][max_col]){
for
(
int
row = 0; row < max_row; row++) {
if
(chessboard[row][0] !=
' '
&& chessboard[row][0] == chessboard[row][1]
&& chessboard[row][0] == chessboard[row][2]) {
return
chessboard[row][0];
}
}
for
(
int
col = 0; col < max_col; col++) {
if
(chessboard[0][col] !=
' '
&& chessboard[0][col] == chessboard[1][col]
&& chessboard[0][col] == chessboard[2][col]) {
return
chessboard[0][col];
}
}
if
(chessboard[0][0] !=
' '
&& chessboard[0][0] == chessboard[1][1]
&& chessboard[0][0] == chessboard[2][2]) {
return
chessboard[0][0];
}
if
(chessboard[2][0] !=
' '
&& chessboard[2][0] == chessboard[1][1]
&& chessboard[2][0] == chessboard[0][2]) {
return
chessboard[2][0];
}
if
(isfull(chessboard)) {
return
'q'
;
}
return
' '
;
}
void
game(){
char
chessboard[max_row][max_col] = { 0 };
init(chessboard);
char
winner =
' '
;
while
(1){
system
(
"cls"
);
print_chessboard(chessboard);
playermove(chessboard);
winner = iswin(chessboard);
if
(winner !=
' '
) {
break
;
}
computermove(chessboard);
winner = iswin(chessboard);
if
(winner !=
' '
) {
break
;
}
}
print_chessboard(chessboard);
if
(winner ==
'x'
) {
printf
(
"恭喜您, 您赢了!\n"
);
}
else
if
(winner ==
'o'
) {
printf
(
"哈哈,您连人工智障都下不过!\n"
);
}
else
{
printf
(
"您只能和人工智障打平手!!\n"
);
}
}
int
menu(){
printf
(
"--------------------------\n"
);
printf
(
"--------1.开始游戏--------\n"
);
printf
(
"--------0.退出游戏--------\n"
);
printf
(
"--------------------------\n"
);
int
choice = 0;
printf
(
"请输入你的选择:"
);
scanf
(
"%d"
, &choice);
return
choice;
}
int
main()
{
srand
((unsigned
int
)
time
(0));
while
(1){
int
choice = menu();
if
(choice == 1){
game();
}
else
if
(choice == 0){
printf
(
"退出游戏,goodbye!!!!!\n"
);
break
;
}
else
{
printf
(
"输入错误!请重新输入!\n"
);
continue
;
}
}
system
(
"pause"
);
return
0;
}
|
修改: 97行 增加system("cls");清屏后让界面更简洁.
到此这篇关于c语言实现三子棋的步骤和代码详解的文章就介绍到这了,更多相关c语言实现三子棋内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/qq_34270874/article/details/109418559 。
最后此篇关于C语言实现三子棋的步骤和代码详解的文章就讲到这里了,如果你想了解更多关于C语言实现三子棋的步骤和代码详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!