三子棋游戏小课堂

🪐🪐🪐欢迎来到程序员餐厅💫💫💫

今天的主菜是,C语言实现的三子棋小游戏,

              所属专栏:     C语言知识点   

              主厨的主页:Chef‘s blog


前言:

已经学会数组的朋友们注意啦,现在的你已经有能力写出两个小游戏了,一个是扫雷,一个是三子棋,今天咱们就来手搓三子棋代码。

涉及知识点:

  • 随机数的生成:C语言实现随机数
  • 数组的使用

1.游戏要求

1.此游戏为人机对战

2.一方的棋子连成一行或一列或对角线时胜利

3.默认是3*3的棋盘,但可修改

4.玩家可以通过菜单选择开始游戏或退出游戏

2.游戏分析

  • 1.电脑下的棋通过随机数生成
  • 2.我们应该用数组放置双方所下的棋子
  • 3.每时每刻其具有三种情况,即未分出胜负,一方获胜,平局。每次一方下完棋就该判断此时棋局的情况。
  • 4.设置菜单使玩家可以选择退出游戏或开始游戏

3.多文件操作

 为了方便代码的管理和保证游戏实现逻辑的清晰性,我们将采用多文件管理的模式。

        (1)创建头文件game.h,包含所有头文件(其他源文件只需引用它即可),以及所有游戏功能的函数接口。

        (2)创建源文件game.c,负责所有游戏功能对应函数的具体代码实现。

        (3)创建源文件main.c,负责调用函数实现来游戏。

4.  简易菜单的实现

4.1功能介绍

 1.玩家可以通过选择1进入游戏,0退出游戏。

2.选错的话提醒玩家,重新选择。

3.告诉玩家游戏规则

4.2功能实现

#define _CRT_SECURE_NO_WARNINGS 1
#include"源.h"
void menu()
{printf("*********************\n");printf("****开始   :1*******\n");printf("****结束   :0********\n");//打印菜单printf("*********************\n");
}
void rules()
{printf("游戏规则如下:\n");printf("1.此游戏为人机对战\n2.一方的棋子连成一行或一列或对角线时胜利\n3.横坐标是1—3,纵坐标是1—3\n4.输入1是开始游戏输入0是退出游戏\n");
}
int main()
{srand((unsigned int)time(NULL));//设置随机数种子int input = 0;do {rules();menu(); printf("请选择:->");//玩家输入0表示退出游戏,输入1表示开始游戏scanf("%d", &input);switch (input){case 1:printf("开始游玩三子棋,祝您好运!\n");game();//游戏内容的具体实现break;case 0:printf("退出游戏\n");break;default:printf("请输入0 或 1 !\n");//防止有人捣乱,故意输错break;}} while (input);return 0;
}

4.3效果展示

5. 游戏功能实现

  5.1 要实现的函数接口

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define _CRT_SECURE_NO_WARNINGS 1
#define L 3
#define W 3
void initboard(char board[L][W], int l, int w);
void printboard(char board[L][W], int l, int w);
void playermove(char board[L][W], int l, int w);
void computermove(char board[L][W], int l, int w);
char judge(char board[L][W], int l, int w);
void game(void);

5.2初始化棋盘

(1)要求

把棋盘都初始化为空格

(2)代码实现
void initboard(char board[L][W], int l, int  w)
{int x = 0, y = 0;for (x = 0; x < l; x++)for (y = 0; y < w; y++)board[x][y] = ' ';
}

5.3 打印棋盘

    (1)要求

1. 打印出棋盘中的元素。

2. 利用---,|模拟出棋盘框。

