本文实例为大家分享了C语言版三子棋游戏的具体代码,供大家参考,具体内容如下
实现一个三子棋小游戏
下面是实现步骤:
总共有需要三个文件
第一,test.c
我们要在这个文件里面实现游戏的主体流程
第二,game.c
在这个文件里我们可以实现各个游戏函数的分装
第三,game.h
在这个文件里我们实现的是各个函数的声明
test.c
1、首先要有一个菜单
让玩家可以做出选择
2、接着对玩家做出的不同选择进行实现
选1就是开始游戏,所以我们进入到game函数里就好了
选0就是退出游戏,
其他选择的话就是选择错误,重新选择
这个我们可以用switch语句来实现
这里我们要先用的是do,while循环,条件里放入我们要输入的数
这样的话如果输入的数为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
|
#include<stdio.h> #include"game.h" void menu() { printf ( "***********\n" ); printf ( "***1play***\n" ); printf ( "***0exit***\n" ); printf ( "***********\n" ); } int main() { menu(); int input = 0; do { printf ( "请选择\n" ); scanf ( "%d" , &input); switch (input) { case 1: game(); break ; case 0: printf ( "退出游戏\n" ); break ; default : printf ( "选择错误,请重新选择\n" ); } } while (input); return 0; } |
3、实现游戏函数的各个功能
我们要做的是三子棋,应该先有一个棋盘
所以我们就可以用二维数组来创建这样一个 3 * 3的棋盘
鉴于以后可能会想要不同行和列的棋盘
所以我们可以定义宏来表示数组的行和列,以后想要修改行数和列数也很方便
创建棋盘之后,我们要将棋盘里的元素进行初始化
接着还要打印出来呈现给玩家
然后就是下棋的过程,因为我们得不断下到一方赢或者棋盘满
所以我们可以用while循环来实现
接着就是
玩家下棋,展示棋盘,判断输赢
电脑下棋,展示棋盘,判断输赢
......
我们可以把以上功能表达出来
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() { char board[ROW][COL]; //宏的定义放在game.h里面 char ret = 0; //我们用ret这个变量去接收判断输赢的函数所返回的值 IntBoard(board, ROW, COL); //这些具体的函数都会分装到game.c上面 DisplayBoard(board, ROW, COL); //创建和展示棋盘之后,就是不断 下棋,展示,判断的过程了 while (1) { PlayerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != 'C' ) //也就是指要么一方赢,要么棋盘满,就应该跳出循环,不再继续下棋了 break ; //这两步的区别就只是第一行而已 ComputerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); ret = IsWin(board, ROW, COL); if (ret != 'C' ) break ; } if (ret == '*' ) printf ( "玩家赢\n" ); else if (ret == '#' ) printf ( "电脑赢\n" ); else printf ( "平局\n" ); } |
game函数放在menu函数后面就好了
game.c
所以我们所需要分装到game.c里的函数有:
初始化棋盘,打印棋盘,玩家下棋,电脑下棋,判断输赢
那么接下来我们就在game.c里实现上述函数的功能
初识化棋盘
我们利用for循环把里面的元素都初始化为空格
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include"game.h" void IntBoard( 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
|
void DisplayBoard( 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" ); //棋盘全都打印好之后打印分割行 } } |
玩家下棋
这里的实现思路是:
1、判断输入的位置有无越界
2、有则提示,没有则判断有无棋子
3、有则提示,没有则将该位置放入元素*
(因为玩家可能要连续输入几次,所以我们要用到while循环)
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) { int x; int y; //玩家要输入的行和列 while (1) { printf ( "请输入坐标\n" ); 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 ( "坐标被占用,请重新输入\n" ); } else printf ( "坐标非法,请重新输入\n" ); } |
电脑下棋
这里的实现思路是:
1、生成随机数(这个数值不能越界)
2、将该位置放入元素#,这里不需要判断,因为本身就不需要输入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
void ComputerMove( char board[ROW][COL], int row, int col) { int x = 0; int y = 0; srand ((unsigned int ) time (NULL)); printf ( "电脑走\n" ); while (1) { x = rand () % row; //生成随机数,这里就需要用到时间戳了,我们还要做test.c里面包含一个<time.h> 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
|
int IsFull( 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; } |
哪一方赢
实现思路:
根据规则,我们要判断是否有三个相同的棋子连成直线
所以,每一行,每一列判断一次,然后对角线再判断两次就好了
使用for循环和if语句来实现
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
|
char IsWin( char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) //先判断行 { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ' ) return board[i][0]; } for (j = 0; j < col; j++) //再判断列 { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board != ' ' ) return board[0][i]; } //接着是两次对角线 if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ' ) return board[1][1]; if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ' ) return board[1][1]; //然后我们再这里直接调用IsFull函数,就不用在game函数里调用了,而且返回值都能统一管理 if (IsFull(board, row, col)) { return 'Q' ; } return 'C' ; } |
到这里我们的game.c文件的任务就完成了
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
|
#define _CRT_SECURE_NO_WARNINGS #pragma once #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 void IntBoard( char board[ROW][COL], int row, int col); void DisplayBoard( char board[ROW][COL], int row, int col); void PlayerMove( char board[ROW][COL], int row, int col); void ComputerMove( char board[ROW][COL], int row, int col); char IsWin( char board[ROW][COL], int row, int col); int IsFull( char board[ROW][COL], int row, int col); |
好了,到了这里我们的三子棋小游戏就完成了!快去试试吧!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/zhengjiatao2002/article/details/119735872