C语言实现简易n子棋小游戏(代码含注解)

利用C语言简单实现一个n子棋小游戏,棋盘大小由自己定义

将源文件分为   执行游戏的测试文件(test.c)和保存游戏运行逻辑的相关函数的文件(game.c)

头文件中声明符号和函数的定义(game.h)

游戏执行主要依靠二维数组实现,电脑走棋采用随机值的方法简易地实现而非采用高级的算法

头文件 game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <math.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
//符号的定义(定义几子棋)
#define ROW 3
#define COL 3//函数的定义
void InitBoard(char board[ROW][COL], int row, int col);//初始化棋盘
void PrintBoard(char board[ROW][COL], int row, int col);//打印棋盘
void PlayerMove(char board[ROW][COL], int row, int col);//玩家下棋
void ComputerMove(char board[ROW][COL], int row, int col);//电脑下棋
char IsWin(char board[ROW][COL], int row, int col);//判断游戏结果

源文件 test.c

#include "game.h"            //引用头文件
void game() {char ret;char board[ROW][COL];  //二维数组存储游戏数据,ROW、COL为行和列,在头文件game.h中定义InitBoard(board,ROW,COL);//初始化棋盘为空格PrintBoard(board, ROW, COL);//打印棋盘while (1) {printf("玩家走\n\n");PlayerMove(board, ROW, COL);  //玩家下棋Sleep(500);PrintBoard(board, ROW, COL);  //判断玩家是否赢得游戏ret=IsWin(board, ROW, COL);		//返回值为*代表玩家获胜、#代表电脑获胜、D代表平局、C代表未出结果,游戏继续if (ret != 'C') {break;}printf("电脑走\n\n");ComputerMove(board, ROW, COL);//玩家下棋Sleep(1300);PrintBoard(board, ROW, COL);//判断电脑是否赢得游戏ret = IsWin(board, ROW, COL);if (ret != 'C') {break;}}if (ret == '*') {printf("玩家获胜\n\n");}else if (ret =='#') {printf("电脑获胜\n\n");}else if (ret == 'D') {printf("平局\n\n");}PrintBoard(board, ROW, COL);//打印游戏结果}
void menu() {printf("***************************\n");printf("*****      1.play     *****\n");printf("*****      0.exit     *****\n");printf("***************************\n");}
int main() {int n;srand((unsigned int)time(NULL));//设置随机数种子do{menu();printf("请选择:\n");scanf("%d", &n);switch (n){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择\n");break;}} while (n);return 0;
}

源文件 game.c

#include "game.h"                        //引用头文件
void InitBoard(char board[ROW][COL], int row, int col) {for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++) {board[i][j] = ' ';}}
}
void PrintBoard(char board[ROW][COL], int row, int col) {          //打印棋盘for (int j = 0; j < col; j++) {printf(" ___");}printf(" \n");for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {printf("| %c ",board[i][j]);}printf("|\n");if (i < row ) {for (int j = 0; j < col; j++) {printf("|___");}printf("|\n");}}printf("\n");
}
void PlayerMove(char board[ROW][COL], int row, int col) {while (1) {                            //若输入错误则一直循环int x, y;printf("请输入坐标:\n");scanf("%d %d", &x, &y);if (x <= row && x >= 1 && y <= col && y >= 1) {         //判断坐标是否合法if (board[x - 1][y - 1] == ' ')                     //玩家输入的坐标需要减1,因为数组从0开始,同时判断坐标是否被占用过{board[x - 1][y - 1] = '*';break;}else{printf("坐标被占用,请重新输入:\n");}}else{printf("坐标不合法,请重新输入:\n");}}
}
void ComputerMove(char board[ROW][COL], int row, int col) {while (1) {int x = rand() % row;  //生成合法的行坐标int y = rand() % col;  //生成合法的列坐标if (board[x][y]==' ') {board[x][y] = '#';break;}}
}char IsWin(char board[ROW][COL], int row, int col) {int x = 0;                   //计数器判断一行或一列是否遍历结束int sum1 = 0;                //判断*的数量int sum2 = 0;                //判断#的数量for (int i = 0; i < col; i++) {for (int j = 0; j < row; j++) {               //判断每行上是否有连续三个相等的符号if (board[i][j] == '*') {sum1 += 1;}if (board[i][j] == '#') {sum2 +=1;}x++;if(x==row){                                 //一行统计完时if (sum1 == row) {                        //一行全是*return '*';}else if (sum2 == row) {return '#';                         //一行全是#}else {                                  //一行中未分胜负则计数器清零统计下一行sum1 = 0;                         sum2 = 0;x = 0;}}}}for (int j = 0; j < row; j++) {for (int i = 0; i < col; i++) {                //行未分出胜负,则开始统计列if (board[i][j] == '*') {sum1 += 1;}if (board[i][j] == '#') {sum2 += 1;}x++;if (x == row) {                             //一列统计完时if (sum1 == row) {                        //一列全是*return '*';}else if (sum2 == row) {return '#';                         //一列连全是#}else {                                  //一列中未分胜负则计数器清零统计下一列sum1 = 0;sum2 = 0;x = 0;}}}}for (int i = 0; i < col; i++) {for (int j = 0; j < row; j++) {                 //行列都为分出胜负统计主对角线元素if (i == j) {if (board[i][j] == '*') {sum1 += 1;}else if (board[i][j] == '#') {sum2 += 1;}}}}if (sum1 == row) {return '*';                                     //主对角线上元素都为*}else if (sum2 == row) {return '#';                                     //主对角线上元素都为#}else {sum1 = 0;sum2 = 0;                                       //计数器清零统计副对角线}//查看副对角线上的元素,可以先复制一个横向翻转的临时棋盘board1,查看主对角线上的元素char board1[ROW][COL];for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {board1[i][j] = board[i][col-j-1];}}//判断临时棋盘的主对角线元素for (int i = 0; i < col; i++) {for (int j = 0; j < row; j++) {                 if (i == j) {if (board1[i][j] == '*') {sum1 += 1;}else if (board1[i][j] == '#') {sum2 += 1;}}}}if (sum1 == row) {return '*';                                     //主对角线上元素都为*}else if (sum2 == row) {return '#';                                     //主对角线上元素都为#}else {sum1 = 0;sum2 = 0;                                       //计数器清零}//查看是否为平局,则是以上都判断完后,棋盘是否满了,满了则返回‘D’,不满则继续for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {if (board[i][j] == ' ') {return 'C';                     //有地方是空的,游戏还未出结果}}}return 'D';                                 //棋盘满了且没分出胜负,则为平局
}

运行结果(以3子为例):

以上为C语言简易实现n子棋的内容

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

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

相关文章

【AI视野·今日Robot 机器人论文速览 第六十九期】Wed, 3 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Wed, 3 Jan 2024 Totally 5 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers NID-SLAM: Neural Implicit Representation-based RGB-D SLAM in dynamic environments Authors Ziheng Xu, Jianwei Niu, Qingf…

ChatGLM3:打造更智能、更安全的代码解释器和工具使用体验

ChatGLM3 是由智谱AI训练的第三代大型语言模型&#xff0c;它不仅能理解和生成人类语言&#xff0c;还能执行代码、调用工具&#xff0c;并以 markdown 格式进行响应。为了提高用户体验&#xff0c;同时避免用户输入的注入攻击&#xff0c;ChatGLM3 采用了全新的对话格式。下载…

Unity 踩坑记录 AnyState 切换动画执行两次

AnySate 切换动画 Can Transition To Self 将这个勾选去掉&#xff01;&#xff01;&#xff01;

rime中州韵小狼毫 生字注音滤镜 汉字注音滤镜

在中文环境下&#xff0c;多音字是比较常见的现象。对于一些不常见的生僻字&#xff0c;或者一些用于地名&#xff0c;人名中的常见字的冷门读音&#xff0c;如果不能正确的阅读&#xff0c;例如把 荥阳 读成了 miāo yng&#xff0c;则会怡笑大方。 今天我们在rime中州韵小狼…

【复现】DiffTalk

code&#xff1a;GitHub - sstzal/DiffTalk: [CVPR2023] The implementation for "DiffTalk: Crafting Diffusion Models for Generalized Audio-Driven Portraits Animation" 问题1. ERROR: Failed building wheel for pysptk Cython.Compiler.Errors.CompileError:…

Prompt提示工程上手指南:基础原理及实践(一)

想象一下&#xff0c;你在装饰房间。你可以选择一套标准的家具&#xff0c;这是快捷且方便的方式&#xff0c;但可能无法完全符合你的个人风格或需求。另一方面&#xff0c;你也可以选择定制家具&#xff0c;选择特定的颜色、材料和设计&#xff0c;以确保每件家具都符合你的喜…

J3-DenseNet实战

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 环境步骤环境设置数据准备图像信息查看 模型构建模型训练模型效果展示 总结与心得体会 环境 系统: Linux语言: Python3.8.10深度学习…

API设计:从基础到优秀实践

在这次深入探讨中&#xff0c;我们将深入了解API设计&#xff0c;从基础知识开始&#xff0c;逐步进阶到定义出色API的最佳实践。 作为开发者&#xff0c;你可能对许多这些概念很熟悉&#xff0c;但我将提供详细的解释&#xff0c;以加深你的理解。 API设计&#xff1a;电子商…

tp5+微信公众号服务器配置时使用官方sdk还是token验证失败

tp5微信公众号服务器配置时使用官方sdk还是token验证失败&#xff0c;使用之前项目的源码也是校验token不存在 检查常见问题 1、php文件编码问题 使用IDEA查看是否为UTF-8编码 2、检查微信后台Token(令牌)前后是否有空格 3、检查微信后台Token与服务器后台Token是否一致 …

web3d-three.js场景设计器-sprite广告牌

three.js使用Sprite精灵实现文字或者图片广告牌1.将文字绘制到Canvas&#xff0c;调整对应宽高。2.作为Cavans材质绑定到Sprite3.加载到场景调整适当的scale function createLabel({ text, fontSize, textColor, color, imageUrl }) { return new Promise((resolve, reject) &…

Hive 数据同步

一、需求 同步集团的数据到断直连环境。 二、思路 三、同步数据&#xff08;方案&#xff09; 1、环境&#xff1a;断直连模拟环境 2、操作机器&#xff1a;ETL 机器 XX.14.36.216 3、工作路径&#xff1a;cd /usr/local/fqlhadoop/hadoop/bin 4、执行命令&#xff1a; 命令…

Javaweb之SpringBootWeb案例查询部门以及前后端联调的详细解析

2.1 查询部门 2.1.1 原型和需求 查询的部门的信息&#xff1a;部门ID、部门名称、修改时间 通过页面原型以及需求描述&#xff0c;我们可以看到&#xff0c;部门查询&#xff0c;是不需要考虑分页操作的。 2.1.2 接口文档 部门列表查询 基本信息 请求路径&#xff1a;/depts …

Poi实现根据word模板导出-图表篇

往期系列传送门&#xff1a; Poi实现根据word模板导出-文本段落篇 &#xff08;需要完整代码的直接看最后位置&#xff01;&#xff01;&#xff01;&#xff09; 前言&#xff1a; 补充Word中图表的知识&#xff1a; 每个图表在word中都有一个内置的Excel&#xff0c;用于…

网络通信过程的一些基础问题

客户端A在和服务器进行TCP/IP通信时&#xff0c;发送和接收数据使用的是同一个端口吗&#xff1f; 这个问题可以这样来思考&#xff1a;在客户端A与服务器B建立连接时&#xff0c;A需要指定一个端口a向服务器发送数据。当服务器接收到A的报文时&#xff0c;从报文头部解析出A的…

报错curl: (6) Could not resolve host: raw.githubusercontent...的解决办法

我起初想要在macOS系统安装pip包&#xff0c;首先在终端安装homebrew&#xff0c;敲了命令&#xff1a;/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent...)" 之后触发的报错&#xff0c;报错内容&#xff1a;curl: (6) Could not resolve host: raw.…

Asp .Net Core 系列: 集成 CORS跨域配置

文章目录 什么是CORS?Asp .Net Core 中如何配置CORS?CorsPolicyBuilder类详解注册以及使用策略三种方式EnableCors 和 DisableCors 特性关于带证书与不带证书代码的实现跨源&#xff08;cross-origin&#xff09;不带请求证书(Credentials)跨源&#xff08;cross-origin&…

【论文阅读】Self-supervised Learning: Generative or Contrastive

Abstract 研究了在计算机视觉、自然语言处理和图形学习中用于表示的新的自监督学习方法。全面回顾了现有的实证方法&#xff0c;并根据其目的将其归纳为三大类&#xff1a;生成性、对比性和生成性对比&#xff08;对抗性&#xff09;。进一步收集了关于自我监督学习的相关理论…

Mac 安装Nginx教程

Nginx官网 Nginx官网英文 1.在终端输入brew search nginx 命令检查nginx是否安装了 2. 安装命令&#xff1a;brew install nginx 3. 查看Nginx信息命令brew info nginx 4. 启动 nginx方式&#xff1a;在终端里输入 nginx 5.查看 nginx 是否启动成功 在浏览器中访问http://l…

经典算法-模拟退火算法求解旅行商问题TSP

经典算法-模拟退火算法求解旅行商问题TSP 旅行商问题&#xff08;Traveling Salesman Problem, TSP&#xff09;是组合优化中的经典问题。简单地说&#xff0c;一个旅行商需要访问N个城市&#xff0c;并返回到出发城市&#xff0c;问题是找到最短的可能路线&#xff0c;使得每…

PPT插件-布局参考-增加便携尺寸功能

PPT自带的尺寸为很久的尺寸&#xff0c;很多尺寸不常用&#xff0c;这里增加一些画册尺寸&#xff0c;用于PPT排版设计。 软件介绍 PPT大珩助手是一款全新设计的Office PPT插件&#xff0c;它是一款功能强大且实用的PPT辅助工具&#xff0c;支持Wps Word和Office Word&#x…