三子棋/井字棋(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…...
双冗余链路实现(2/2期)
目录 拓扑: 基础需求: 出口路由器(双路): 静态路由: 防火墙配置: 全区域互通透传: 静态路由: 冗余备份: 核心交换机: 静态路由ÿ…...
一加手机Root后玩机指南:用Magisk Delta模块实现这些实用功能(附模块推荐)
一加手机Root后进阶玩法:Magisk Delta模块实战指南 当你成功为一加手机解锁BL并获取Root权限后,真正的玩机之旅才刚刚开始。作为一款以极客精神著称的品牌,一加手机在Root后的可玩性远超普通设备。本文将聚焦Magisk Delta这一强大工具&#x…...
FLUX.1-dev像素生成器教程:多提示词加权与逻辑组合语法详解
FLUX.1-dev像素生成器教程:多提示词加权与逻辑组合语法详解 1. 像素幻梦创意工坊简介 像素幻梦 (Pixel Dream Workshop) 是一款基于FLUX.1-dev扩散模型的像素艺术生成工具,专为创作者设计。它采用16-bit像素风格的现代明亮界面,提供沉浸式的…...
Leather Dress Collection 模型Java后端集成指南:SpringBoot微服务开发
Leather Dress Collection 模型Java后端集成指南:SpringBoot微服务开发 最近在做一个电商相关的项目,需要集成一个能生成皮革服饰设计图的AI模型,正好接触到了Leather Dress Collection。作为后端开发,我的第一反应就是ÿ…...
Agent-S:重新定义人机协作的智能体框架技术解析
Agent-S:重新定义人机协作的智能体框架技术解析 【免费下载链接】Agent-S Agent S: an open agentic framework that uses computers like a human 项目地址: https://gitcode.com/GitHub_Trending/ag/Agent-S 在数字化转型加速的今天,人机协作的…...
SQL注入的分类靶场实践
SQL注入的分类靶场实践 前言 SQL 注入(SQL Injection)是一种常见且危险的 Web 安全漏洞,攻击者通过在输入字段中插入恶意 SQL 代码,能够绕过应用程序的验证机制,直接操纵数据库。本文将介绍 SQL 注入的分类ÿ…...
LeetCode 98. Validate Binary Search Tree 题解
LeetCode 98. Validate Binary Search Tree 题解 题目描述 给你一个二叉树的根节点 root,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子…...
保姆级避坑指南:用VMware ESXi 8.0给vCenter Server 8.0单独划个“家”(存储+网络配置详解)
VMware ESXi 8.0环境下的vCenter Server 8.0专属部署指南 在虚拟化环境中,vCenter Server作为整个VMware生态系统的"大脑",其部署的稳定性和可靠性直接影响整个虚拟化平台的运行质量。本文将深入探讨如何在ESXi 8.0环境中为vCenter Server 8.0…...
zteOnu:核心功能全解析与实战指南
zteOnu:核心功能全解析与实战指南 【免费下载链接】zteOnu 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 解锁高级配置:工厂模式激活指南 场景描述 网络管理员在配置中兴光猫时,发现普通用户权限无法修改关键网络参数&…...
小白也能玩转的AI语音合成:超级千问语音世界快速体验报告
小白也能玩转的AI语音合成:超级千问语音世界快速体验报告 1. 初识超级千问语音世界 第一次打开超级千问语音世界,我仿佛穿越回了童年玩红白机的时代。复古的像素风界面、跳跃的蘑菇按钮、会移动的小乌龟,这哪里是AI工具,分明是个…...
