使用C语言实现简单的三子棋程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现。
game.h //包含函数的声明,宏定义
test.c //包含主函数,函数调用
game.c //包含函数的定义
整体思路
1.要完成一个简单的三子棋程序,首先需要创建一个二维数组,并完成数组初始化。
1
2
3
4
5
6
|
//使用宏定义定义常量,方便之后对数组的使用 #define ROW 3 //行 #define COL 3 //列 char arr[ROW][COL] = { 0 }; Arr_init(arr, ROW, COL); //数组初始化 |
2.完成数组的初始化后,我们需要将三子棋所需要的棋盘打印出来。
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 Print_che( char arr[ROW][COL], int row, int col) //打印棋盘 { int i, j; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf ( " %c " , arr[i][j]); if (j < col - 1) printf ( "|" ); } printf ( "\n" ); for (j = 0; j < col ; j++) { if (i < row - 1) printf ( "___" ); else printf ( " " ); if (j < col - 1) printf ( "|" ); } printf ( "\n" ); } } |
3.打印完棋盘后,我们就要开始下棋了,为了增加游戏的难度,我们让电脑先走,电脑走的字符为'0'。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
void Computer_walk( char arr[ROW][COL], int row, int col) //电脑走 { int x, y; printf ( "请电脑输入坐标\n" ); while (1) { x = rand () % row; //生成随机数 y = rand () % col; if (arr[x][y] == ' ' ) //判断坐标正确性 { arr[x][y] = '0' ; break ; } } } |
4.电脑走完后,轮到玩家走,玩家走的字符为'X'。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
void Player_go( char arr[ROW][COL], int row, int col) //玩家走 { int x, y; printf ( "请玩家输入坐标:" ); while (1) { scanf ( "%d %d" , &x, &y); if ((x > 0 && x <= row + 1) && (y > 0 && y <= col + 1)) //判断坐标正确性 { if (arr[x - 1][y - 1] == ' ' ) { arr[x - 1][y - 1] = 'X' ; break ; } else printf ( "输入错误,请重新输入:" ); } else printf ( "输入错误,请重新输入:" ); } } |
5.电脑和玩家每走一次,都需要判断一次输赢。
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
|
char Judge_win( char arr[ROW][COL], int row, int col) //判断输赢 { int i, j; int count = 0; for (i = 0; i < row; i++) { if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ' ) //行相等 return arr[i][1]; if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ' ) //列相等 return arr[1][i]; if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ' ) //正斜相等 return arr[1][1]; if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ' ) //反斜相等 return arr[1][1]; } for (i = 0; i < row; i++) //平局 { for (j = 0; j < col; j++) { if (arr[i][j] == 'X' || arr[i][j] == '0' ) //遍历数组,查看是否还有没有走的地方 { count++; if (count == 9) return 'Q' ; } } } return 'A' ; } |
确定大致思路后,我们完成程序的流程部分,放入我们所创建的文件中。
代码如下:
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
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
|
#ifndef _GAME_H__ #define _GAME_H__ #include <stdio.h> #include <windows.h> #include <stdlib.h> #include <time.h> #define ROW 3 //行 #define COL 3 //列 void Arr_init( char arr[ROW][COL], int row, int col); //数组初始化 void Print_che( char arr[ROW][COL], int row, int col); //打印棋盘 void Player_go( char arr[ROW][COL], int row, int col); //玩家走 void Computer_walk( char arr[ROW][COL], int row, int col); //电脑走 char Judge_win( char arr[ROW][COL], int row, int col); //判断输赢 #endif // GAME_H__ test.c //包含主函数,函数调用 #define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void menu() //菜单函数 { printf ( "********************\n" ); printf ( "**** 1.play ****\n" ); printf ( "**** 0.exit ****\n" ); printf ( "********************\n" ); } void game() //游戏函数 { char arr[ROW][COL] = { 0 }; Arr_init(arr, ROW, COL); //数组初始化 Print_che(arr, ROW, COL); //打印棋盘 while (1) { char n; Computer_walk(arr, ROW, COL); //电脑走 Print_che(arr, ROW, COL); n = Judge_win(arr, ROW, COL); //判断输赢 if (n == 'X' ) //根据判断输赢函数所返回的值做出不同的选择 { printf ( "玩家赢\n" ); break ; } else if (n == '0' ) { printf ( "电脑赢\n" ); break ; } else if (n == 'Q' ) { printf ( "平局\n" ); break ; } else printf ( "----------------\n" ); Player_go(arr, ROW, COL); //玩家走 Print_che(arr, ROW, COL); n = Judge_win(arr, ROW, COL); //判断输赢 if (n == 'X' ) { printf ( "玩家赢\n" ); break ; } else if (n == '0' ) { printf ( "电脑赢\n" ); break ; } else if (n == 'Q' ) printf ( "平局\n" ); else printf ( "------------------\n" ); } } void test() //游戏流程函数 { int input = 0; srand ((unsigned) time (NULL)); do { menu(); printf ( "请输入选择:" ); scanf ( "%d" , &input); switch (input) { case 1: game(); break ; case 0: break ; default : printf ( "输入错误,请重新输入。\n" ); } } while (input); } int main() { test(); system ( "pause" ); return 0; } |
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
|
#include "game.h" void Arr_init( char arr[ROW][COL], int row, int col) //数组初始化 { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) arr[i][j] = ' ' ; } } void Print_che( char arr[ROW][COL], int row, int col) //打印棋盘 { int i, j; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf ( " %c " , arr[i][j]); if (j < col - 1) printf ( "|" ); } printf ( "\n" ); for (j = 0; j < col ; j++) { if (i < row - 1) printf ( "___" ); else printf ( " " ); if (j < col - 1) printf ( "|" ); } printf ( "\n" ); } } void Player_go( char arr[ROW][COL], int row, int col) //玩家走 { int x, y; printf ( "请玩家输入坐标:" ); while (1) { scanf ( "%d %d" , &x, &y); if ((x > 0 && x <= row + 1) && (y > 0 && y <= col + 1)) //判断坐标正确性 { if (arr[x - 1][y - 1] == ' ' ) { arr[x - 1][y - 1] = 'X' ; break ; } else printf ( "输入错误,请重新输入:" ); } else printf ( "输入错误,请重新输入:" ); } } void Computer_walk( char arr[ROW][COL], int row, int col) //电脑走 { int x, y; printf ( "请电脑输入坐标\n" ); while (1) { x = rand () % row; //生成随机数 y = rand () % col; if (arr[x][y] == ' ' ) //判断坐标正确性 { arr[x][y] = '0' ; break ; } } } char Judge_win( char arr[ROW][COL], int row, int col) //判断输赢 { int i, j; int count = 0; for (i = 0; i < row; i++) { if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ' ) //行相等 return arr[i][1]; if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ' ) //列相等 return arr[1][i]; if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ' ) //正斜相等 return arr[1][1]; if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ' ) //反斜相等 return arr[1][1]; } for (i = 0; i < row; i++) //平局 { for (j = 0; j < col; j++) { if (arr[i][j] == 'X' || arr[i][j] == '0' ) //遍历数组,查看是否还有没有走的地方 { count++; if (count == 9) return 'Q' ; } } } return 'A' ; } |
到这里,我们的程序已经完成了,我们看看程序的效果
以上就是一个简单的三子棋程序,多有不足之处,还望指教。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/lw13572259173/article/details/79833532