C语言实现三子棋(井字棋)小游戏

 

 目录

 我写这个小游戏创建了三个文件就像这样:

test.c的全部内容如下:

初始化棋盘:

展示棋盘:

玩家下棋:

 电脑下棋:

判断输赢还是平局:

game.c的全部内容如下:

最终运行结果

 系统头文件用<>比如 : #include<stdio.h>

自己写的头文件用""比如 : #include"game.h"

 我建议写的代码量大的话可以自己创建一个头文件里面包含着系统头文件以及自定义的函数。

每段代码的意思我将会在代码段里面解释

 我写这个小游戏创建了三个文件就像这样:

 game.h内容如下:

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
#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<Windows.h>
//自定义棋盘大小
#define ROW 3
#define COL 3

//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);

//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);

//玩家下棋
void player_move(char board[ROW][COL], int row, int col);

//电脑下棋
void computer_move(char board[ROW][COL], int row, int col);

//判断输赢的代码
//玩家赢 - '*'
//电脑赢 - '#'
//平局 --- 'Q'
//继续 ----'C'

char is_win(char board[ROW][COL], int row, int col);

 本人建议之后写代码如果涉及到坐标的大小建议传ROW COL

因为这样如果想要改棋盘大小直接在宏定义那一部分改大小,这样比较方便。

比如:将3*3的棋盘改为5*5:

1
2
#define ROW 3->#define ROW 5
#define COL 3 ->#define COL 5

test.c的全部内容如下:

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
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("\t\t\t\t***三子棋***\t\t\t\t\n");
printf("\t\t\t\t************\t\t\t\t\n");
printf("\t\t\t\t* 1.play *\t\t\t\t\n");
printf("\t\t\t\t* 0.exit *\t\t\t\t\n");
printf("\t\t\t\t************\t\t\t\t\n");
}
void game()
{
//数据存储到一个字符的二维数组中,玩家下棋是'*',电脑下棋是'#'
char board[ROW][COL] = { 0 };//数组的初始内容应该是全部空格
InitBoard(board, ROW, COL);//初始化棋牌
//打印棋盘
DisplayBoard(board, ROW, COL);
//下棋
char ret = 0;
while (1)
{
player_move(board, ROW, COL);
Sleep(1000);
DisplayBoard(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
computer_move(board, ROW, COL);
Sleep(1000);
DisplayBoard(board,ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("\t\t\t\t恭喜你赢了!\t\t\t\t\n");
}
else if (ret == '#')
{
printf("\t\t\t\t很可惜你输了\t\t\t\t\n");
}
else
{
printf("平局\n");
}
}
void test()
{
int input = 0;
do
{
menu();
printf("\t\t\t\t请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("\t\t\t\t退出游戏");
break;
default:
printf("\t\t\t\t选择错误");
break;
}
} while (input);

}
int main(void)
{
test();
return 0;
}

 

初始化棋盘:

                因为刚开始还没有输入字符,所以将内容初始化为空格。

1
2
3
4
5
6
7
8
9
10
11
12
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
board[i][j] =' ';
}
}
}

展示棋盘:

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

void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
printf("\t\t\t\t");
for (j = 0; j < col; j++)
{

printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");//分割列
}
}
printf("\n");
if (i < row - 1)
{
printf("\t\t\t\t");
for (j = 0; j < col; j++)
{
printf("---");//分割行
if (j < col - 1)
{
printf("|");//分割列
}
}
}
printf("\n");//换行
}
}


初始化棋盘和展示棋盘:

        

玩家下棋:

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
void player_move(char board[ROW][COL], int row, int col)
{
printf("\t\t\t\t该你操作了->\n");
printf("\t\t\t\t请输入坐标->\n");
printf("\t\t\t\ttip:坐标1-3,用空格分开:");
int x = 0;
int y = 0;
while (1)
{
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (' ' == board[x-1][y-1])
{
board[x-1][y-1] = '*';
break;
}
else
{
printf("\t\t\t\t该坐标已被占用请重新输入:\n");
printf("\t\t\t\t");
}
}
else
{
printf("\t\t\t\t该坐标非法啦\n");
printf("\t\t\t\t请重新输入\n");
}
}
}

 电脑下棋:

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
void computer_move(char board[ROW][COL], int row, int col)
{
printf("\t\t\t\t该电脑了->\n");
printf("\t\t\t\t你要完蛋了\n");
while (1)
{
int i = 0;
int flag = 0;
for (i = 0; i < row; i++)//判断行
{
if (board[i][0] == '*' && board[i][1] == '*'&& board[i][2]==' ')
{
board[i][2]='#';
flag = 1;
break;
}
if (board[i][0] == '*' && board[i][2] == '*' && board[i][1] == ' ')
{
board[i][1] = '#';
flag = 1;
break;
}
}
if (1 == flag)
break;
for (i = 0; i < row; i++)//判断列
{
if (board[0][i] == '*' && board[1][i] == '*'&& board[2][i] == ' ')
{
board[2][i]='#';
flag = 2;
break;
}
if (board[0][i] == '*' && board[2][i] == '*' && board[1][i] == ' ')
{
board[1][i] = '#';
flag = 2;
break;
}
}
if(2==flag)
break;
if (board[0][0] == '* ' && board[1][1] == '* ' && board[2][2] == ' ')//判断对角线
{
board[2][2]='#';
break;
}
if (board[2][0] == '* ' && board[1][1] == '* ' && board[0][2] == ' ')
{
board[0][2]='#';
break;
}

if (' ' == board[2][2])
{
board[2][2] = '#';
break;
}
if (' ' == board[0][0])
{
board[0][0] = '#';
break;
}
if (' ' == board[0][2])
{
board[0][2] = '#';
break;
}
if (' ' == board[2][1])
{
board[2][1] = '#';
break;
}
if (' ' == board[2][0])
{
board[2][0] = '#';
break;
}
if (' ' == board[1][1])
{
board[1][1] = '#';
break;
}
if (' ' == board[0][1])
{
board[0][1] = '#';
break;
}
if (' ' == board[1][0])
{
board[1][0] = '#';
break;
}
if (' ' == board[1][2])
{
board[1][2] = '#';
break;
}
}

}

