重温c语言之,7天开整,就是随便的写写,第九天
这次照着网站上的内容,写了一个简单的小游戏,3字棋,其实也可以n字棋
附上代码,
这里是:game.h
1 #pragma once
2 #include<stdio.h>
3 #include<stdlib.h>
4 #include<time.h>
5
6 //游戏代码的声明(函数声明,符号定义)
7
8 #define Row 3
9 #define Col 3
10
11 //初始化棋盘
12 void InitBoard(char board[Row][Col], int Row_n, int Col_n);
13 //打印棋盘
14 void DisplayBoard(char board[Row][Col], int Row_n, int Col_n);
15 //玩家下棋
16 void PlayerMove(char board[Row][Col], int Row_n, int Col_n);
17 //电脑下棋,随机生成坐标
18 void ComputerMove(char board[Row][Col], int Row_n, int Col_n);
19
20 //玩家赢:Congratulation!---'*'
21 //电脑赢:Lost!-----"#'
22 //平局:The game ends in a tie.---'Q'
23 //继续:Go on!-----'C'
24 char IsWin(char board[Row][Col], int Row_n, int Col_n);
之后是:game.c
1 #define _CRT_SECURE_NO_WARNINGS
2 #include "game.h"
3
4 //三子棋
5 //代码的实现
6
7
8 void InitBoard(char board[Row][Col], int Row_n, int Col_n) {
9 int i = 0;
10 int j = 0;
11 for (i = 0; i < Row_n; i++)
12 {
13 for (j = 0; j < Col_n; j++) {
14 board[i][j] = ' ';
15 }
16 }
17 }
18
19 //第一版本
20 //void DisplayBoard(char board[Row][Col], int Row_n, int Col_n) {
21 // int i = 0;
22 // for (i = 0; i < Row_n; i++)
23 // {
24 // //打印数据
25 // printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
26 // //打印分隔符
27 // if (i < Row_n - 1) {
28 // printf("---|---|---\n");
29 // }
30 // }
31 //}
32
33 //第二版本,为了更好的扩展地图
34 void DisplayBoard(char board[Row][Col], int Row_n, int Col_n) {
35 int i = 0, j = 0, z = 0;
36 for (i = 0; i < Row_n; i++)
37 {
38 for (j = 0; j < Col_n; j++)
39 {
40 //打印数据
41 printf(" %c ", board[i][j]);
42 //打印分隔符
43 if (j < Col_n - 1)
44 {
45 printf("|");
46 }
47 }
48 printf("\n");
49 if (i < Row_n - 1) {
50 for (z = 0; z < Col_n; z++)
51 {
52 printf("---");
53 if (z < Row_n - 1) {
54 printf("|");
55 }
56 }
57 printf("\n");
58 }
59
60 }
61 }
62
63 void PlayerMove(char board[Row][Col], int Row_n, int Col_n) {
64 int x = 0, y = 0;
65 printf("玩家下棋:\n");
66 while (1) {
67 printf("请输入坐标(x:%d-%d之间,y:%d-%d之间):>", 1, Row_n, 1, Col_n);
68 if (scanf("%d %d", &x, &y) == 2) { // 检查是否成功读取两个整数
69 if (x >= 1 && x <= Row_n && y >= 1 && y <= Col_n) {
70 if (board[x - 1][y - 1] == ' ') {
71 board[x - 1][y - 1] = '*';
72 break;
73 }
74 else {
75 printf("坐标被占用,不能被下棋,请选择其他的位置\n");
76 }
77 }
78 else {
79 printf("坐标非法,请重新输入\n");
80 }
81 }
82 else {
83 printf("输入错误,请输入两个整数坐标\n");
84 }
85 while (getchar() != '\n'); // 清空输入缓冲区
86 }
87
88 }
89
90 void ComputerMove(char board[Row][Col], int Row_n, int Col_n) {
91 printf("电脑下棋:>\n");
92 int x = 0, y = 0;
93 while (1) {
94 x = rand() % Row_n;//0~Row_n-1
95 y = rand() % Col_n;//0~Col_n-1
96 if (board[x][y] == ' ') {
97 board[x][y] = '#';
98 break;
99 }
100 }
101
102 }
103 //如果满了,则返回1
104 //不满,则返回0
105 int IsFull(char board[Row][Col], int Row_n, int Col_n) {
106 int i = 0,j=0;
107 for (i = 0; i < Row_n; i++)
108 {
109 for ( j = 0; j < Col_n; j++)
110 {
111 if (board[i][j] == ' ') {
112 return 0;
113 }
114 }
115 }
116 return 1;
117 }
118 char IsWin(char board[Row][Col], int Row_n, int Col_n) {
119 // 判断行
120 for (int i = 0; i < Row_n; i++) {
121 char rowChar = board[i][0];
122 for (int j = 0; j < Col_n; j++) {
123 if (board[i][j] == '|' || board[i][j] == '---' || board[i][j] == ' ') {
124 continue; // 跳过分隔符和空位
125 }
126 if (board[i][j] != rowChar) {
127 break; // 如果字符不匹配,则检查下一行
128 }
129 if (j == Col_n - 1) { // 如果整行元素都相等
130 return rowChar;
131 }
132 }
133 }
134
135 // 判断列
136 for (int j = 0; j < Col_n; j++) {
137 char colChar = board[0][j];
138 for (int i = 0; i < Row_n; i++) {
139 if (board[i][j] == '|' || board[i][j] == '---' || board[i][j] == ' ') {
140 continue; // 跳过分隔符和空位
141 }
142 if (board[i][j] != colChar) {
143 break; // 如果字符不匹配,则检查下一列
144 }
145 if (i == Row_n - 1) { // 如果整列元素都相等
146 return colChar;
147 }
148 }
149 }
150
151 // 判断主对角线
152 char diagMainChar = board[0][0];
153 for (int i = 1; i < Row_n; i++) {
154 if (board[i][i] == '|' || board[i][i] == '---' || board[i][i] == ' ') {
155 continue; // 跳过分隔符和空位
156 }
157 if (diagMainChar != board[i][i]) {
158 break; // 如果字符不匹配,则游戏继续
159 }
160 if (i == Row_n - 1) { // 如果主对角线相等且不为空
161 return diagMainChar;
162 }
163 }
164
165 // 判断副对角线
166 char diagSecChar = board[0][Col_n - 1];
167 for (int i = 0; i < Row_n; i++) {
168 if (board[i][Col_n - 1 - i] == '|' || board[i][Col_n - 1 - i] == '---' || board[i][Col_n - 1 - i] == ' ') {
169 continue; // 跳过分隔符和空位
170 }
171 if (diagSecChar != board[i][Col_n - 1 - i]) {
172 break; // 如果字符不匹配,则游戏继续
173 }
174 if (i == Row_n - 1) { // 如果副对角线相等且不为空
175 return diagSecChar;
176 }
177 }
178
179 // 检查是否平局或游戏继续
180 if (IsFull(board, Row_n, Col_n)) {
181 return 'Q'; // 平局
182 }
183
184 return 'C'; // 游戏继续
185 }
最后是:test.c
1 #define _CRT_SECURE_NO_WARNINGS
2
3
4 //测试游戏的逻辑
5
6 #include"game.h"
7
8 void manu() {
9 printf("************************\n");
10 printf("***** 1.play *****\n");
11 printf("***** 0.exit *****\n");
12 printf("************************\n");
13 }
14
15 void game() {
16 char ret = 'C';
17 char board[Row][Col] = { 0 };
18 //初始化棋盘的功能
19 InitBoard(board, Row, Col);
20 //打印棋盘
21 DisplayBoard(board, Row, Col);
22 //下棋,玩家先下
23 while (1) {
24 PlayerMove(board, Row, Col);
25 //判断输赢
26 ret = IsWin(board, Row, Col);
27 if (ret != 'C') {
28 break;
29 }
30 DisplayBoard(board, Row, Col);
31 ComputerMove(board, Row, Col);
32 //判断输赢
33 ret = IsWin(board, Row, Col);
34 if (ret != 'C') {
35 break;
36 }
37 DisplayBoard(board, Row, Col);
38 }
39 if (ret == '*')
40 {
41 printf("恭喜玩家获胜!\n");
42 }
43 else if (ret == '#') {
44 printf("电脑获胜!\n");
45 }
46 else if(ret=='Q')
47 {
48 printf("平局!\n");
49 }
50
51 DisplayBoard(board, Row, Col);
52 }
53
54
55 int main() {
56 srand((unsigned int)time(NULL));
57 int input = 0;
58 do {
59 manu();
60 printf("请输入选项:");
61 scanf("%d", &input);
62 switch (input) {
63 case 1:
64 game();
65 break;
66 case 0:
67 printf("退出游戏\n");
68 break;
69 default:
70 printf("输入错误!\n");
71 break;
72 }
73 } while (input != 0); // 只有当input为0时,循环才会结束
74 return 0;
75 }
我这里的用法都比较简单,只是运用了if-else,for循环,函数等用法,没有用到十分高明的手段
注:我这里的电脑判断部分比较人机,十分的差劲,如果想要进一步改进or进化的话,可以按照:人类将要输入什么地方获得胜利,提前进行检测,之后占位,最终达到平局.....等想法来进行修改