首页 > 其他分享 >重温c语言之,7天开整,就是随便的写写,第九天

重温c语言之,7天开整,就是随便的写写,第九天

时间:2024-11-11 09:08:14浏览次数:1  
标签:第九天 char int 写写 board printf 天开 Col Row

这次照着网站上的内容,写了一个简单的小游戏,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进化的话,可以按照:人类将要输入什么地方获得胜利,提前进行检测,之后占位,最终达到平局.....等想法来进行修改

 

标签:第九天,char,int,写写,board,printf,天开,Col,Row
From: https://www.cnblogs.com/xiejinghao/p/18539047

相关文章

  • 重温c语言之,7天开整,就是随便的写写,第八天
    一:函数1、递归题目:求n的阶乘(不考虑溢出)上代码1#include<stdio.h>2intfactorial(intn){3if(n>1){4returnn*(factorial(n-1));5}6else7{8return1;9}10}11#include<stdio.h>12in......
  • 代码随想录算法训练营第九天|LeetCode151.翻转字符串里的单词、卡码网:55.右旋转字符串
    前言打卡代码随想录算法训练营第49期第九天︿( ̄︶ ̄)︿首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。今日题目LeetCode151翻转字......
  • 重温c语言之,7天开整,就是随便的写写,第七天
    一:素数又见素数但这次不一样,这次需要用到函数,利用函数来将素数区分出来,直接上代码1#include<stdio.h>2#include<math.h>3intprime_num(intnum)4{5for(inti=2;i<sqrt(num);i++)6{7if(num%i==0)8{9......
  • 重温c语言之,7天开整,就是随便的写写,第六天
    一:字符串相比较题目:编写代码实现,模拟用户登录情景,并且只能登录3次。(只允许输入3次密码,密码正确则提示输入成功,如果三次都输入错误,则退出程序)这里就是用到了strcmp这个函数,其实这个函数是让两个字符串同时从左到右转换成ASCLL码,之后两个字符,前面的减去后面的,如果全部减......
  • 重温c语言之,7天开整,就是随便的写写,第五天
    一:库函数---printf()这个函数printf()的返回值是int,这个函数竟然有返回值,值的多少是取决于输出的内容有多少个字符二:循环1、for循环这个循环中,如果判断的地方省略的话,这个循环就是永远成立(恒成立),1for(;;)这样的话,就会无线循环下去--------(弊端1)......
  • 重温c语言之,7天开整,就是随便的写写,第三天+第四天版
    一:指针1、关于指针的含义---粗略例如:inta=10;int*p=&a;这里的*,是说明p是指针变量,int说明p是指向的对象是int类型的*p=20,这里的*是解引用符,意思是通过p中存放的地址,找到p所指向的对象,*p就是p指向的对象2、关于指针的大小......
  • 代码随想录算法训练营第九天|leetcode151.翻转字符串里的单词、卡码网55.右旋字符串、
    1leetcode151.翻转字符串里的单词题目链接:151.反转字符串中的单词-力扣(LeetCode)文章链接:代码随想录视频链接:字符串复杂操作拿捏了!|LeetCode:151.翻转字符串里的单词哔哩哔哩bilibili自己的思路:直接将空格去掉,然后分割字符串为列表,在列表中进行翻转,不在字符串内部操作......
  • 重温c语言之,7天开整,就是随便的写写,第二天
    一:操作符除法:如果都是整数,除数,被除数都是整数,那么结果:就是整数的商(没有小数部分的),例如:7/2=3;如果除数或者被除数其中一个是浮点数,那么结果就是(条件是:能除尽的,并且小数在基础数据类型包含下的)完整的商(包含小数部分的):例如:7/2.0=3.500000;如果想要在pr......
  • 重温c语言之,7天开整,就是随便的写写,第一天
    一:转义字符\t是一个字符,在printf里面,只占一个位置;其他什么的抽象字符,用一个'\'+抽象字符就可以出现;\ddd这个是8进制的,可以转成10进制的,之后参考ASCLL码表即可二:枚举类型的函数与数组一样,有下标,都是从0开始的三:数组可以先不在【】这里面填写多少,但是需......
  • 代码随想录算法训练营第九天|leetcode151.翻转字符串里的单词、卡码网55.右旋字符串
    1leetcode151.翻转字符串里的单词题目链接:151.反转字符串中的单词-力扣(LeetCode)文章链接:代码随想录视频链接:字符串复杂操作拿捏了!|LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili自己的思路:直接将空格去掉,然后分割字符串为列表,在列表中进行翻转,不在字符串内部操作,......