三子棋/井字棋(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…...
Z-Image-GGUF模型Java后端集成指南:SpringBoot微服务实战
Z-Image-GGUF模型Java后端集成指南:SpringBoot微服务实战 最近在做一个内容创作平台的后台重构,产品经理提了个需求,想给用户加个“AI一键生成文章配图”的功能。团队评估了几个方案,最终决定用Z-Image-GGUF这个模型,…...
树莓派通过HTTP协议对接OneNET Studio 5.0物联网平台实战指南
1. 环境准备与平台配置 在开始之前,我们需要准备好树莓派硬件和OneNET Studio 5.0平台账号。树莓派建议使用Raspberry Pi 4 Model B或更新型号,系统选择Raspbian或Raspberry Pi OS。OneNET Studio是中国移动推出的物联网开放平台,5.0版本对接…...
Z-Image-GGUF开发者案例:集成至内部CMS系统,支持运营人员一键生成Banner
Z-Image-GGUF开发者案例:集成至内部CMS系统,支持运营人员一键生成Banner 1. 项目背景与挑战 想象一下这个场景:你是一家电商公司的运营人员,明天就是“618”大促了,你需要为50个不同的商品制作Banner图。设计团队已经…...
向量化计算失效的7大隐性陷阱,深度解析HotSpot向量编译器决策逻辑
第一章:向量化计算失效的7大隐性陷阱,深度解析HotSpot向量编译器决策逻辑HotSpot JVM 的向量化编译(Vector API 编译支持与循环自动向量化)并非在所有场景下都能生效。其背后由C2编译器的向量化决策引擎驱动,该引擎基于…...
JPom结合Docker实现SpringBoot项目自动化构建与部署实战
1. 为什么你需要JPomDocker自动化部署方案 每次手动打包SpringBoot项目时,你是不是也经历过这样的痛苦?先在本地mvn clean package,然后scp上传到服务器,接着ssh连上去kill旧进程,最后nohup启动新jar包。更可怕的是半夜…...
微电网集中式架构vs分布式架构:设计差异与选型依据
微电网作为整合“源、储、荷、网”的新型能源系统,其架构设计直接决定系统的运行效率、可靠性、扩展性与经济性,是微电网规划建设的核心环节。在微电网主流架构中,集中式架构与分布式架构凭借各自的技术特性,适配不同的应用场景与…...
Polars 2.0大规模清洗性能翻倍的7个底层优化技巧:基于真实金融风控流水线压测数据
第一章:Polars 2.0大规模数据清洗性能跃迁的工程意义Polars 2.0 的发布标志着 Rust 原生 DataFrame 库在工程落地层面实现关键突破——其基于 Arrow 2.0 和全新查询优化器(QOv2)重构的执行引擎,将典型 ETL 清洗任务的吞吐量提升达…...
嵌入式系统模块化设计:内聚与耦合实战指南
1. 嵌入式模块设计的核心原则在嵌入式系统开发中,模块化设计质量直接影响着整个系统的生命周期成本。我经历过多个嵌入式项目后发现,那些后期维护成本高昂的系统,往往都存在模块边界模糊、依赖混乱的问题。模块化不是简单的代码分割ÿ…...
学网络安全需要学编程吗?
作为数字化时代的守护者岗位,网络安全一直备受瞩目并引发热议,那么学网络安全需要学编程吗?学多久才可以就业?我们通过这篇文章来了解一下。学网络安全需要学编程吗?当然需要,网络安全需要学习编程。编程能力是网络安全领域的基础技能之一…...
手把手教你用CH32V208开发板实现蓝牙BLE5.3通信(附完整工程源码)
基于CH32V208开发板的蓝牙BLE5.3实战开发指南 在物联网设备爆发式增长的今天,低功耗蓝牙(BLE)技术因其低功耗、低成本的优势,成为短距离无线通信的首选方案之一。作为一款集成了BLE5.3模块的RISC-V微控制器,CH32V208为…...
