三子棋/井字棋(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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java-面试题(2)

java 中操作字符串都有哪些类&#xff1f; 它们之间有什么区别&#xff1f; String、StringBuffer、StringBuilder String与后两者的区别&#xff1a;String声明的是不可变对象&#xff0c;每次操作都会生成新的String对象&#xff0c;而后两者可 以在原有对象的基础上进行操作…

市场监管总局发布区块链和分布式记账技术6项标准,中创积极推动区块链产业发展!

近日&#xff0c;市场监管总局&#xff08;国家标准委&#xff09;批准发布一批重要国家标准&#xff0c;涉及生产生活、绿色可持续等多个领域&#xff0c;这些标准将在引领产业发展、促进绿色转型、助力对外贸易、推动城乡建设、提升生活品质等方面发挥重要作用。 其中一项标…

02-编程猜谜游戏

本章通过演示如何在实际程序中使用 Rust&#xff0c;你将了解 let 、 match 、方法、关联函数、外部crate等基础知识。 本章将实现一个经典的初学者编程问题&#xff1a;猜谜游戏。 工作原理如下&#xff1a;程序将随机生成一个介于 1 和 100 之间的整数。然后&#xff0c;程序…

C# Cad2016二次开发选择csv导入信息(七)

//选择csv导入信息 [CommandMethod("setdata")] //本程序在AutoCAD的快捷命令是"DLLLOAD" public void setdata() {Microsoft.Win32.OpenFileDialog dlg new Microsoft.Win32.OpenFileDialog();dlg.DefaultExt ".csv";// Display OpenFileDial…

DNS寻址过程

用一张图详细的描述DNS寻址的过程&#xff0c;是高级前端进阶的网络篇&#xff1a; 主要是第三步要记仔细就行啦&#xff0c;每一步都要详细的记录下来&#xff0c;总结的脉络如下&#xff1a; 本地DNS缓存本地DNS服务器根域名服务器 顶级域名服务器再次顶级域名服务器权威域名…

YOLOv5改进 | 主干篇 | 华为移动端模型GhostnetV2一种移动端的专用特征提取网络

一、本文介绍 本文给大家带来的改进机制是华为移动端模型Ghostnetv2,华为GhostNetV2是为移动应用设计的轻量级卷积神经网络(CNN),旨在提供更快的推理速度,其引入了一种硬件友好的注意力机制,称为DFC注意力。这个注意力机制是基于全连接层构建的,它的设计目的是在通用硬…

Vue-21、Vue监测数组改变

1、数组调用以下方法Vue可以监测到。 arr.push(); 向数组的末尾追加元素 const array [1,2,3] const result array.push(4) // array [1,2,3,4] // result 4arr.pop(); 删除末尾的元素 const array [a, b] array.pop() // b array.pop() // a array.pop() // undefi…

Elasticsearch各种高级文档操作3

本文来记录几种Elasticsearch的文档操作 文章目录 初始化文档数据聚合查询文档概述对某个字段取最大值 max 示例对某个字段取最小值 min 示例对某个字段求和 sum 示例对某个字段取平均值 avg 示例对某个字段的值进行去重之后再取总数 示例 本文小结 初始化文档数据 在进行各种文…

代码随想录Day25 | 216.组合总和III 17.电话号码的字母组合

代码随想录Day25 | 216.组合总和III 17.电话号码的字母组合 216.组合总和III[ 17.电话号码的字母组合 ](https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/) 216.组合总和III 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a; 和组合问题…

flutter获取地理定位:geolocator依赖详细用法

本文使用geolocator插件实现app物理定位功能。 该插件的主要功能有&#xff1a; 获取最后已知位置&#xff1b;获取设备当前位置&#xff1b;获取连续的位置更新&#xff1b;检查设备是否启用了定位服务&#xff1b;计算两个地理坐标之间的距离&#xff08;米&#xff09;&am…

AI时代—ChatGPT-4.5的正确打开方式

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

java 操作es 的基本操作

创建索引创建索引别名索引的相关设置查询索引数据bulk 导入数据持续更新中~ pom的坐标 <!--es相关--><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><versio…

微信小程序(七)navigator点击效果

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.默认效果 2.无效果 3.激活效果 源码&#xff1a; index.wxml //如果 <navigator url"/pages/logs/logs">跳转到log页面&#xff08;默认&#xff09; </navigator><navigator url&q…

【LeetCode2744】最大字符串配对数目

1、题目描述 【题目链接】 标签&#xff1a;数组&#xff0c;哈希表&#xff0c;字符串&#xff0c;模拟  给你一个下标从 0 开始的数组 words &#xff0c;数组中包含 互不相同 的字符串。  如果字符串 words[i] 与字符串 words[j] 满足以下条件&#xff0c;我们称它们可以…

kafka hang 问题记录

参考文档 https://cloud.tencent.com/developer/article/1821477 9092端口 端口9092通常与Apache Kafka关联。 Kafka是一个开源的分布式事件流平台&#xff0c;用于构建实时的数据管道和流应用。 它能够处理任意大小的数据&#xff0c;以容错的方式处理数据流。 在默认配置…

C# HPSocket 服务器端的详细 Demo,数据收发打包方式,避免出现沾包的情况

HPSocket 是一款跨平台的 Socket 服务器框架&#xff0c;支持快速开发高性能、高可靠性的网络通信应用程序。它提供了丰富的 API&#xff0c;可以轻松实现客户端与服务器之间的数据收发、连接管理等功能。 代码结构&#xff1a; 1、Program.cs&#xff1a;程序入口&#xff0c…

从零开始,自己搭建一个autonomous mobile robot做gazebo仿真(1):mobile robot建模与添加差速控制器

这样一个简单的mobile robot模型 首先写xacro文件&#xff0c;创建 link joint transmission <?xml version"1.0"?> <robot xmlns:xacro"http://www.ros.org/wiki/xacro" name"whill_modelc" ><xacro:property name"PI&q…

【点云、图像】学习中 常见的数学知识及其中的关系与python实操[更新中]

文章目录 前言一、平均值、方差、协方差平均值&#xff08;mean&#xff09;np.mean()方差&#xff08;variance&#xff09;np.var()总体方差 np.var(a, ddof0)无偏样本方差np.var(a, ddof1)有偏样本方差标准差&#xff08;standard deviation&#xff09;np.std(a, ddof1)默认…

Docker 部署考核

Docker安装 安装必要的系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 添加docker-ce安装源&#xff1a; yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 配置阿里云Docker Yum源: yum-config-manager --ad…

docker 挂载的文件同步问题 及 telnet redis账号可用

在一台新的服务器上部署docker发现redis服务因白名单没配不通&#xff0c;可以通过telnet来进行测试&#xff0c;包括账号是否可用&#xff1a; 1 telnet 192.168.1.11 6379 # ip port 2 ctrl ] 3 回车 4 键入 auth 111111 # 密码 5 成功 OK 失败 -WRONGPASS invalid us…