C语言:-三子棋游戏代码:分支-循环-数组-函数集合

思路分析:

1、写菜单

2、菜单之后进入游戏的操作

3、写函数 实现游戏

        3.1、初始化棋盘函数,使数组元素都为空格

        3.2、打印棋盘 棋盘的大概样子

        3.3、玩家出棋

                3.3.1、限制玩家要下的坐标位置

                3.3.2、判断玩家要下的位置是否由棋子

        3.4、电脑出棋

                3.4.1、用随机数 让电脑随机生成坐标

        3.5、判断玩家和电脑谁赢了

代码实现

game.h文件

#ifndef _GAME_H
#define _GAME_H
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.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 ct_move(char board[ROW][COL], int row, int col);
char Iswin(char board[ROW][COL], int row, int col);
#endif

game.c--游戏算法实现

#include "game.h"
//初始化数组为 空格
void Initboard(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 Displayboard(char board[ROW][COL], int row, int col)
{int i;for (int i = 0; i < row; i++){int j;for (j = 0; j < col; j++){//打印 空格 数组元素 空格printf(" %c ", board[i][j]);//最后一列不打印 |if (j < col - 1){printf("|");}}printf("\n");//最后一行不打印 —--if (i < row - 1){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, y;printf("玩家走->:\n");//不到停止条件 一致循环while (1){printf("请输入要下的坐标:\n");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("该坐标被占用!");}}else{printf("坐标非法,请重新输入");}}
}//电脑出棋
void ct_move(char board[ROW][COL], int row, int col)
{int x, y;printf("电脑走->:\n");//用sand函数 使电脑生成0-2的随机数x = rand() % row;y = rand() % col;while (1){if (board[x][y] == ' '){board[x][y] = '#';break;}}
}//看棋盘是否下满了
int isfull(char board[ROW][COL], int row, int col)
{int i ,j;for(i = 0;i < row;i++){for(j = 0;j < col;j++){//如果数组元素中还有 空格 那就返回 0if(board[i][j] == ' '){return 0;}            }}return 1;
}//看玩家和电脑谁赢了
char Iswin(char board[ROW][COL], int row, int col)
{int i;//横相等for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' '){return board[i][0];}}//竖相等for (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' '){return board[i][0];}}//从左到右 对角线相等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];}//棋盘满了返回 1  再返回 q  平局if(1 == isfull(board,ROW,COL)){return 'q';}//如果以上条件都不满足,返回 'c' 表示游戏继续进行。return 'c';
}

test.c---测试文件

#include "game.h"
// 菜单栏
void menu()
{printf("=========================\n");printf("=========================\n");printf("========三子棋1.0=========\n");printf("===1 开始游戏==0 退出游戏==\n");printf("=========================\n");
}
// 游戏的算法实现
void game()
{char ret;// 数组-存放棋盘信息char board[ROW][COL] = {0};// 初始化棋盘 使所有元素为空格Initboard(board, ROW, COL);// 打印棋盘Displayboard(board, ROW, COL);while (1){// 玩家下棋playermove(board, ROW, COL);// 下完再打印一次棋盘Displayboard(board, ROW, COL);// 判断玩家是否赢了ret = Iswin(board, ROW, COL);if (ret != 'c'){break;}// 电脑下棋ct_move(board, ROW, COL);Displayboard(board, ROW, COL);// 判断电脑是否赢了ret = Iswin(board, ROW, COL);/**   *玩家赢*    #电脑赢*    c继续游戏*    q平局*/// 如果ret 不等于 c 不继续游戏 那就break 退出游戏if (ret != 'c'){break;}}if (ret == '*'){printf("玩家赢了\n");}else if (ret == '#'){printf("电脑赢了\n");}else if (ret == 'q'){printf("平局\n");}
}void test()
{menu();int input;do{printf("请选择:\n 1-> 开始游戏    0-> 退出游戏\n");scanf("%d", &input);switch (input){case 1:printf("game start!\n");game();break;case 0:printf("game over!\n");break;default:printf("无效选项,请重新选择");break;}} while (input);
}
int main(int argc, char const *argv[])
{// 随机函数srand(time(NULL));test();return 0;
}

效果展示

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

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

相关文章

【VS 调试WebApi —— localhost 及 ip访问】

VS 调试WebApi —— localhost 及 ip访问 1、localhost访问1.1 localhost端口修改 2、IP访问2.1 运行项目2.2 打开配置文件2.3 修改配置文件2.4 保存后重新运行 3、最终效果 1、localhost访问 VS运行项目时默认localhost访问。1.1 localhost端口修改 右键项目选中【属性】 --…

Flink链接Kafka

一、基于 Flink 的 Kafka 消息生产者 Kafka 生产者的创建与配置&#xff1a; 代码通过 FlinkKafkaProducer 创建 Kafka 生产者&#xff0c;用于向 Kafka 主题发送消息。Flink 执行环境的配置&#xff1a; 配置了 Flink 的检查点机制&#xff0c;确保消息的可靠性&#xff0c;支…

带头双向循环链表(数据结构初阶)

文章目录 双向链表链表的分类概念与结构实现双向链表定义链表结构链表打印判空申请结点初始化头插尾插头删尾删查找指定位置插入和删除销毁链表 顺序表和链表的分析结语 欢迎大家来到我的博客&#xff0c;给生活来点impetus&#xff01;&#xff01; 这一节我们学习双向链表&a…

41,【7】CTFHUB WEB SQL Cookie注入

搜索知Cookie 是由服务器发送给用户浏览器的一小段文本信息&#xff0c;浏览器会将其保存下来&#xff0c;并且在后续的请求中自动将 Cookie 发送回服务器。 所以可以联想到cookie会出现在请求处&#xff0c;可以使用BP抓包 找到了 又是整形注入 可知字节数为2 找到回显点 得…

unity学习16:unity里向量的计算,一些方法等

目录 1 unity里的向量&#xff1a; 2 向量加法 2.1 向量加法的几何意义 2.2向量加法的标量算法 3 向量减法 3.1 向量减法的几何意义 3.2 向量减法的标量算法 4 向量的标量乘法 5 向量之间的乘法要注意是左乘 还是右乘 5.1 注意区别 5.2 向量&#xff0c;矩阵&#x…

卷积神经05-GAN对抗神经网络

卷积神经05-GAN对抗神经网络 使用Python3.9CUDA11.8Pytorch实现一个CNN优化版的对抗神经网络 简单的GAN图片生成 CNN优化后的图片生成 优化模型代码对比 0-核心逻辑脉络 1&#xff09;Anacanda使用CUDAPytorch2&#xff09;使用本地MNIST进行手写图片训练3&#xff09;…

堆的实现【C++】

堆的实现 概念实现完整代码 概念 介绍堆之前得说一下二叉树&#xff0c;因为堆的逻辑结构是二叉树&#xff0c;二叉树的树的子集&#xff0c;树只有一个根节点&#xff0c;向下衍生出了很多节点&#xff0c;并且这个节点之间相互没有连接&#xff0c;除非是父子节点&#xff0…

UI自动化测试:异常截图和page_source

自动化测试过程中&#xff0c;是否遇到过脚本执行中途出错却不知道原因的情况&#xff1f;测试人员面临的不仅是问题的复现&#xff0c;还有对错误的快速定位和分析。而异常截图与页面源码&#xff08;Page Source&#xff09;的结合&#xff0c;正是解决这一难题的利器。 在实…

ASP.NET Core - 依赖注入(三)

ASP.NET Core - 依赖注入&#xff08;三&#xff09; 4. 容器中的服务创建与释放 4. 容器中的服务创建与释放 我们使用了 IoC 容器之后&#xff0c;服务实例的创建和销毁的工作就交给了容器去处理&#xff0c;前面也讲到了服务的生命周期&#xff0c;那三种生命周期中对象的创…

gitlab runner正常连接 提示 作业挂起中,等待进入队列 解决办法

方案1 作业挂起中,等待进入队列 重启gitlab-runner gitlab-runner stop gitlab-runner start gitlab-runner run方案2 启动 gitlab-runner 服务 gitlab-runner start成功启动如下 [rootdocserver home]# gitlab-runner start Runtime platform …

麦田物语学习笔记:构建游戏的时间系统

基本流程 1.代码思路 (1)新建一个TimeManager.cs (2)创建枚举变量来表示四季,在TimeManager里需要的变量有: 游戏内的秒,分钟,小时,天,月,年;游戏内的季节;控制一个季节有多少个月;控制时间的暂停;计时器tikTime (3)在Settings里添加计时器的阈值,以及各个时间的进位 (4)初始化…

Spring Boot教程之五十七:在 Apache Kafka 上发布 JSON 消息

Spring Boot | 如何在 Apache Kafka 上发布 JSON 消息 Apache Kafka是一个发布-订阅消息系统。消息队列允许您在进程、应用程序和服务器之间发送消息。在本文中&#xff0c;我们将了解如何在 Spring Boot 应用程序中向 Apache Kafka 发送 JSON 消息。 为了了解如何创建 Spring…

计算机网络 (44)电子邮件

一、概述 电子邮件&#xff08;Electronic Mail&#xff0c;简称E-mail&#xff09;是因特网上最早流行的应用之一&#xff0c;并且至今仍然是因特网上最重要、最实用的应用之一。它利用计算机技术和互联网&#xff0c;实现了信息的快速、便捷传递。与传统的邮政系统相比&#…

代码随想录算法训练营day02| 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

977. 有序数组的平方 双指针&#xff0c;新数组用k&#xff1b; 由于已经排序&#xff0c;所以比较两侧数据即可&#xff1b; class Solution { public:vector<int> sortedSquares(vector<int>& nums) {vector<int> ans(nums.size());int k nums.siz…

Unity 语音转文字 Vosk 离线库

市场有很多语音库&#xff0c;这里介绍Vosk SDK 除了支持untiy外还有原生开发服务器等 目录 安装unity示例demo下载语音训练文件运行demo结尾一键三联 注意事项 有可能debug出来的文本是空的&#xff0c;&#xff08;确保麦克风正常&#xff0c;且索引正确&#xff09;分大…

网络网络层ICMP协议

网络网络层ICMP协议 1. ICMP 协议介绍 ICMP&#xff08;Internet Control Message Protocol&#xff09;是 TCP/IP 协议簇中的网络层控制报文协议。用于在 IP 主机、路由器之间传递控制消息&#xff0c;提供可能有关通信问题的反馈信息。 以及用于网络诊断或调试&#xff08;…

Lianwei 安全周报|2025.1.13

新的一周又开始了&#xff0c;以下是本周「Lianwei周报」&#xff0c;我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件&#xff0c;保证大家不错过本周的每一个重点&#xff01; 政策/标准/指南最新动态 01 美国国土安全部发布《公共部门生成式人工智能部署手…

计算机网络(五)运输层

5.1、运输层概述 概念 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时…

卷积神经02-CUDA+Pytorch环境安装

卷积神经02-CUDAPytorch环境安装 在使用Python进行pytorch的使用过程中遇到各种各样的版本冲突问题&#xff0c;在此进行记录 0-核心知识脉络 1&#xff09;根据自己电脑的CUDA版本安装对应版本的Pytorch&#xff0c;充分的使用GPU性能2&#xff09;电脑要先安装【CUDA ToolKi…

shell 脚本基本练习

一、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容&#xff0c;不存在则创建一个文件将创建时间写入。 1. 创建ex1.sh文件 [rootopenEuler mnt]# vim ex1.sh创建如下&#xff1a; 2. 根据题目编写脚本 n"/tmp/siz.log"if [ -f "$n" ] thenc…