当前位置: 首页 > 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…...

大模型岗位锐评:小白程序员转型指南 学习资源包免费领!收藏必备

本文深度剖析大模型领域的五大梯队岗位&#xff0c;从底层架构工程师到应用开发工程师&#xff0c;详细介绍了各岗位的日常工作、新手友好度、优势与避雷点。文章强调大模型领域人才缺口巨大&#xff0c;传统程序员具备转型优势&#xff0c;并提供了系统学习路线及实战资源&…...

3步掌握StreamCap:开源直播录制工具的终极使用指南

3步掌握StreamCap&#xff1a;开源直播录制工具的终极使用指南 【免费下载链接】StreamCap Multi-Platform Live Stream Automatic Recording Tool | 多平台直播流自动录制客户端 基于FFmpeg 支持监控/定时/转码 项目地址: https://gitcode.com/gh_mirrors/st/StreamCap …...

Beyond Compare 5密钥生成器技术解析与高效配置指南

Beyond Compare 5密钥生成器技术解析与高效配置指南 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 当Beyond Compare 5的30天评估期结束后&#xff0c;软件会进入受限模式&#xff0c;许多高级…...

思源宋体TTF:7种字重打造专业中文排版的全新体验

思源宋体TTF&#xff1a;7种字重打造专业中文排版的全新体验 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为中文设计项目的字体选择头疼吗&#xff1f;今天我要分享一个让我工作…...

告别手动肝船!碧蓝航线自动化脚本Alas终极使用指南

告别手动肝船&#xff01;碧蓝航线自动化脚本Alas终极使用指南 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 还在为碧蓝航…...

智慧树自动刷课插件:5分钟告别手动点击,学习效率提升300%

智慧树自动刷课插件&#xff1a;5分钟告别手动点击&#xff0c;学习效率提升300% 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还记得那个深夜&#xff0c;你盯着智慧…...

FPSoC芯片如何重塑嵌入式设计?SF1系列实战解析

1. 项目概述&#xff1a;一颗芯片如何重塑嵌入式设计的边界&#xff1f;最近&#xff0c;业内朋友都在讨论安路科技新推出的SF1系列FPSoC产品。作为一名在嵌入式领域摸爬滚打了十几年的老工程师&#xff0c;我第一眼看到这个“FPSoC”的命名&#xff0c;就嗅到了一丝不同寻常的…...

A/B测试还在用t检验?DeepSeek团队淘汰传统方法的4个关键转折点(含贝叶斯动态决策引擎实测对比)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;A/B测试范式迁移的必然性 传统A/B测试长期依赖静态流量分配、固定实验周期与人工决策闭环&#xff0c;在现代高并发、多场景、实时反馈的业务系统中正面临三重结构性失配&#xff1a;实验吞吐量低、决策…...

告别HDR格式混乱:用Python代码实战HLG与PQ曲线互转(附完整代码)

告别HDR格式混乱&#xff1a;用Python代码实战HLG与PQ曲线互转&#xff08;附完整代码&#xff09; 在视频处理领域&#xff0c;HDR&#xff08;高动态范围&#xff09;技术已经成为提升视觉体验的关键要素。然而&#xff0c;HLG&#xff08;Hybrid Log-Gamma&#xff09;和PQ&…...

告别ArcGIS!用Python+MRT批量处理MODIS 16A2蒸散发数据,从HDF到月均ET全流程

告别ArcGIS&#xff01;用PythonMRT批量处理MODIS 16A2蒸散发数据&#xff0c;从HDF到月均ET全流程 在生态水文研究中&#xff0c;MODIS 16A2蒸散发数据&#xff08;ET&#xff09;是评估区域水资源平衡的关键指标。然而&#xff0c;传统ArcGIS手动操作不仅效率低下&#xff0c…...