重温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进化的话,可以按照:人类将要输入什么地方获得胜利,提前进行检测,之后占位,最终达到平局.....等想法来进行修改

 

posted @ 2024-11-11 09:16  我是一个小笨蛋  阅读(33)  评论(0编辑  收藏  举报