当前位置: 首页 > news >正文

C语言实现三字棋

实现以下:

1游戏不退出,继续玩下一把(循环)

2应用多文件的形式完成

test.c. --测试游戏

game.c -游戏函数的实现

game.h -游戏函数的声明

(2)游戏再走的过程中要进行数据的存储,可以使用3*3的二维数组

char bord[3][3];

(2)没下棋之前数组中存放空格

以下都是具体函数的实现,都在game.c文件中完成,test.c调用,game.h定义

第一步初始化棋盘

//初始化棋盘为空格
void InitBoard(char board[ROW][COL],int row,int col)
{int i = 0;for(i = 0;i<row;i++){int j = 0;for(j = 0;j < col;j++){board[i][j] =' ';}}
}

第二步打印棋盘

//版本1
// void DisplayBoard(char board[ROW][COL],int row,int col)
// {
//     int i = 0;
//     for(i = 0;i<row;i++)
//     {
//         int j = 0;
//         for(j = 0; j<col;j++)
//         {
//             printf("%c",board[i][j]);
//         }
//         printf("\n");
//     }
// }//版本2
// void DisplayBoard(char board[ROW][COL],int row,int col)
// {
//     int i = 0;
//     for(i = 0;i<row;i++)
//     {
//         //1.打印数据
//         printf("%c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
//         //打印分割线
//         if(i < row -1)
//         {
//             printf("---|---|---");
//         } 
//         // int j = 0;
//         // for(j = 0; j<col;j++)
//         // {
//         //     printf("%c",board[i][j]);
//         // }
//         // printf("\n");
//     }
// }//版本3
//打印棋盘
void DisplayBoard(char board[ROW][COL],int row,int col)
{int i = 0;for(i = 0;i<row;i++){//1.打印数据int j = 0;for(j = 0; j < col;j++){printf(" %c ",board[i][j]);if(j < col - 1){printf("|");}}printf("\n");//打印分割线if(i < row -1){//printf("---|---|---");int j = 0;for(j = 0; j < col;j++){printf("---");if(j < col - 1){printf("|");}}printf("\n");} }
}

第三步玩家开始下棋

//玩家下棋
void PlayerMove(char board[ROW][COL],int row,int col)
{int x = 0;int y = 0;printf("玩家下棋:>\n");while (1){printf("请输入下棋的坐标,中间使用空格>:");scanf("%d %d",&x,&y);//坐标合法if(x >= 1 && x <= row && y >= 1 && y <= col){if(board[x-1][y-1] == ' ') //可以落子{board[x - 1][y - 1] = '*';break;} else   //不能落子{printf("坐标被占用,不能落子,请重新输入坐标\n");}} else  //非法{printf("坐标非法,重新输入\n");}}}

第四步电脑下棋

//电脑随机下棋,随机生成坐标
void ComputerMove(char board[ROW][COL],int row,int col)
{int x = 0; // 0~row-1int y = 0; // 0~col-1printf("电脑下棋:>\n");while (1){x = rand() % row;y = rand() % col;if(board[x][y] == ' '){board[x][y] = '#';break;}}}

第五步判断输赢

//判断输赢
char IsWin(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][0] != ' '){return board[i][0];}}//判断列是否三个相等for(i = 0;i < col; i++){if(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' '){return board[0][i];}}//判断对角线是否三个相等for(i = 0;i < col; i++){if(board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' '){return board[1][1];}if(board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[1][1];}}//平局if(IsFull(board,row,col) == 1){return 'Q';}//继续return 'C';
}

 以下是完整版内容

game.h文件

//声明函数
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
//初始化棋盘
void InitBoard(char board[ROW][COL],int row,int col);
//打印棋盘
void DisplayBoard(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);//判断输赢
//玩家赢 -'*'
//电脑赢- '#'
//平局 -'Q'
//继续游戏 -'C'
char IsWin(char board[ROW][COL],int row,int col);

game.c文件

#include "game.h"//初始化棋盘为空格
void InitBoard(char board[ROW][COL],int row,int col)
{int i = 0;for(i = 0;i<row;i++){int j = 0;for(j = 0;j < col;j++){board[i][j] =' ';}}
}
//版本1
// void DisplayBoard(char board[ROW][COL],int row,int col)
// {
//     int i = 0;
//     for(i = 0;i<row;i++)
//     {
//         int j = 0;
//         for(j = 0; j<col;j++)
//         {
//             printf("%c",board[i][j]);
//         }
//         printf("\n");
//     }
// }//版本2
// void DisplayBoard(char board[ROW][COL],int row,int col)
// {
//     int i = 0;
//     for(i = 0;i<row;i++)
//     {
//         //1.打印数据
//         printf("%c | %c | %c \n",board[i][0],board[i][1],board[i][2]);
//         //打印分割线
//         if(i < row -1)
//         {
//             printf("---|---|---");
//         } 
//         // int j = 0;
//         // for(j = 0; j<col;j++)
//         // {
//         //     printf("%c",board[i][j]);
//         // }
//         // printf("\n");
//     }
// }//版本3
//打印棋盘
void DisplayBoard(char board[ROW][COL],int row,int col)
{int i = 0;for(i = 0;i<row;i++){//1.打印数据int j = 0;for(j = 0; j < col;j++){printf(" %c ",board[i][j]);if(j < col - 1){printf("|");}}printf("\n");//打印分割线if(i < row -1){//printf("---|---|---");int j = 0;for(j = 0; j < col;j++){printf("---");if(j < col - 1){printf("|");}}printf("\n");} }
}//玩家下棋
void PlayerMove(char board[ROW][COL],int row,int col)
{int x = 0;int y = 0;printf("玩家下棋:>\n");while (1){printf("请输入下棋的坐标,中间使用空格>:");scanf("%d %d",&x,&y);//坐标合法if(x >= 1 && x <= row && y >= 1 && y <= col){if(board[x-1][y-1] == ' ') //可以落子{board[x - 1][y - 1] = '*';break;} else   //不能落子{printf("坐标被占用,不能落子,请重新输入坐标\n");}} else  //非法{printf("坐标非法,重新输入\n");}}}//电脑随机下棋,随机生成坐标
void ComputerMove(char board[ROW][COL],int row,int col)
{int x = 0; // 0~row-1int y = 0; // 0~col-1printf("电脑下棋:>\n");while (1){x = rand() % row;y = rand() % col;if(board[x][y] == ' '){board[x][y] = '#';break;}}}int IsFull(char board[ROW][COL],int row,int col)
{int i = 0;for(i = 0;i < row;i++){int j = 0;for(j = 0;j< col;j++){if(board[i][j] == ' '){return 0;}}}return 1;
}//判断输赢
char IsWin(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][0] != ' '){return board[i][0];}}//判断列是否三个相等for(i = 0;i < col; i++){if(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' '){return board[0][i];}}//判断对角线是否三个相等for(i = 0;i < col; i++){if(board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' '){return board[1][1];}if(board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[1][1];}}//平局if(IsFull(board,row,col) == 1){return 'Q';}//继续return 'C';
}

test.c文件

#include "game.h"void menu()
{printf("**********************\n");printf("*****  1.play   ******\n");printf("*****  0.eixt   ******\n");printf("**********************\n");
}void game()
{char board[ROW][COL] = {0};InitBoard(board,ROW,COL);//打印棋盘DisplayBoard(board,ROW,COL);//下棋char ret = 0;while (1){//玩家下棋PlayerMove(board, ROW, COL);//打印棋盘DisplayBoard(board,ROW,COL);//判断输赢ret = IsWin(board,ROW,COL);if(ret != 'C'){break;}//电脑下棋ComputerMove(board, ROW, COL); //打印棋盘DisplayBoard(board,ROW,COL);//判断输赢ret = IsWin(board,ROW,COL);if(ret != 'C'){break;}}if (ret == '*'){printf("玩家赢\n");} else if(ret == '#'){printf("电脑赢\n");} else{printf("平局\n");}}
int main()
{int input = 0;srand((unsigned int) time(NULL));do{menu();printf("请选择:>");scanf("%d",&input);switch (input){case 1:printf("三字棋游戏\n");game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择!\n");break;}} while (input);return 0;
}

相关文章:

C语言实现三字棋

实现以下&#xff1a; 1游戏不退出&#xff0c;继续玩下一把&#xff08;循环&#xff09; 2应用多文件的形式完成 test.c. --测试游戏 game.c -游戏函数的实现 game.h -游戏函数的声明 (2)游戏再走的过程中要进行数据的存储&#xff0c;可以使用3*3的二维数组 char bor…...

【LeetCode】35.复杂链表的复制

题目 请实现 copyRandomList 函数&#xff0c;复制一个复杂链表。在复杂链表中&#xff0c;每个节点除了有一个 next 指针指向下一个节点&#xff0c;还有一个 random 指针指向链表中的任意节点或者 null。 示例 1&#xff1a; 输入&#xff1a;head [[7,null],[13,0],[11,4]…...

代码大全阅读随笔(五)

数据初始化要点&#xff1a; 数据初始化过程很容易出错&#xff0c;所以请使用本章介绍的方法&#xff0c;来初始化数据&#xff0c;从而避免由于非预期的初始化值而造成的错误。 最小化变量作用域。 使用相同的变量的语句尽可能的集中在一起。 早期绑定会减少灵活性&#xff0…...

No1.详解【2023年全国大学生数学建模竞赛】C题——蔬菜类商品的自动定价与补货决策(代码 + 详细输出 + 数据集代码 下载)

时间告诉你什么叫衰老,回忆告诉你什么叫幼稚。不要总在过去的回忆里纠缠,昨天的太阳,晒不干今天的衣裳。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客…...

有什么好用的电容笔?apple pencil替代品推荐

近年来&#xff0c;电容笔越来越成为人们日常生活中常见的数码产品之一。电容笔的便捷性得到了消费者的认可。它逐渐取代无纸化书写。那么到底电容笔哪个品牌好呢&#xff0c;电容笔哪一款最好用呢&#xff0c;今天小编给大家总结几款市面好用的电容笔&#xff0c;让我们一起来…...

什么是回调函数?写出一个示例?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 回调函数⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前…...

深度学习在医疗保健领域的应用:从图像识别到疾病预测

文章目录 深度学习在医学影像识别中的应用1. 癌症检测2. 病理学图像分析3. 医学图像分割 深度学习在疾病预测中的应用1. 疾病风险预测2. 疾病诊断辅助3. 药物研发 深度学习在个性化治疗中的应用1. 基因组学分析2. 临床数据集成 深度学习在医疗保健中的挑战和未来数据隐私和安全…...

SpringBoot实现自定义environment中的value加密

environment中的value为什么要加密&#xff1f; 未经过加密的配置文件&#xff0c;密码均是采用明文密码&#xff0c;很容易导致信息泄露。 SpringBoot environment中的value加密代码如下 package com.xxx.core.encryption;import com.google.common.collect.Maps; import lomb…...

celery的用法--任务调度

在Celery中&#xff0c;任务&#xff08;Task&#xff09;是执行特定操作的基本单元。任务可以异步执行&#xff0c;可以带有参数&#xff0c;可以返回结果&#xff0c;可以链式调用&#xff0c;还可以设置任务优先级、超时等属性。 1.定义任务&#xff1a; 使用app.task装饰器…...

MyBatis-Plus学习笔记总结

一、查询 构造器分为QueryWrapper和LambdaQueryWrapper 创建实体类User package com.system.mybatisplus.model;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.…...

How Language Model Hallucinations Can Snowball

本文是LLM系列文章&#xff0c;针对《How Language Model Hallucinations Can Snowball》的翻译。 语言模型幻觉是如何产生雪球的 摘要1 引言2 为什么我们期待幻觉像滚雪球一样越滚越大&#xff1f;3 实验4 我们能防止雪球幻觉吗&#xff1f;5 相关工作6 结论局限性 摘要 在实…...

autojs修改顶部标题栏颜色

顶部标题栏的名字是statusBarColor 不是toolbar。难怪我搜索半天搜不到 修改之后变成这样了 代码如下&#xff1a; "ui"; importClass(android.view.View); importClass(android.graphics.Color); ui.statusBarColor(Color.parseColor("#ffffff")); ui.…...

arppy gis 读取text 并批量添加字段 arcpy.AddField_management

arppy gis 读取text 并批量添加字段 arcpy.AddField_management 例&#xff1a;给“省级行政区域”添加“A、B、C、D” 4个字段。 &#xff08;1&#xff09;用Excel制作出字段及其描述表&#xff0c;定义字段结构&#xff1b; &#xff08;2&#xff09;复制除标题行以为的内…...

Pandas中at、iat函数详解

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 at 函数&#xff1a;通过行名和列名来取值&#xff08;取行名为a, 列名为A的值&#xff09; iat 函数&#xff1a;通过行号和列号来取值&#xff08;取第1行&#xff0c;第1列的值&#xff09; 本文给出at、iat常见的…...

【Spring Boot】JPA — JPA入门

JPA简介 1. JPA是什么 JPA是Sun官方提出的Java持久化规范&#xff0c;它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据&#xff0c;通过注解或者XML描述“对象-关系表”之间的映射关系&#xff0c;并将实体对象持久化到数据库中&#xff0c;极大地简…...

c#反射(Reflection)

当我们在C#中使用反射时&#xff0c;可以动态地获取和操作程序集、类型和成员。下面是一个简单的C#反射示例&#xff0c;展示了如何使用反射来调用一个类的方法&#xff1a; using System; using System.Reflection;public class MyClass {public void MyMethod(){Console.Wri…...

Lua 元表和元方法

一、元表 元表可以修改一个值在面对一个未知操作时的行为&#xff0c;Lua 中使用 table 作为元表的承载。 元表只能给出预先定义的操作集合的行为&#xff0c;比类会更加受限制&#xff0c;不支持继承。 Lua 每一个值都可以有元表 &#xff1a; 表和用户数据类型都具有各自…...

【Git】01-Git基础

文章目录 Git基础1. 简述1.1 版本管理演变1.2 Git的特点 2. Git安装2.1 安装文档2.1 配置user信息 3. 创建仓库3.1 场景3.2 暂存区和工作区 4. 重命名5. 常用git log版本历史5.1 查看当前分支日志5.2 简洁查看日志5.3 查看最近指定条数的日志 6. 通过图形界面工具查看版本7. 探…...

【Vue2.0源码学习】生命周期篇-初始化阶段(initState)

文章目录 1. 前言2. initState函数分析3. 初始化props3.1 规范化数据3.2 initProps函数分析3.3 validateProp函数分析3.4 getPropDefaultValue函数分析3.5 assertProp函数分析 4. 初始化methods5. 初始化data6. 初始化computed6.1 回顾用法6.2 initComputed函数分析6.3 defineC…...

专升本英语零基础学习

1. 词法 1.1 名词 名词&#xff08;n.)&#xff0c;是词类的一种&#xff0c;属于实词。他表示人&#xff0c;物&#xff0c;事&#xff0c;地点或抽象概念的统一名称。 1.1 名词的含义 名词&#xff08;n.)&#xff0c;是词类的一种&#xff0c;属于实词。他表示人&#x…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...