使用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