(2)实现
void printboard(char board[L][W], int l, int w)
{int i = 0;for (i = 0; i < l-1; i++){for (int j = 0; j < w-1; j++)printf(" %c |", board[i][j]);printf(" %c ", board[i][w-1]);printf("\n");                      //打印前两行for(int j=0;j<w-1;j++)printf("---|");printf("---\n");}for (int j = 0; j < w-1; j++)printf(" %c |", board[i][j]);//打印最后一行printf(" %c ", board[i][w - 1]);printf("\n");
}

(3)效果展示

5.4玩家下棋

(1)要求

1.若输入坐标不在棋盘范围中,或该位置已经有棋了,提醒玩家重新输入

2.坐标有效则更改二维数组中存放的元素为玩家对应符号‘#’

(2)代码实现

void playermove(char board[L][W], int l, int w)
{int x, y;
again:	printf("玩家下棋\n请输入坐标:>");scanf("%d %d", &x, &y);if (x <= l && x > 0 && y <= w && y > 0){if (board[x-1][y-1] == ' ')board[x-1][y-1] = '#';//坐标有效,修改数组else{printf("这个地方有棋子了,换个地方吧!\n");goto again;}}else{printf("下错了,重新下吧!\n");goto again;}
}

      (3)效果展示

5.4电脑下棋

(1)要求

1.若输入坐标不在棋盘范围中,或该位置已经有棋了,则电脑重新输入

2.坐标有效则更改二维数组中存放的元素为电脑对应符号‘*’

(2)代码实现   

void computermove(char board[L][W], int l, int w)
{printf("电脑下棋\n");int x, y;again:  x = rand() % 3 + 1, y = rand() % 3 + 1;//随机数产生坐标if (x <= l && x > 0 && y <= w && y > 0&&board[x - 1][y - 1] == ' ')board[x - 1][y - 1] = '*';elsegoto again;
}

(3)效果展示

5.6判断棋局情况

(1)要求

棋局有三种情况,平局,胜负,或还未结束,根据不同情况返回不同字符

(2)代码实现

char judge(char board[L][W], int l, int w)
{for (int i = 0; i < l; i++){int j = 0;for ( j = 0; j < w-1; j++){if (board[i][j] != board[i][j + 1])break;}if (j == w-1 && board[i][j - 1] != ' ')//检查是否有连成一行return board[i][j - 1];}for (int i = 0; i < l; i++){int j = 0;for (j = 0; j < w-1; j++){if (board[j][i] != board[j+1][i])//检查是否有连成一列break;}if (j == w-1 && board[j-1][i] != ' ')return board[j-1][i];}int x;for ( x = 0; x < l-1; x++)if (board[x][x] != board[x + 1][x + 1])//检查是否连成对角线break;if (x == l-1 && board[x - 1][x - 1] != ' ')return board[x - 1][x - 1];int y;for (y=l-1;  y>0; y--)if (board[y][y] != board[y-1][y-1])//检查是否连成另一条对角线break;if (y == 0 && board[y][y] != ' ')return board[y][y];for (int i = 0; i < l; i++){int j = 0;for (j = 0; j < w; j++){if (board[j][i] == ' ')return 'j';//检查棋盘满了没}}return 'p';//最后一种情况是平局
}

(3)效果展示

5.7调用各个函数实现游戏

void game()
{char b;char board[L][W] = { 0 };initboard(board, L, W);printboard(board, L, W);while (1){playermove(board, L, W);printboard(board, L, W);b = judge(board, L, W);if (b != 'j')break;computermove(board, L, W);printboard(board, L, W);b = judge(board, L, W);if (b != 'j')break;}if (b == '#')printf("你赢了\n");else if (b == '*')printf("你输了\n");elseprintf("平局\n");
}

6. 源码 

  (1)main.c

#include"test.h"
void menu()
{printf("*********************\n");printf("****开始   :1*******\n");printf("****结束   :0********\n");printf("*********************\n");
}
int main()
{srand((unsigned int)time(NULL));int input = 0;do {game();menu(); printf("请选择:->");scanf("%d", &input);switch (input){case 1:printf("开始游玩三子棋,祝您好运!\n");game();break;case 0:printf("退出游戏\n");break;default:printf("请输入0 或 1 !\n");break;}} while (input);return 0;
}

(2)test.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define _CRT_SECURE_NO_WARNINGS 1
#define L 3
#define W 3
void initboard(char board[L][W], int l, int w);
void printboard(char board[L][W], int l, int w);
void playermove(char board[L][W], int l, int w);
void computermove(char board[L][W], int l, int w);
char judge(char board[L][W], int l, int w);
void game(void);

(3)test.c

#include"test.h"
void initboard(char board[L][W], int l, int  w)
{int x = 0, y = 0;for (x = 0; x < l; x++)for (y = 0; y < w; y++)board[x][y] = ' ';
}
void printboard(char board[L][W], int l, int w)
{int i = 0;for (i = 0; i < l-1; i++){for (int j = 0; j < w-1; j++)printf(" %c |", board[i][j]);printf(" %c ", board[i][w-1]);printf("\n");for(int j=0;j<w-1;j++)printf("---|");printf("---\n");}for (int j = 0; j < w-1; j++)printf(" %c |", board[i][j]);printf(" %c ", board[i][w - 1]);printf("\n");
}
void playermove(char board[L][W], int l, int w)
{int x, y;
again:	printf("玩家下棋\n请输入坐标:>");scanf("%d %d", &x, &y);if (x <= l && x > 0 && y <= w && y > 0){if (board[x-1][y-1] == ' ')board[x-1][y-1] = '#';else{printf("这个地方有棋子了,换个地方吧!\n");goto again;}}else{printf("下错了,重新下吧!\n");goto again;}
}
void computermove(char board[L][W], int l, int w)
{printf("电脑下棋\n");int x, y;again:  x = rand() % 3 + 1, y = rand() % 3 + 1;if (x <= l && x > 0 && y <= w && y > 0&&board[x - 1][y - 1] == ' ')board[x - 1][y - 1] = '*';elsegoto again;
}
char judge(char board[L][W], int l, int w)
{for (int i = 0; i < l; i++){int j = 0;for ( j = 0; j < w-1; j++){if (board[i][j] != board[i][j + 1])break;}if (j == w-1 && board[i][j - 1] != ' ')return board[i][j - 1];}for (int i = 0; i < l; i++){int j = 0;for (j = 0; j < w-1; j++){if (board[j][i] != board[j+1][i])break;}if (j == w-1 && board[j-1][i] != ' ')return board[j-1][i];}int x;for ( x = 0; x < l-1; x++)if (board[x][x] != board[x + 1][x + 1])break;if (x == l-1 && board[x - 1][x - 1] != ' ')return board[x - 1][x - 1];int y;for (y=l-1;  y>0; y--)if (board[y][y] != board[y-1][y-1])break;if (y == 0 && board[y][y] != ' ')return board[y][y];for (int i = 0; i < l; i++){int j = 0;for (j = 0; j < w; j++){if (board[j][i] == ' ')return 'j';}}return 'p';
}
void game()
{char b;char board[L][W] = { 0 };initboard(board, L, W);printboard(board, L, W);while (1){playermove(board, L, W);printboard(board, L, W);b = judge(board, L, W);if (b != 'j')break;computermove(board, L, W);printboard(board, L, W);b = judge(board, L, W);if (b != 'j')break;}if (b == '#')printf("你赢了\n");else if (b == '*')printf("你输了\n");elseprintf("平局\n");
}

好啦好啦,终于写完了,完结撒花,感谢观看,下次再见

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

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

相关文章

机器学习 | 掌握逻辑回归在实践中的应用

目录 初识逻辑回归 逻辑回归实操 分类评估方法 初识逻辑回归 逻辑回归&#xff08;LogisticRegression&#xff09;是机器学习中的一种分类模型&#xff0c;逻辑回归是一种分类算法&#xff0c;虽然名字中带有回归&#xff0c;但是它与回归之间有一定的联系。由于算法的简单…

【Spark系列2】Spark编程模型RDD

RDD概述 RDD最初的概述来源于一片论文-伯克利实验室的Resilient Distributed Datasets&#xff1a;A Fault-Tolerant Abstraction for In-Memory Cluster Computing。这篇论文奠定了RDD基本功能的思想 RDD实际为Resilient Distribution Datasets的简称&#xff0c;意为弹性分…

【大厂AI课学习笔记】1.3 人工智能产业发展(2)

&#xff08;注&#xff1a;腾讯AI课学习笔记。&#xff09; 1.3.1 需求侧 转型需求&#xff1a;人口红利转化为创新红利。 场景丰富&#xff1a;超大规模且多样的应用场景。主要是我们的场景大&#xff0c;数据资源丰富。 抗疫加速&#xff1a;疫情常态化&#xff0c;催生新…

Windows11通过Hyper-V创建VM,然后通过vscode连接vm进行开发

这边需要在win11上建立vm来部署docker(这边不能用windows版本的docker destop)&#xff0c;学习了下&#xff0c;记录。 下载系统镜像 首先下载系统镜像&#xff1a;https://releases.ubuntu.com/focal/ 这边使用的是ubuntu20.04.6 LTS (Focal Fossa) &#xff0c;Server inst…

1484. 按日期分组销售产品

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 表 Activities&#xff1a; ---------------------- | 列名 | 类型 | --------…

CIFAR-10数据集详析:使用卷积神经网络训练图像分类模型

1.数据集介绍 CIFAR-10 数据集由 10 个类的 60000 张 32x32 彩色图像组成&#xff0c;每类 6000 张图像。有 50000 张训练图像和 10000 张测试图像。 数据集分为5个训练批次和1个测试批次&#xff0c;每个批次有10000张图像。测试批次正好包含从每个类中随机选择的 1000 张图像…

易优CMS采集插件使用教程

本易优CMS采集教程说明如何使用易优CMS采集插件&#xff0c;批量获取互联网上的文章数据&#xff0c;并自动更新到易优cms&#xff08;eyoucms&#xff09;网站&#xff0c;快速丰富网站的内容。 目录 1. 下载并安装易优CMS采集插件 2. 对接网页文章采集工具 3. 采集数据发…

GPT-4级别模型惨遭泄露!引爆AI社区,“欧洲版OpenAI”下场认领

大家好&#xff0c;我是二狗。 这两天&#xff0c;一款性能接近GPT-4的模型惨遭泄露&#xff0c;引发了AI社区的热议。 这背后究竟是怎么回事呢&#xff1f; 起因是1月28日&#xff0c;一位名为“Miqu Dev”的用户在 HuggingFace 上发布了一组文件&#xff0c;这些文件共同组…

Steam爆火游戏幻兽帕鲁自建多人联机专用服务器配置要求

《幻兽帕鲁》这款多人游戏模式的全新开放世界生存制作游戏&#xff0c;在短短上线5天就卖出700万份&#xff0c;同时在线人数最高达到了180万人&#xff0c;创下Steam历史榜单第二名的好成绩&#xff0c;意料之外的爆火也一度导致幻兽帕鲁出现无法创建4人游戏房间、官方服务器连…

C语言-算法-最短路

【模板】Floyd 题目描述 给出一张由 n n n 个点 m m m 条边组成的无向图。 求出所有点对 ( i , j ) (i,j) (i,j) 之间的最短路径。 输入格式 第一行为两个整数 n , m n,m n,m&#xff0c;分别代表点的个数和边的条数。 接下来 m m m 行&#xff0c;每行三个整数 u …

VUE3:组合式API生命周期

1、onMounted 注册一个回调函数&#xff0c;在组件挂载完成后执行。 组件在以下情况下被视为已挂载&#xff1a; – 1. 其所有同步子组件都已经被挂载。 – 2. 其自身的 DOM 树已经创建完成并插入了父容器中。注意仅当根容器在文档中时&#xff0c;才可以保证组件 DOM 树也在文…

已定式,未定式【高数笔记】

【已定式】 将x-->? 的过程代入到lim中&#xff0c;如果得出的结果可以判断出&#xff0c;lim是有极限的&#xff0c;则为已定式 [举例] lim(1/x)&#xff0c;x--> 无穷 &#xff0c;即&#xff0c;1/ 无穷 0 &#xff0c;所以为已定式 【未定式】 将x-->? 的过程代…

docker 搭建 Seafile 集成 onlyoffice

docker-compose一键部署yaml文件 version: "3"services:db:image: mariadb:10.11container_name: seafile-mysqlenvironment:- MYSQL_ROOT_PASSWORDdb_dev # Requested, set the roots password of MySQL service.- MYSQL_LOG_CONSOLEtruevolumes:- /share/ZFS18_D…

Rust - 变量

不管学什么语言好像都得从变量开始&#xff0c;不过只需要懂得大概就可以了。 但在Rust里不先把变量研究明白后面根本无法进行… 变量绑定 变量赋值❌ 变量绑定✔️ Rust中没有“赋值”一说&#xff0c;而是称为绑定。 int a 3; //C中的变量赋值 a 3; //python中的…

智慧工地可视化综合管理云平台 PC+APP

目录 一、智慧工地可视化数据大屏功能一览 1.首页 2.视频监控 3.机械设备 4.环境监测 5.安全管理 6.质量管理 7.劳务分析 8.进度管理 9.报警统计 二、项目人员管理 1.信息管理 2.信息采集 3.证件管理 危大工程管理 一、智慧工地可视化数据大屏功能一览 包括&am…

transformer_多头注意力机制代码笔记

transformer_多头注意力机制代码笔记 以GPT-2中多头注意力机制代码为例 class CausalSelfAttention(nn.Module):"""因果掩码多头自注意力机制A vanilla multi-head masked self-attention layer with a projection at the end.It is possible to use torch.nn…

【C语言】const修饰指针的不同作用

目录 const修饰变量 const修饰指针变量 ①不用const修饰 ②const放在*的左边 ③const放在*的右边 ④*的左右两边都有const 结论 const修饰变量 变量是可以修改的&#xff0c;如果把变量的地址交给⼀个指针变量&#xff0c;通过指针变量的也可以修改这个变量。 但…

电脑文件打不开是什么原因?常见原因有这9点

在日常生活和工作中&#xff0c;我们经常会使用电脑来处理文件。然而&#xff0c;有时候我们会遇到电脑文件打不开的情况&#xff0c;这给我们的工作和生活带来了很大的不便。本文将为大家介绍电脑文件打不开的原因&#xff0c;帮助大家更好地应对这一问题。 原因1、文件格式问…

交易策略开发:如何揣摩投资心理,研究交易策略

文章目录 揣摩其他投资者的心理&#xff0c;首先要知道他们学习了什么投资知识。永远记住策略一定是弱于机制的。每种交易技术是如何做交易的&#xff0c;各位可以对号入座**马丁网格类均线&#xff0c;MACD等指标类价格行为类缠论类对冲套利类基本面类订单流资金流秘籍类 揣摩…

论文解读:DeepBDC小样本图像分类

Joint Distribution Matters: Deep Brownian Distance Covariance for Few-Shot Classification 摘要 由于每个新任务只给出很少的训练样例&#xff0c;所以few -shot分类是一个具有挑战性的问题。解决这一挑战的有效研究路线之一是专注于学习由查询图像和某些类别的少数支持…