c语言实现三子棋小游戏(涉及二维数组、函数、循环、常量、动态取地址等知识点)

使用C语言实现一个三子棋小游戏

涉及知识点:二维数组自定义函数自带函数库循环常量动态取地址等等

一些细节点:

1、引入自定义头文件,需要用""双引号包裹文件名,目的是为了和官方头文件的<>区分开。
#include "game.h"
2、使用rand()函数,需要先调用sand(),保证每次随机函数生成的值均不一样
3、为了使srand()拥有随机种子,可以使用时间戳函数time()作为值传入使用
4、自定义方法首字母大写,是为了和官方函数库区分开

三子棋代码如下:

效果

在这里插入图片描述

代码

函数头文件 game.h
#include <stdio.h>
#include <time.h>// 定义棋盘的行与列(二位数组的大小)
#define ROW 3
#define COL 3// 菜单打印
void Menu();
//开始游戏
void Game();// 初始化棋盘
void InitChessboard(char board[ROW][COL], int row, int col);
// 打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col);
// 玩家输入
void PlayerInput(char board[ROW][COL], int row, int col);
//电脑输入
void ComputerInput(char board[ROW][COL], int row, int col);
// 判断棋局是否结束
char IsEnd(char board[ROW][COL], int row, int col);
函数主文件 game.c
#define _CRT_SECURE_NO_WARNINGS
// 引入自定义函数头文件
#include "game.h"// 菜单选项
void Menu()
{printf("***************三子棋***************\n");printf("******* 1.开始游戏 0.退出游戏 ******\n");printf("************************************\n");}// 打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){printf(" %c ", board[i][j]);if (j < col-1 ){printf("|");}}printf("\n");if (i < row-1){int k = 0;for (k = 0; k < col; k++){printf("---");if (k < col - 1){printf("|");}}printf("\n");}}printf("\n");
}// 初始化棋盘
void InitChessboard(char board[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}
}// 玩家下棋
void PlayerInput(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;while (1){printf("玩家请下棋(格式为数字+空格+数字,按下回车确认)\n请输入坐标:");scanf("%d %d", &x, &y);// 判断玩家输入值是否超出棋盘if ((x > ROW || x < 1) || (y > COL || y < 1) ){printf("坐标值超出棋盘大小,请重新输入\n");}// 判断坐标位置是否已有棋子else if(board[x-1][y-1] !=  ' '){printf("该位置已存在棋子,请重新输入\n");}// 满足条件,可下棋else{board[x-1][y-1] = '*';// 约定:玩家下棋用*表示break;}}}// 电脑下棋
void ComputerInput(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;while (1){// 产生一个随机位置 范围[0, ROW/COL - 1]x = rand() % ROW; // 行位置y = rand() % COL; // 列位置// 因为随机数的产生做了限制,此处无须再做数值的有效性校验// 位置是否冲突校验(等于空格则认为该位置可下)if (board[x][y] == ' '){board[x][y] = '#';// 约定:电脑下棋用#表示break;}}printf("电脑下棋\n");
}// 判断棋局是否结束
char IsEnd(char board[ROW][COL], int row, int col)
{// 三子棋  三子连珠// 正常来说,需要动态判断填写的值的前后左右斜角是否满足配置的个数// 此处偷懒  直接写死判断每行每列斜行是否一致// 行int i = 0;for (i = 0; i < ROW; i++){// 有一行相同就认为完成三连if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2] != ' '){return board[0][0];}}// 列int j = 0;for ( j = 0; j < COL; j++){// 有一列相同就认为完成三连if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[2][j] != ' '){return board[0][0];}}// 斜角if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && board[2][2] != ' '){return board[0][0];}if ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]) && board[2][0] != ' '){return board[0][2];}// 判断平局int x = 0;int y = 0;for (x = 0; x < ROW; x++){for (y = 0; y < COL; y++){// 但凡存在一个空格说明棋盘还有空位if (board[x][y] == ' '){return 'g'; // go on 继续}}}return 'd';// dogfall 表示平局
}void Game()
{char board[ROW][COL] = { 0 };//初始化棋盘InitChessboard(board, ROW, COL);//打印棋盘PrintBoard(board, ROW, COL);char res = 0;// 循环表示玩家和电脑依次下棋while (1){// 玩家输入PlayerInput(board, ROW, COL);// 输入完毕打印棋盘PrintBoard(board, ROW, COL);// 判断棋局是否结束res = IsEnd(board, ROW, COL);// 不为g表示有了结果,为g就继续下棋if ('g' != res){break;}//电脑输入ComputerInput(board, ROW, COL);// 输入完毕打印棋盘PrintBoard(board, ROW, COL);// 判断棋局是否结束res = IsEnd(board, ROW, COL);// 不为g表示有了结果,为g就继续下棋if ('g' != res){break;}}// 判断赢家/平局if ('*' == res){printf("玩家获胜!\n");}else if ('#' == res){printf("电脑获胜!\n");}else{printf("平局!\n");}}
main函数入口文件 test.c
#define _CRT_SECURE_NO_WARNINGS#include "game.h"int main()
{// 三子棋int a = 0;do{// srand 保证随机数每次生成均不一样srand((unsigned int)time(NULL));//打印菜单Menu();printf("请输入:");scanf("%d", &a);if (1 == a){printf("------三子棋游戏开始------\n\n");// 开始游戏Game();}else if(0 == a){printf("退出游戏\n");return;} else{printf("输出数字错误,请重新输入\n");}} while (a);return 0;
}

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

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

相关文章

C语言数据类型及其使用 (带示例)

目录 1. 基本数据类型 整型 浮点型 字符型 2. 构造数据类型 数组 结构体 联合体&#xff08;共用体&#xff09; 枚举类型 3. 指针类型 4. 空类型 在 C 语言中&#xff0c;数据类型是非常重要的概念&#xff0c;它决定了数据在内存中的存储方式、占用空间大小以及可…

Web自动化之Selenium添加网站Cookies实现免登录

在使用Selenium进行Web自动化时&#xff0c;添加网站Cookies是实现免登录的一种高效方法。通过模拟浏览器行为&#xff0c;我们可以将已登录状态的Cookies存储起来&#xff0c;并在下次自动化测试或爬虫任务中直接加载这些Cookies&#xff0c;从而跳过登录步骤。 Cookies简介 …

NAT 技术:网络中的 “地址魔术师”

目录 一、性能瓶颈&#xff1a;NAT 的 “阿喀琉斯之踵” &#xff08;一&#xff09;数据包处理延迟 &#xff08;二&#xff09;高并发下的性能损耗 二、应用兼容性&#xff1a;NAT 带来的 “适配难题” &#xff08;一&#xff09;端到端通信的困境 &#xff08;二&…

php序列化与反序列化

文章目录 基础知识魔术方法&#xff1a;在序列化和反序列化过程中自动调用的方法什么是 __destruct() 方法&#xff1f;何时触发 __destruct() 方法&#xff1f;用途&#xff1a;语法示例&#xff1a; 反序列化漏洞利用前提条件一些绕过策略绕过__wakeup函数绕过正则匹配绕过相…

docker 占用系统空间太大了,整体迁移到挂载的其他磁盘|【当前普通用户使用docker时,无法指定镜像、容器安装位置【无法指定】】

文章目录 前言【核心步骤皆为 大模型生成的方案】总结步骤应该是&#xff1a;详细步骤如下1. **停止 Docker 服务**2. **备份原数据&#xff08;防止迁移失败&#xff09;**3. **迁移数据到新磁盘**4. **修改 Docker 配置文件**5. **重启 Docker 服务**6. **验证容器和镜像**7.…

设计后端返回给前端的返回体

目录 1、为什么要设计返回体&#xff1f; 2、返回体包含哪些内容&#xff08;如何设计&#xff09;&#xff1f; 举例 3、总结 1、为什么要设计返回体&#xff1f; 在设计后端返回给前端的返回体时&#xff0c;通常需要遵循一定的规范&#xff0c;以确保前后端交互的清晰性…

Springboot 自动化装配的原理

Springboot 自动化装配的原理 SpringBoot 主要作用为&#xff1a;起步依赖、自动装配。而为了实现这种功能&#xff0c;SpringBoot 底层主要使用了 SpringBootApplication 注解。 首先&#xff0c;SpringBootApplication 是一个复合注解&#xff0c;它结合了 Configuration、…

基于vue框架的游戏博客网站设计iw282(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,博客信息,资源共享,游戏视频,游戏照片 开题报告内容 基于FlaskVue框架的游戏博客网站设计开题报告 一、项目背景与意义 随着互联网技术的飞速发展和游戏产业的不断壮大&#xff0c;游戏玩家对游戏资讯、攻略、评测等内容的需求日…

算法-二叉树篇13-路径总和

路径总和 力扣题目链接 题目描述 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回…

8. 示例:对32位数据总线实现位宽和值域覆盖

文章目录 前言示例一&#xff1a;示例二&#xff1a;示例三&#xff1a;仿真与覆盖率分析覆盖点详细说明覆盖率提升技巧常见错误排查 示例四&#xff1a;仿真步骤 前言 针对32位数据总线实现位宽和值域的覆盖&#xff0c;并且能够用xrun运行&#xff0c;查看日志和波形。cover…

TDengine 中的数据库

数据库概念 时序数据库 TDengine 中数据库概念&#xff0c;等同于关系型数据库 MYSQL PostgreSQL 中的数据库&#xff0c;都是对资源进行分割管理的单位。 TDengine 数据库与关系型数据库最大区别是跨库操作&#xff0c;TDengine 数据库跨库操作除了少量几个SQL 能支持外&…

开源电商项目、物联网项目、销售系统项目和社区团购项目

以下是推荐的开源电商项目、物联网项目、销售系统项目和社区团购项目&#xff0c;均使用Java开发&#xff0c;且无需付费&#xff0c;GitHub地址如下&#xff1a; ### 开源电商项目 1. **mall** GitHub地址&#xff1a;[https://github.com/macrozheng/mall](https://git…

如何设计一个短链系统?

短链系统设计的关键要点: 系统功能实现 短链生成:接收长链接,先检查是否已有对应短链,存在则直接返回。否则,使用分布式 ID 生成器(如号段模式、SnowFlake 算法、数据库自增 ID、Redis 自增等)生成唯一 ID,或通过哈希算法(如 MurmurHash)处理长链接得到哈希值。再将生…

数据结构(初阶)(三)----单链表

单链表 概念 概念&#xff1a;链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 结点 与顺序表不同的是&#xff0c;链表的结构类似于带车头的火车车厢&#xff0c;&#xff0c;链表的每个车厢都是独立…

游戏引擎学习第129天

仓库:https://gitee.com/mrxiao_com/2d_game_3 小妙招: vscode:定位错误行 一顿狂按F8 重构快捷键:F2 重构相关的变量 回顾并为今天的内容做准备 今天的工作主要集中在渲染器的改进上&#xff0c;渲染器现在运行得相当不错&#xff0c;得益于一些优化和组织上的改进。我们计…

文字描边实现内黄外绿效果

网页使用 <!DOCTYPE html> <html> <head> <style> .text-effect {color: #ffd700; /* 黄色文字 */-webkit-text-stroke: 2px #008000; /* 绿色描边&#xff08;兼容Webkit内核&#xff09; */text-stroke: 2px #008000; /* 标准语法 *…

yolov8 目标追踪 (源码 +效果图)

1.在代码中 增加了s键开始追踪 e键结束追踪 显示移动距离(代码中可调标尺和像素的比值 以便接近实际距离) 2.绘制了监测区域 只在区域内的检测 3.规定了检测的类别 只有人类才绘制轨迹 import osimport cv2 from ultralytics import YOLO from collections import defaultdic…

2.5 运算符2

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的 2.5.3 赋值运算符 赋值运算符将值存储在左操作数指定的对象中。有两种赋值操作&#xff1a; 1、简单赋值&#xff0c;使用。其中第二…

地弹与振铃

地弹&#xff08;Ground Bounce&#xff09;和振铃&#xff08;Ringing&#xff09;是数字电路中常见的信号完整性问题&#xff0c;两者都与高速开关和寄生参数有关&#xff0c;但表现形式和成因不同。以下是它们的对比及解决方法&#xff1a; 1. 地弹&#xff08;Ground Bounc…

解决Deepseek“服务器繁忙,请稍后再试”问题,基于硅基流动和chatbox的解决方案

文章目录 前言操作步骤步骤1&#xff1a;注册账号步骤2&#xff1a;在线体验步骤3&#xff1a;获取API密钥步骤4&#xff1a;安装chatbox步骤5&#xff1a;chatbox设置 价格方面 前言 最近在使用DeepSeek时&#xff0c;开启深度思考功能后&#xff0c;频繁遇到“服务器繁忙&am…