当前位置: 首页 > news >正文

三子棋/井字棋(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说明&#xff1a; 结构体与头文件的包含&#xff1a; ​编辑 函数在头文件的声明与定义&#xff1a; Contact.c中各个函数的实现&#xff1a; 1.检查链表中的数据是否满了&#xff0c;满了就扩容 2.链表的尾插 3.链表的删除 4.查找名字是否匹配 5.初始化通讯…...

Electron Apple SignIn 登录

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

常用中间件漏洞

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

Windows系统使用手册

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

mp4文件可以转成mp3音频吗

现在是个非常流行刷短视频一个年代&#xff0c;刷短视似乎成了人们休闲娱乐的一种方式&#xff0c;在日常刷短视频过程中&#xff0c;肯定会有很多同学被短视频 bgm 神曲洗脑&#xff0c;比如很多被网红翻唱带火的歌曲&#xff0c;例如其中"不负人间”&#xff0c;就是其中…...

Java-IO流【登录注册小项目】

♥️作者&#xff1a;白日参商 &#x1f935;‍♂️个人主页&#xff1a;白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…...

数字化金融时代:探讨全球金融科技创新的最新动态

在当今数字化金融时代&#xff0c;金融科技创新如影随形&#xff0c;迅猛发展。本文将深入探讨全球范围内金融科技的最新动态&#xff0c;剖析各地新兴趋势与突破。从区块链技术的应用到人工智能在金融领域的崭露头角&#xff0c;我们将一一解读这个正在不断演变的金融科技画卷…...

LeetCode:206. 反转链表

力扣链接 算法思想&#xff1a;由于单链表是单向的&#xff0c;想要对当前元素进行操作&#xff0c;需找到前一个元素。本题利用双指针&#xff0c;初始pre指针指向NULL&#xff0c;cur指针指向head.再对局部翻转之前&#xff0c;先把下一个结点存到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 年的粉丝私信我。 他说自己准备了半年时间&#xff0c;想如蚂蚁金服&#xff0c;结果第一面就挂了&#xff0c;非常难过。 问题是&#xff1a; “Redis 存在线程安全问题吗&#xff1f;” 一、问题解析 关于这个问题&#xff0c;我从两个方面来回答。 第一个&a…...

无人机测绘助力实现高效、安全的城市规划

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

实验七 RMAN恢复管理器

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…...

未来 AI 可能给哪些产业带来哪些进步与帮助?

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

Java医院信息管理系统

技术框架&#xff1a; springboot shiro layui jquery thymeleaf nginx 有需要的可以联系我。 运行环境&#xff1a; jdk8 mysql IntelliJ IDEA maven项目功能&#xff1a; 本项目是用springbootlayuishiro写的医院管理系统&#xff0c;系统的业务比较复杂&#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 之前&#xff0c;我们需要对 Webpack 的配置有一定的认识。 5 大核心概念 entry&#xff08;入口&#xff09; 指示 Webpack 从哪个文件开始打包 output&#xff08;输出&#xff09; 指示 Webpack 打包完的文件输出到哪里去&#xff0c;如何命名等 l…...

全开源多城市同城信息小程序源码(Laravel 框架),同城分类信息发布便民小程序系统【非DZ】

同城生活分类信息小程序&#xff0c;人才招聘、房产二手 多城市地区同城分类信息发布&#xff0c;商家入驻等功能 小程序前后端代码开源无加密&#xff0c;可进行二次开发 【源码运行要求】 1、需要已认证的微信小程序 2、已备案的域名及服务器空间 推荐使用宝塔面板LinuxPHP…...

PHP学习笔记1

//语法错误&#xff08;syntax error&#xff09;在语法分析阶段&#xff0c;源代码并未被执行&#xff0c;故不会有任何输出。 /* 【命名规则】 */ 常量名 类常量建议全大写&#xff0c;单词间用下划线分隔 // MIN_WIDTH 变量名建议用下划线方式分隔 // $var_na…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...