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

news/2024/11/12 20:33:41/文章来源:https://www.cnblogs.com/xiejinghao/p/18539047

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/831615.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

D-FINE环境搭建推理测试

​ 引子在目标检测领域,内卷严重的实时目标检测 (Real-time Object Detection) 领域,性能与效率始终是难以平衡的核心问题。绝大多数现有的 SOTA 方法仅依赖于更先进的模块替换或训练策略,导致性能逐渐趋于饱和。前阵子YOLOv11横空出世(感兴趣的童鞋可以移步YOLOv11环境搭建…

基于.NET开源、功能强大且灵活的工作流引擎框架

前言 工作流引擎框架在需要自动化处理复杂业务流程、提高工作效率和确保流程顺畅执行的场景中得到了广泛应用。今天大姚给大家推荐一款基于.NET开源、功能强大且灵活的工作流引擎框架:elsa-core。框架介绍 elsa-core是一个.NET开源、免费(MIT License)、功能强大且灵活的工作…

Dedecms 织梦上传图片失败 ERROR:Copy Uploadfile Error! 提示

问题:上传图片时提示 ERROR: Copy Uploadfile Error!。原因:上传的文件损坏,或上传目录无写入权限。解决方法:尝试上传其他图片:检查上传的图片是否损坏,尝试上传其他图片。给上传目录写入权限:Linux 服务器:通过 FTP 设置 uploads 目录及其子文件夹为 777 权限。 Wind…

Web服务器被配置为不列出此目录的内容

创建或上传首页文件在站点根目录下创建一个首页文件,如 index.html、index.asp、index.aspx 或 default.aspx。 确保文件内容有效,例如对于 index.html,可以包含以下基本内容:<!DOCTYPE html> <html> <head><title>我的网站</title> </he…

PbootCMS模板内页如何调用相关文章

使用 {pboot:lists code={sort:scode} num=4} 标签调用相关文章,其中 num=4 表示调用4篇文章。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站、网站修改、网站改版、BUG修复、问题处理…

C#实战:使用腾讯云识别服务轻松提取火车票信息

公司内部涉及到车票报销的时候一个个输入火车票信息非常麻烦,尤其是出差比较多的企业,这对于财务人员的涉及报销单据录入还是非常麻烦的。今天给大家分享使用腾讯云车票识别服务,轻松提取火车票信息。这样可以方便把识别服务集成到业务系统,可以大大减轻财务人员录入单据信…

《Django 5 By Example》阅读笔记:p1-p16

《Django 5 By Example》学习第1天,p1-p16总结,总计16页。 一、技术总结 1.Django基本操作 (1)创建 project & 创建 app django-admin startproject mysitedjango-admin startapp blog(2)定义model (3)启动项目 python manage.py runserver二、英语总结(生词:8) 1.finte…

2024/11/11

软件设计 实验12:外观模式 在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法 ,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(HardDisk)的读取(read())、操作系统(OS)的载入(load()),如果某一过程发生错误则计算…

2024.11.6(周三)

用透明组合模式实现教材中的“文件夹浏览”这个例子。 实验要求: 1.文件的执行不需真正实现,只需简单提示即可; 2.提交源代码; 3.注意编程规范。1、类图2、源代码 #include <iostream> #include <string> #include<list> using namespace std;class Abst…

2024.11.7(周四)

用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人;而JarPhone除了声音还能振动;更高级的手机(ComplexPhone)除了声音、振动外,还有灯光闪烁提示。 实验要求: 1.提交类图; 2.提交源代码; 3.注意编程规范。1、类图2、源代码 #i…

2024.11.5(周二)

用桥接模式实现在路上开车这个问题,其中,车可以是car或bus,路可以是水泥路或沥青路。 实验要求: 1.画出对应的类图; 2.提交源代码; 3.注意编程规范。1、类图2、源代码 (1) Bus.java package test;public class Bus implements Vehicle{@Overridepublic void run() {Sy…

CFAT:三角窗口实现图像超分辨率

CFAT:三角窗口实现图像超分辨率基于变换器的模型通过利用其固有的捕获复杂上下文特征的能力,彻底改变了图像超分辨率(SR)的效果。如今,在Transformer架构中使用的重叠矩形移位窗口技术是超分辨率模型中的一种常见做法,可以提高图像放大的质量和鲁棒性。然而,它在边界处存…