0%

C语言实现三子棋游戏(也实现N子棋)

这是我作为一个初学者第一次尝试搞出来的东西,它不但可以实现三子棋游戏,通过修改#define的定义,还可以实现N子棋游戏。

首先,分析该游戏需要的逻辑

  1. 作为一个游戏,它首先需要有一个用户菜单,让用户选择开始或选择退出游戏,故需使用一个do while循环(需要在程序的一开始就显示菜单,并且在正常游戏流程结束时再次让玩家选择继续或者退出)来显示菜单并接收用户的输入,以此判断玩家是否玩游戏。
  2. 在玩家选择退出游戏是跳出循环,若玩家选择开始游戏,则进入游戏函数(game)。
  3. 作为一个下棋游戏,应该先让其显示棋盘,接着让玩家选择棋子的坐标位置(这里需要一个二维数组),然后电脑方利用头文件stdlib.h头文件、srand以及rand函数来生成一个随机坐标值。
  4. 利用二维数组将对应的坐标位置填入玩家或电脑的棋子,并在每次填入后打印此时的棋盘供玩家观察。
  5. 此时已完成了怎么下棋的问题,我自己在做的时候觉得判断输赢是最难的部分,我利用了四个循环来判断连行、连列、左上至右下以及右上至左下。
  6. 此时游戏基本完成,只需将各个函数按顺序连接起来即可。

以下是代码部分

首先,在头文件中写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
#include<stdlib.h>

#define ROW 3
#define COL 3//修改此处可实现N子棋

void InitBoard(char board[ROW][COL], int row, int col);
void PrintBoard(char board[ROW][COL], int row, int col);
void Player(char board[ROW][COL], int row ,int col);
void Computer(char board[ROW][COL], int row, int col);

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


以上均为函数声明,而游戏程序的主函数我也在以下写出

1
2
3
4
5
6
7
#include "game.h"//头文件名
int main()
{
srand((unsigned int)time(NULL));//随机数种子
menu();
return 0;
}

在上边,利用头文件stdlib.h,srand函数,rand函数生成随机数。
menu函数内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void menu()
{
int input = 0;
do
{
printf("*******************\n");
printf("****** 1.PLAY *****\n");
printf("****** 0.EXIT *****\n");
printf("*******************\n");
scanf("%d", &input);
if (input == 1)
game();
else if (input == 0)
{
printf("退出游戏\n");
break;
}

else
printf("非法输入\n");

} while (1);
}

进行游戏则进入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
void game()
{
char board[ROW][COL] = {0};
char ret = 0;
InitBoard(board, ROW, COL);
PrintBoard(board, ROW, COL);
while (1)
{
Player(board, ROW, COL);
PrintBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
Computer(board , ROW, COL);
PrintBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
}
if (ret == '*')
printf("玩家赢!\n");
else if (ret == '#')
printf("电脑赢!\n");
else if (ret == 'Q')
printf("平局!\n");

}

创建棋盘函数:

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
void PrintBoard(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++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}//打印竖着的 “ | ”
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("___");
if (j < col - 1)
printf("|");
}//打印 "__"
printf("\n");
}
}
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
void Player(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家走\n\n");
while (1)
{
printf("请输入要走的坐标: ");
scanf("%d %d", &x, &y);
if (x <= ROW && y <= COL && x >= 1 && y >= 1)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';//减去一是为了符合逻辑(大部分朋友会认为坐标是从1开始的,实际数组中是从零开始的)
break;
}
else
{
printf("坐标被占用!\n");
}
}//需判断坐标是否存在或被占用
else
printf("坐标非法!\n\n");
}
}

电脑输入Computer函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Computer(char board[ROW][COL], int row, int col)
{
printf("电脑走: \n\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
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
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
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
int Player = 0;
int Computer = 0;
int win = 0;
while (i <= row)//判断行
{
Player = 0;
Computer = 0;
j = 0;
while (j < (col - 1))
{
if (board[i][j] == board[i][j + 1] && board[i][j] == '*')
Player++;
if (board[i][j] == board[i][j + 1] && board[i][j] == '#')
Computer++;
if (Player == (row - 1))
return '*';
else if (Computer == (row - 1))
return '#';
j++;
}
i++;
}
i = 0;
j = 0;
Player = 0;
Computer = 0;
while (j <= row)//判断列
{
Player = 0;
Computer = 0;
i = 0;
while (i < (col - 1))
{
if (board[i][j] == board[i + 1][j] && board[i][j] == '*')
Player++;
if (board[i][j] == board[i + 1][j] && board[i][j] == '#')
Computer++;
if (Player == (row - 1))
return '*';
else if (Computer == (row - 1))
return '#';
i++;
}
j++;
}
Player = 0;
Computer = 0;
/*i = 0;
j = 0;*/
for (i = 0; i < row; i++)//斜左上至右下
{
if (board[i][i] == board[i + 1][i + 1] && board[i][i] == '*')
Player++;
if (board[i][i] == board[i + 1][i + 1] && board[i][i] == '#')
Computer++;
if (Player == (row - 1))
return '*';
else if (Computer == (row - 1))
return '#';
}
Player = 0;
Computer = 0;
for (i = 0, j = (col - 1); i < row, j > 0 ; i++ , j--)//斜右上至左下
{
if (board[i][j] == board[i + 1][j - 1] && board[i][j] == '*')
Player++;
if (board[i][j] == board[i + 1][j - 1] && board[i][j] == '#')
Computer++;
if (Player == (row - 1))
return '*';
else if (Computer == (row - 1))
return '#';
}


for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
win++;
}
}
if (win == 0)
return 'Q';
return 'C';
}

至此程序已经基本完成,只需将各个函数有机的组合在一起即可,假如你想实现更多子棋,仅需将#define定义的行数列数修改即可。

这里贴上工程文件

github 链接.

-------------本文结束感谢您的阅读-------------