三子棋/井字棋(C语言)
这个游戏需要用到三个文件
game.h头文件用来申明函数和导包
game.h如下:
#pragma once
#define ROW 3
#define COL 3
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
//初始化棋盘的函数
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);
//玩家赢返回"w"
//电脑赢返回"c"
//平局返回"q"
//继续返回"a"
char Iswin(char board[ROW][COL], int row, int col);
//判断棋盘是否已经满了
int IsFull(char board[ROW][COL], int row, int col);
game.c如下:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
#include <stdio.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 = 0;
for (i = 0; i < row; i++)
{
//打印数据
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)
{
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;
int y;
while (1)
{
printf("玩家下棋>\n");
printf("请输入坐标,坐标格式为 x y \n");
scanf("%d%d", &x, &y);
if ((x > 0 && x <= row)&& (y > 0 && y <= col)) {
if (board[x - 1][y - 1] != ' ') {
printf("此坐标已经被占用,请重新输入\n");
continue;
}
board[x - 1][y - 1] = 'w';
break;
}
else
{
printf("输入的坐标不合法,请重新输入\n");
continue;
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col) {
printf("电脑下棋>\n");
int x = 0;
int y = 0;
//抢占天元
if (board[1][1] == ' ') {
board[1][1] = 'c';
return;
}
//抢先赢
int i = 0;
for (i = 0; i < row; i++) {
if (board[i][0] == board[i][1] && board[i][0] == 'c' && board[i][2] == ' ') {
board[i][2] = 'c';
return;
}
else if (board[i][1] == board[i][2] && board[i][1] == 'c' && board[i][0] == ' ') {
board[i][0] = 'c';
return;
}
else if (board[i][0] == board[i][2] && board[i][0] == 'c' && board[i][1] == ' ') {
board[i][1] = 'c';
return;
}
}
for (i = 0; i < col; i++) {
if (board[0][i] == board[1][i] && board[0][i] == 'c' && board[2][i] == ' ') {
board[2][i] = 'c';
return;
}
else if (board[1][i] == board[2][i] && board[1][i] == 'c' && board[0][i] == ' ') {
board[0][i] = 'c';
return;
}
else if (board[0][i] == board[2][i] && board[0][i] == 'c' && board[1][i] == ' ')
{
board[1][i] = 'c';
return;
}
}
if (board[0][0] == board[1][1] && board[1][1] == 'c' && board[2][2] == ' ') {
board[2][2] = 'c';
return;
}
if (board[2][2] == board[1][1] && board[1][1] == 'c' && board[0][0] == ' ') {
board[0][0] = 'c';
return;
}
if (board[2][2] == board[0][0] && board[0][0] == 'c' && board[1][1] == ' ') {
board[1][1] = 'c';
return;
}
if (board[1][1] == board[0][2] && board[1][1] == 'c' && board[2][0] == ' ') {
board[2][0] = 'c';
return;
}
if (board[1][1] == board[2][0] && board[1][1] == 'c' && board[0][2] == ' ') {
board[0][2] = 'c';
return;
}
if (board[0][2] == board[2][0] && board[0][2] == 'c' && board[1][1] == ' ') {
board[1][1] = 'c';
return;
}
//堵玩家,就是玩家有2个相连时要堵
//当玩家 行 有两个相连时堵
for (i = 0; i < row; i++) {
if (board[i][0] == board[i][1] && board[i][0] == 'w' && board[i][2] == ' ') {
board[i][2] = 'c';
return;
}
else if(board[i][1] == board[i][2] && board[i][1] == 'w' && board[i][0] == ' '){
board[i][0] = 'c';
return;
}
else if (board[i][0] == board[i][2] && board[i][0] == 'w' && board[i][1] == ' ') {
board[i][1] = 'c';
return;
}
}
//当玩家 列 有两个相连时堵
for (i = 0; i < col; i++) {
if (board[0][i] == board[1][i] && board[0][i] == 'w' && board[2][i] == ' ') {
board[2][i] = 'c';
return;
}else if (board[1][i] == board[2][i] && board[1][i] == 'w' && board[0][i] == ' ') {
board[0][i] = 'c';
return;
}
else if(board[0][i] == board[2][i] && board[0][i] == 'w' && board[1][i] == ' ')
{
board[1][i] = 'c';
return;
}
}
//当玩家 斜着的 有两个相连时堵
if (board[0][0] == board[1][1] && board[1][1] == 'w' && board[2][2] == ' ') {
board[2][2] = 'c';
return;
}
if (board[2][2] == board[1][1] && board[1][1] == 'w' && board[0][0] == ' ') {
board[0][0] = 'c';
return;
}
if (board[2][2] == board[0][0] && board[0][0] == 'w' && board[1][1] == ' ') {
board[1][1] = 'c';
return;
}
if (board[1][1] == board[0][2] && board[1][1] == 'w' && board[2][0] == ' ') {
board[2][0] = 'c';
return;
}
if (board[1][1] == board[2][0] && board[1][1] == 'w' && board[0][2] == ' ') {
board[0][2] = 'c';
return;
}
if (board[0][2] == board[2][0] && board[0][2] == 'w' && board[1][1] == ' ') {
board[1][1] = 'c';
return;
}
//随机乱下
while (1)
{
x = rand() % row;//0-2
y = rand() % col;//0-2
if (board[x][y] == ' ') {
board[x][y] = 'c';
break;
}
}
}
char Iswin(char board[ROW][COL], int row, int col) {
//行
int i = 0;
for (i = 0; i < row; i++) {
int i1 = 0;
char temp = board[i][i1];//每一行第一个元素记录到临时变量里
for (i1 = 1; i1 < col; i1++) {
if (temp != board[i][i1]) {
break;//一旦这一行有不同的就跳出这一行的判断
}
temp = board[i][i1];
if (temp == board[i][col - 1]&&temp!=' ') {
return board[i][col - 1];//如果temp已经记录到这一行最后一个元素,那就说明这一行全部相等,返回结果
}
}
}
//列
int j = 0;
for (j = 0; j < col; j++) {
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ') {
return board[0][j];
}
}
//对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') {
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ') {
return board[0][2];
}
//平局
if (IsFull(board,row,col)) {
return 'q';
}
//继续
return 'a';
}
//判断棋盘是否已满
int IsFull(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++) {
if (board[i][j] == ' ') {
return 0;
}
}
}
return 1;
}
text.c如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game.h"
void menu() {
printf("*******************\n");
printf("*****1.play********\n");
printf("*****0.exit********\n");
printf("*******************\n");
}
void game() {
char flag;
char board[ROW][COL] = { 0 };
//初始化棋盘的功能
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
while (1)
{
//玩家下棋
PlayerMove(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
//判断玩家胜利
flag = Iswin(board, ROW, COL);
if (flag != 'a') {
break;
}
//电脑下棋
ComputerMove(board, ROW, COL);
//判断电脑胜利
flag = Iswin(board, ROW, COL);
if (flag != 'a') {
break;
}
//打印棋盘
DisplayBoard(board, ROW, COL);
}
if (flag == 'w') {
printf("玩家赢\n");
}
else if(flag == 'c')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
DisplayBoard(board, ROW, COL);
}
int main() {
srand((unsigned int)time(NULL));//设置随机数生成起点
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
相关文章:
三子棋/井字棋(C语言)
这个游戏需要用到三个文件 game.h头文件用来申明函数和导包 game.h如下: #pragma once #define ROW 3 #define COL 3 #include <stdlib.h> #include <time.h> #include <stdio.h>//初始化棋盘的函数void InitBoard(char board[ROW][COL], int row, int co…...

数据结构小项目----通讯录的实现(这里用链表实现) 超详细~~~~૮(˶ᵔ ᵕ ᵔ˶)ა
目录 Contact.h说明: 结构体与头文件的包含: 编辑 函数在头文件的声明与定义: Contact.c中各个函数的实现: 1.检查链表中的数据是否满了,满了就扩容 2.链表的尾插 3.链表的删除 4.查找名字是否匹配 5.初始化通讯…...

Electron Apple SignIn 登录
本人写博客,向来主张:代码要完整,代码可运行,文中不留下任何疑惑。 最讨厌写博客,代码只留下片段,文中关键的东西没写清楚。之前看了那么多文章,就是不告诉我clientId从哪来的。 官方资料地址&…...

常用中间件漏洞
IIS6 IIS7 安装 控制面板-----打开关闭windows功能 添加角色-----添加IIS 启动之后访问localhost 复现 服务器换成IIS7 访问报错 大概就是缺少CGI模块 问题解决 添加php-cgi的路径 添加脚本映射 修改php.ini文件 将 cgi.fix_pathinfo1 然后设置一个图片 访问 在后缀加上/.…...

Windows系统使用手册
点击前往查看🔗我的博客文章目录 Windows系统使用手册 文章目录 Windows系统使用手册Windows10解决大小核调度问题Windows系统安装软件Windows系统Typora快捷键Windows系统压缩包方式安装redisWindows安装dockerWindows系统的docker设置阿里源Windows系统下使用doc…...

mp4文件可以转成mp3音频吗
现在是个非常流行刷短视频一个年代,刷短视似乎成了人们休闲娱乐的一种方式,在日常刷短视频过程中,肯定会有很多同学被短视频 bgm 神曲洗脑,比如很多被网红翻唱带火的歌曲,例如其中"不负人间”,就是其中…...
Java-IO流【登录注册小项目】
♥️作者:白日参商 🤵♂️个人主页:白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油!…...
数字化金融时代:探讨全球金融科技创新的最新动态
在当今数字化金融时代,金融科技创新如影随形,迅猛发展。本文将深入探讨全球范围内金融科技的最新动态,剖析各地新兴趋势与突破。从区块链技术的应用到人工智能在金融领域的崭露头角,我们将一一解读这个正在不断演变的金融科技画卷…...

LeetCode:206. 反转链表
力扣链接 算法思想:由于单链表是单向的,想要对当前元素进行操作,需找到前一个元素。本题利用双指针,初始pre指针指向NULL,cur指针指向head.再对局部翻转之前,先把下一个结点存到temp指针中。当进行完如下代…...

linux 安装nginx
介绍 官网 https://nginx.org/en/download.html 在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel linux 检查是否安装过某软件包 yum -y install gcc pcre-devel zlib-devel openssl openssl-devel #下载 wget https://nginx.org/downloa…...

1.C语言——基础知识
C语言基础知识 1.第一个C语言程序2.注释3.标识符4.关键字5.数据类型6.变量7.常量8.运算符9.输入输出输入输出 1.第一个C语言程序 C语言的编程框架 #include <stdio.h> int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }2.注释 单行…...

Redis 存在线程安全问题吗?为什么?
一个工作了 5 年的粉丝私信我。 他说自己准备了半年时间,想如蚂蚁金服,结果第一面就挂了,非常难过。 问题是: “Redis 存在线程安全问题吗?” 一、问题解析 关于这个问题,我从两个方面来回答。 第一个&a…...

无人机测绘助力实现高效、安全的城市规划
随着城市化进程的不断加快,城市规划显得尤为重要。而无人机测绘技术作为一种创新的工具,为城市规划提供了更加高效、安全的解决方案。它通过快速、精确的数据采集和分析,为行业提供有力的决策支持,助力城市规划的现代化和可持续发…...

实验七 RMAN恢复管理器
🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…...

未来 AI 可能给哪些产业带来哪些进步与帮助?
AI时代如何要让公司在创新领域领先吗?拥抱这5种创新技能,可以帮助你的公司应对不断变化。包括人工智能、云平台应用、数据分析、 网络安全和体验设计。这些技能可以帮助你提高业务效率、保护公司知识资产、明智决策、满足客户需求并提高销售额。 现在就加…...

Java医院信息管理系统
技术框架: springboot shiro layui jquery thymeleaf nginx 有需要的可以联系我。 运行环境: jdk8 mysql IntelliJ IDEA maven项目功能: 本项目是用springbootlayuishiro写的医院管理系统,系统的业务比较复杂&#x…...
QT+OSG/osgEarth编译之八十:ive+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_ive)
文章目录 1、osgdb_ive介绍2、文件分析3、pro文件4、编译实践1、osgdb_ive介绍 通过osgdb_ive,OpenSceneGraph开源库能方便地读取ive格式的三维文件。 ive(Interchangeable Virtual Environment)是一种三维图形数据交换格式,主要用于虚拟现实和增强现实领域的场景数据交…...
Webpack5入门到原理3:基本配置
在开始使用 Webpack 之前,我们需要对 Webpack 的配置有一定的认识。 5 大核心概念 entry(入口) 指示 Webpack 从哪个文件开始打包 output(输出) 指示 Webpack 打包完的文件输出到哪里去,如何命名等 l…...

全开源多城市同城信息小程序源码(Laravel 框架),同城分类信息发布便民小程序系统【非DZ】
同城生活分类信息小程序,人才招聘、房产二手 多城市地区同城分类信息发布,商家入驻等功能 小程序前后端代码开源无加密,可进行二次开发 【源码运行要求】 1、需要已认证的微信小程序 2、已备案的域名及服务器空间 推荐使用宝塔面板LinuxPHP…...
PHP学习笔记1
//语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出。 /* 【命名规则】 */ 常量名 类常量建议全大写,单词间用下划线分隔 // MIN_WIDTH 变量名建议用下划线方式分隔 // $var_na…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...