三子棋/井字棋(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…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
