一、游戏框架
可以使用3个文件分开编写
第一个test.c测试游戏逻辑的文件——基本结构
第二个game.h关于游戏相关的函数声明,符号声明,头文件的包含——定义
第三个game.c游戏相关的函数的实现——每一个函数模块的内部逻辑的编写
二、程序
首先来看test.c文件
菜单界面打印出来提供给玩家选择是否加入游戏
这里引用的game.h是可以将game.h里的定义引用到test里使用,即test里也不用定义一些都需要定义的文件。
接下来创建数组并初始化棋盘并且游戏
菜单选择模块
首先调用menu函数,调出菜单界面。利用switch语句判断选择条件。
为1调用game函数启动游戏
为0则退出循环
其他则重新输入。
主菜单
调用菜单选择模块
游戏框架模块
game函数把游戏要执行的内容逻辑都列了出来,再分别把不同的内容放入不同的函数模块中,以便之后调用
接下来是game.c文件的内容
首先介绍初始化棋盘函数void InitBoard(int board[ROW][COL], int row, int col)
首先在game函数中创建了二维数组board作为棋盘,利用循环嵌套把数组里的实际值全部替换为。
接下来看打印棋盘的程序框架
同样是用了嵌套循环来进行棋盘的打印。
首先外面的大循环是行里面的小循环是列,先打印的是列,先打印出棋盘数组里i和j处的值(如果是打印(空))然后进行判断是否需要加竖线。
打印完成后打印换行,换行是进行判断是否还需要打印行如果需要则进入下面的循环。
打印完之后然后进行判断是否需要加竖线,如果j小于col-1则打印(根据设定的col值-1)
玩家移动选择模块
首先进入时输入提示:玩家走:>。进入循环——玩家用scanf输入对应坐标,判断输入的数是不是在1-3这个区间(玩家不是程序员不知道坐标是从0开始的,所以我们应该优化我们的程序)
当用户输入完成之后,进行判断。因为用户输入的是+1过后的坐标,所以我们应该进行对应的减法。
判断二维数组内部对应的坐标的值是不是为(因为之前我们初始化数组的时候是全部初始化为了)如果是那么代表这个位置还没有被其他的数占用,玩家可以将*下入数组对应坐标,如果不是那么提示坐标已经被占用。
其他则是坐标非法。
电脑走
此时用了rand函数生成一个随机数,需要引用一个头文件<stdlib.h>
如果用rand生成随机数是在0到RAND_MAX((int)0x7fff)之间,所以rand是返回了一个0到32767之间的数。但是不管是第一遍还是第二遍之后生成的都是同样的数。
解决需要在调用rand之前先调用srand来设置随机数的生成器。
Srand()——设置一个随机的起点
如果在括号里输入一个固定的值那么回生成一个随机值,但是这个随机值一直都是同一个数。传一个一直在发生变化的值就可以解决这个问题了。
电脑的时间一直在发生变化,我们把时间戳传入就可以解决了
可以使用一个库函数——time()函数——这个库函数就会返回一个时间戳,返回的是调用这个函数的那个时间点和计算机的起始时间。
先放入一个空指针NULL。Time是有符号整型,Srand需要的类型是nusigned int类型(无符号整型),我们把time的返回值强制转换nusigned int类型即可。
Time的使用需要引用头文件<time.h>
如果把srand((unsigned int)time(NULL));这段程序放在game函数里的话随机值会离得很
近,srand确实要在rand前面调用,但是随机值起点的设置只需要调用一次就可以了。
如果放入game函数里玩一次就要设置一次不太好。应该放在主函数里即可。
之后rand有了随机值之后把得到的随机值模上行和列,再进行判断就好
判断胜利条件函数
判断当前棋盘数组内的值,是否已经形成结束游戏的条件。即
//玩家赢*
//电脑赢#
//平局Q
//游戏继续C
当判断好数组内的值后直接返回胜利条件数组内的值去game函数来进行判断。
判断是否平局
利用循环嵌套把棋盘数组内的值查看一遍,如果还有那么返回1,如果没有了那么返回0结束游戏
最后一个文件是头文件用来声明之前使用的各个函数
#define ROW 3
#define COL 3
用来设置要打印的棋盘大小
当头文件调用了库函数后,其他文件只需要调用这个头文件即可
至此三子棋的程序全部结束。
test
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//测试游戏的逻辑——基本结构 #define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void menu()//菜单 { printf("****************************n"); printf("***** 1.play 0.exit *****n"); printf("****************************n"); } //游戏算法的实现【3】 void game() { //数组存放走出的棋盘信息 char board[ROW][COL] = { 0 };//储存数据-二维数组 InitBoard(board, ROW, COL);//初始化棋盘-初始化【4】 DispalyBoard(board, ROW, COL);//打印棋盘【5】 char ret = 0;//获取游戏状态 while (1)//下棋程序 { PlayerMove(board, ROW, COL);//玩家走【6】 DispalyBoard(board, ROW, COL);//打印棋盘 ret = IsWin(board, ROW, COL);//判断当前棋盘状态 ret为*时玩家赢 if (ret != 'C')// 不等于C时跳出 ret为#时电脑赢 break;// ret为Q时平局 ComputerMove(board, ROW, COL);//电脑下棋 ret为C时继续游戏 DispalyBoard(board, ROW, COL); ret = IsWin(board, ROW, COL);//判断当前棋盘状态 if (ret != 'C') break; } if (ret == '*') { printf("玩家赢了!!n"); } else if (ret == '#') { printf("电脑赢了!!n"); } else { printf("平局!n"); } DispalyBoard(board, ROW, COL); } /// void test()//菜单选择模块【2】 { int input = 0; do { menu(); printf("请选择>:"); scanf("%d", &input); switch (input) { case 1: game(); printf("三子棋启动n"); break; case 0: printf("退出游戏n"); break; default: printf("选择错误,请重新选择n"); break; } } while (input); } //主程序【1】 int main() { srand((unsigned int)time(NULL)); test(); 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
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//游戏的实现——每一个函数模块的实现 #define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void InitBoard(int board[ROW][COL], int row, int col)//初始化数组内容(棋盘)为【4】 { int i = 0; int j = 0; for (i = 0; i < row; i++); { for (j = 0; j < col; j++) { board[i][j] = ''; } } } void DispalyBoard(char board[ROW][COL], int row, int col)//打印棋盘的框架【5】 { int i = 0; for (i = 0; i < row; i++) { int j = 0; 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"); } } } void PlayerMove(char board[ROW][COL], int row, int col)//玩家走【6】 { int x = 0; int y = 0; printf("玩家走:>n"); while (1) { printf("请输入坐标:>"); scanf("%d %d", &x, &y); //判断x,y坐标的合法性 if (x >= 1 && x <= row && y >= 1 && y <= col)//n-3 { if (board[x - 1][y - 1] == '') { board[x - 1][y - 1] = '*'; break; } else { printf("该坐标已经被占用n"); } } else { printf("坐标非法!请重新输入!n"); } } } void ComputerMove(char board[ROW][COL], int row, int col)//电脑走【7】 { printf("电脑走:>n"); while(1) { int x = rand() % row; int y = rand() % col; if (board[x][y] == '') { board[x][y] = ' #'; break; } } } int IsFull(char board[ROW][COL], int row, int col)//判断是否平局【9】 { 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;//棋盘满 } char IsWin(char board[ROW][COL], int row, int col)//判断棋盘当前状态【8】 { int i = 0; //判断3行 for (i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1]==board[i][2] && board[i][1] != '') { return board[i][1]; } } //判断3列 for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i]== board[2][i] && board[1][i] != '') { return board[1][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]; } //判断平局 int ret = IsFull(board, row, col);//判断是否平局 if (ret == 1) { return 'Q'; } return 'C'; }
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//关于游戏相关的函数声明,符号声明,头文件包含 #pragma once //符号的声明 #define ROW 3 #define COL 3 #include<stdio.h> #include<stdlib.h> #include<time.h> //声明 void InitBoard(char board[ROW][COL], int row, int col);//初始化棋盘内容 void DispalyBoard(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);//谁赢 //玩家赢* //电脑赢# //平局Q //游戏继续C
最后
以上就是土豪星月最近收集整理的关于从零开始学习C语言日记——DAY26三子棋游戏的全部内容,更多相关从零开始学习C语言日记——DAY26三子棋游戏内容请搜索靠谱客的其他文章。
发表评论 取消回复