我是靠谱客的博主 潇洒绿草,这篇文章主要介绍C语言实现简单三子棋小游戏,现在分享给大家,希望可以做个参考。

三子棋介绍

三子棋,民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。如果两个人都掌握了技巧,那么一般来说就是平棋。一般来说,下在中间最有利,下在角上次之,下在边上再次之。最大的好处就是随便找个地方就可以玩这个简单而有趣的游戏了。

描述

使用C语言来编写一个简单的三子棋游戏

基本流程

1、显示菜单

复制代码
1
2
3
4
5
6
7
void Menu() { printf("*******************************n"); printf("**********0、exit**************n"); printf("**********1、play**************n"); printf("*******************************n"); }

输入“0”退出游戏,输入“1”开始游戏。在这里我们先简单定义一下Game()函数(后面会进行详细的定义与声明),在调用Menu()函数时,我们需要用到do……(while)循环以及switch循环,代码如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main() { int input = 0; do { Menu(); printf("输入你的选择:n"); scanf("%d", &input); switch (input) { case 1: Game(); break; case 0: printf("退出游戏n"); break; default: break; } } while (input != 0); return 0; }

2、棋盘初始化

三子棋棋盘分三行三列,我们首先需要定义两个变量来确定我们的行和列,使用#define来固定我们的行和列有一个好处,如果之后我们需要进行五子棋或其他游戏的表格打印时,我们可以直接在此修改,比较方便。

复制代码
1
2
3
#define ROW 3 #define COL 3 char board[ROW][COL]={0};//定义数组

我们需要将棋盘所在位置所有元素改为空格,方便我们打印棋盘。有以下两种方式:

(1)使用for循环进行遍历

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

(2)使用memeset()(需要引用头文件<string.h>)