判断输赢还是平局:

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
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (' ' == board[i][j])
{
return 0;
}
}
}
return 1;
}
char is_win(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)//判断行
{
if (board[i][0]==board[i][1]&&board[i][1]==board[i][2]&&board[i][1]!=' ')
{
return board[i][1];
}

}
for (i = 0; i < row; i++)//判断列
{
if (board[0][i]==board[1][i]&&board[1][i]==board[2][i]&&board[1][i]!=' ')
{
return board[1][i];
}

}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')//判断对角线
{
return board[1][1];
}
if (board[2][0] == board[1][1] && board[1][1] == board[1][2] && board[1][1] != ' ')
{
return board[1][1];
}
//判断平局
if (1 == is_full(board, row, col))
{
return 'Q';
}
//继续
return 'C';
}


 

game.c的全部内容如下:

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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
board[i][j] =' ';
}
}
}
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
printf("\t\t\t\t");
for (j = 0; j < col; j++)
{

printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
printf("\t\t\t\t");
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}

void player_move(char board[ROW][COL], int row, int col)
{
printf("\t\t\t\t该你操作了->\n");
printf("\t\t\t\t请输入坐标->\n");
printf("\t\t\t\ttip:坐标1-3,用空格分开:");
int x = 0;
int y = 0;
while (1)
{
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (' ' == board[x-1][y-1])
{
board[x-1][y-1] = '*';
break;
}
else
{
printf("\t\t\t\t该坐标已被占用请重新输入:\n");
}
}
else
{
printf("\t\t\t\t该坐标非法啦\n");
printf("\t\t\t\t请重新输入\n");
}
}
}
void computer_move(char board[ROW][COL], int row, int col)
{
printf("\t\t\t\t该电脑了->\n");
printf("\t\t\t\t你要完蛋了\n");
while (1)
{
int i = 0;
int flag = 0;
for (i = 0; i < row; i++)//判断行
{
if (board[i][0] == '*' && board[i][1] == '*'&& board[i][2]==' ')
{
board[i][2]='#';
flag = 1;
break;
}
if (board[i][0] == '*' && board[i][2] == '*' && board[i][1] == ' ')
{
board[i][1] = '#';
flag = 1;
break;
}
}
if (1 == flag)
break;
for (i = 0; i < row; i++)//判断列
{
if (board[0][i] == '*' && board[1][i] == '*'&& board[2][i] == ' ')
{
board[2][i]='#';
flag = 2;
break;
}
if (board[0][i] == '*' && board[2][i] == '*' && board[1][i] == ' ')
{
board[1][i] = '#';
flag = 2;
break;
}
}
if(2==flag)
break;
if (board[0][0] == '* ' && board[1][1] == '* ' && board[2][2] == ' ')//判断对角线
{
board[2][2]='#';
break;
}
if (board[2][0] == '* ' && board[1][1] == '* ' && board[0][2] == ' ')
{
board[0][2]='#';
break;
}

if (' ' == board[2][2])
{
board[2][2] = '#';
break;
}
if (' ' == board[0][0])
{
board[0][0] = '#';
break;
}
if (' ' == board[0][2])
{
board[0][2] = '#';
break;
}
if (' ' == board[2][1])
{
board[2][1] = '#';
break;
}
if (' ' == board[2][0])
{
board[2][0] = '#';
break;
}
if (' ' == board[1][1])
{
board[1][1] = '#';
break;
}
if (' ' == board[0][1])
{
board[0][1] = '#';
break;
}
if (' ' == board[1][0])
{
board[1][0] = '#';
break;
}
if (' ' == board[1][2])
{
board[1][2] = '#';
break;
}
}

}
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (' ' == board[i][j])
{
return 0;
}
}
}
return 1;
}
char is_win(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)//判断行
{
if (board[i][0]==board[i][1]&&board[i][1]==board[i][2]&&board[i][1]!=' ')
{
return board[i][1];
}

}
for (i = 0; i < row; i++)//判断列
{
if (board[0][i]==board[1][i]&&board[1][i]==board[2][i]&&board[1][i]!=' ')
{
return board[1][i];
}

}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')//判断对角线
{
return board[1][1];
}
if (board[2][0] == board[1][1] && board[1][1] == board[1][2] && board[1][1] != ' ')
{
return board[1][1];
}
//判断平局
if (1 == is_full(board, row, col))
{
return 'Q';
}
//继续
return 'C';
}

最终运行结果


C语言实现三子棋(井字棋)小游戏
https://6jackjiang.github.io/2021/11/08/categories/C语言/C语言实现三子棋(井字棋)小游戏/
作者
米兰的小铁匠
发布于
2021年11月8日
许可协议