复制代码
1
2
3
4
void Initboard(char board[ROW][COL], int row, int col) { memset(board, ' ', row*col*sizeof(char)); }

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
void Showboard(char board[ROW][COL], int row, int col) { printf("======================n");//上分割线 for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf(" %c ", board[i][j]);//三个空格 if (j < col - 1)//只有两列竖线 { printf("|"); } } printf("n"); if (i < row - 1)//横线只有两行 { for (int j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } printf("n"); } } printf("======================n");//下分割线 }

4、玩家落子

在玩家输入坐标后,我们需要先判断输入的坐标是否合法,其次该位置是否为空。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void Playermove(char board[ROW][COL], int row, int col) { while (1) { printf("请输入坐标:n"); int x = 0; int y = 0; scanf("%d%d", &x, &y); if (x >= 1 && x <= 3 && y >= 1 && y <= 3) { if (board[x - 1][y - 1] = ' ') { board[x - 1][y - 1] = 'X'; break; } else printf("该位置已有棋子n"); } else { printf("坐标错误n"); } } }

5、电脑落子

电脑落子需要产生随机坐标,可使用rand函数,在使用rand函数时,需要调用头文件<stdlib.h>,同时为了保证坐标的随机性,需要引用以下语句:srand((unsigned)time(NULL))

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
void Computermove(char board[ROW][COL], int row, int col) { while (1) { int x = rand() % row;//[0,1,2] int y = rand() % col; if (board[x][y] == ' ') { board[x][y] = 'O'; break; } } }

6、判断是否和棋

判断和棋可以直接写为静态函数(static),因为当前函数只为判断胜负的函数(Iswin)提供帮助。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
static int Isfull(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (board[i][j] == ' ') return -1;//没有放满 } } return 1;//平局 }

7、判断胜负关系

在该函数中,我们需要调用判断平局的函数(Isfull)如下,胜负关系可以通过返回值来判断,返回'X'时,玩家赢;返回‘O'时,电脑赢;返回‘Q'时,平局。

复制代码
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
char Iswin(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') { return board[i][1]; } } for (int j = 0; j < col; j++) { if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ') { return board[0][j]; } } if (board[1][1] == board[2][2] && board[0][0] == board[1][1] && board[0][0] != ' ') { return board[0][0]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') { return board[1][1]; } if (Isfull(board, row, col) == 1) { return 'Q'; } return ' '; }

8、Game()函数

复制代码
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
void Game() { printf("游戏开始:n"); char board[ROW][COL] = { 0 }; Initboard(board, ROW, COL); Showboard(board, ROW, COL); char ret; while (1) { Playermove(board, ROW, COL); ret = Iswin(board, ROW, COL); if (ret != ' ') { break; } Showboard(board, ROW, COL); Computermove(board, ROW, COL); ret = Iswin(board, ROW, COL); if (ret != ' ') { break; } Showboard(board, ROW, COL); } if (ret == 'O') printf("电脑赢n"); else if (ret == 'X') printf("玩家赢n"); else if (ret == 'Q') printf("平局n"); }

Game()函数中,我们需要先初始化棋盘,再循环调用玩家落子(Playermove)、电脑落子(Computermove)、打印棋盘(Showboard)函数来确保游戏能够正常进行下去。

9、主函数

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main() { srand((unsigned)time(NULL)); int input = 0; do { Menu(); printf("输入你的选择:n"); scanf("%d", &input); switch (input) { case 1: Game(); break; case 0: printf("退出游戏n"); break; default: break; } } while (input != 0); return 0; }

总代码如下:

复制代码
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
#define _CRT_SECURE_NO_WARNINGS 1 #define ROW 3 #define COL 3 #include<stdio.h> #include<stdlib.h> void Menu() { printf("*******************************n"); printf("**********0、exit**************n"); printf("**********1、play**************n"); printf("*******************************n"); } void Initboard(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { board[i][j] = ' '; } } } void Showboard(char board[ROW][COL], int row, int col) { printf("======================n"); for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf(" %c ", board[i][j]);//三个空格 if (j < col - 1)//只有两列竖线 { printf("|"); } } printf("n"); if (i < row - 1)//横线只有两行 { for (int j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } printf("n"); } } printf("======================n"); } void Playermove(char board[ROW][COL], int row, int col) { while (1) { printf("请输入坐标:n"); int x = 0; int y = 0; scanf("%d%d", &x, &y); if (x >= 1 && x <= 3 && y >= 1 && y <= 3) { if (board[x - 1][y - 1] = ' ') { board[x - 1][y - 1] = 'X'; break; } else printf("该位置已有棋子n"); } else { printf("坐标错误n"); } } } void Computermove(char board[ROW][COL], int row, int col) { while (1) { int x = rand() % row;//[0,1,2] int y = rand() % col; if (board[x][y] == ' ') { board[x][y] = 'O'; break; } } } static int Isfull(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (board[i][j] == ' ') return -1;//没有放满 } } return 1;//平局 } char Iswin(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ') { return board[i][1]; } } for (int j = 0; j < col; j++) { if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ') { return board[0][j]; } } if (board[1][1] == board[2][2] && board[0][0] == board[1][1] && board[0][0] != ' ') { return board[0][0]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') { return board[1][1]; } if (Isfull(board, row, col) == 1) { return 'Q'; } return ' '; } void Game() { printf("游戏开始:n"); char board[ROW][COL] = { 0 }; Initboard(board, ROW, COL); Showboard(board, ROW, COL); char ret; while (1) { Playermove(board, ROW, COL); ret = Iswin(board, ROW, COL); if (ret != ' ') { break; } Showboard(board, ROW, COL); Computermove(board, ROW, COL); ret = Iswin(board, ROW, COL); if (ret != ' ') { break; } Showboard(board, ROW, COL); } if (ret == 'O') printf("电脑赢n"); else if (ret == 'X') printf("玩家赢n"); else if (ret == 'Q') printf("平局n"); } int main() { srand((unsigned)time(NULL)); int input = 0; do { Menu(); printf("输入你的选择:n"); scanf("%d", &input); switch (input) { case 1: Game(); break; case 0: printf("退出游戏n"); break; default: break; } } while (input != 0); return 0; }

文章到此就结束了,希望本篇文章能够对大家有所帮助。若发现不足及错误的地方,欢迎大家批评指正!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持靠谱客。

最后

以上就是潇洒绿草最近收集整理的关于C语言实现简单三子棋小游戏的全部内容,更多相关C语言实现简单三子棋小游戏内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(110)

评论列表共有 0 条评论

立即
投稿
返回
顶部