C语言:-三子棋游戏代码:分支-循环-数组-函数集合

思路分析:

1、写菜单

2、菜单之后进入游戏的操作

3、写函数 实现游戏

        3.1、初始化棋盘函数,使数组元素都为空格

        3.2、打印棋盘 棋盘的大概样子

        3.3、玩家出棋

                3.3.1、限制玩家要下的坐标位置

                3.3.2、判断玩家要下的位置是否由棋子

        3.4、电脑出棋

                3.4.1、用随机数 让电脑随机生成坐标

        3.5、判断玩家和电脑谁赢了

代码实现

game.h文件

#ifndef _GAME_H
#define _GAME_H
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>

#define ROW 3
#define COL 3
//函数说明
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 ct_move(char board[ROW][COL], int row, int col);
char Iswin(char board[ROW][COL], int row, int col);
#endif

game.c--游戏算法实现

#include "game.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;
    for (int i = 0; i < row; i++)
    {
        int j;
        for (j = 0; j < col; j++)
        {
            //打印 空格 数组元素 空格
            printf(" %c ", board[i][j]);
            //最后一列不打印 |
            if (j < col - 1)
            {
                printf("|");
            }
        }
        printf("\n");

        //最后一行不打印 —--
        if (i < row - 1)
        {
            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, y;
    printf("玩家走->:\n");
    //不到停止条件 一致循环
    while (1)
    {
        printf("请输入要下的坐标:\n");
        scanf("%d %d", &x, &y);
        //限制坐标的范围
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            //确定输入坐标是否有“棋子”
            if (board[x - 1][y - 1] == ' ')
            {
                board[x - 1][y - 1] = '*';
                break;
            }

            else
            {
                printf("该坐标被占用!");
            }
        }
        else
        {
            printf("坐标非法,请重新输入");
        }
    }
}

//电脑出棋
void ct_move(char board[ROW][COL], int row, int col)
{
    int x, y;
    printf("电脑走->:\n");
    //用sand函数 使电脑生成0-2的随机数
    x = rand() % row;
    y = rand() % col;
    while (1)
    {
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}

//看棋盘是否下满了
int isfull(char board[ROW][COL], int row, int col)
{
    int i ,j;
    for(i = 0;i < row;i++)
    {
        for(j = 0;j < col;j++)
        {
            //如果数组元素中还有 空格 那就返回 0
            if(board[i][j] == ' ')
            {
                return 0;
            }            
        }
    }
    return 1;
}

//看玩家和电脑谁赢了
char Iswin(char board[ROW][COL], int row, int col)
{
    int i;
    //横相等
    for (i = 0; i < row; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
        {
            return board[i][0];
        }
    }
    //竖相等
    for (i = 0; i < col; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
        {
            return board[i][0];
        }
    }

    //从左到右 对角线相等
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
    {
        return board[1][1];
    }

    //从右到左 对角线相等
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
    {
        return board[1][1];
    }

    //棋盘满了返回 1  再返回 q  平局
    if(1 == isfull(board,ROW,COL))
    {
        return 'q';
    }
    //如果以上条件都不满足,返回 'c' 表示游戏继续进行。
    return 'c';
}

test.c---测试文件

#include "game.h"
// 菜单栏
void menu()
{
    printf("=========================\n");
    printf("=========================\n");
    printf("========三子棋1.0=========\n");
    printf("===1 开始游戏==0 退出游戏==\n");
    printf("=========================\n");
}
// 游戏的算法实现
void game()
{
    char ret;
    // 数组-存放棋盘信息
    char board[ROW][COL] = {0};
    // 初始化棋盘 使所有元素为空格
    Initboard(board, ROW, COL);
    // 打印棋盘
    Displayboard(board, ROW, COL);
    while (1)
    {
        // 玩家下棋
        playermove(board, ROW, COL);
        // 下完再打印一次棋盘
        Displayboard(board, ROW, COL);
        // 判断玩家是否赢了
        ret = Iswin(board, ROW, COL);
        if (ret != 'c')
        {
            break;
        }
        // 电脑下棋
        ct_move(board, ROW, COL);
        Displayboard(board, ROW, COL);
        // 判断电脑是否赢了
        ret = Iswin(board, ROW, COL);
        /**   *玩家赢
         *    #电脑赢
         *    c继续游戏
         *    q平局
         */
        // 如果ret 不等于 c 不继续游戏 那就break 退出游戏
        if (ret != 'c')
        {
            break;
        }
    }
    if (ret == '*')
    {
        printf("玩家赢了\n");
    }
    else if (ret == '#')
    {
        printf("电脑赢了\n");
    }
    else if (ret == 'q')
    {
        printf("平局\n");
    }
}

void test()
{
    menu();
    int input;
    do
    {
        printf("请选择:\n 1-> 开始游戏    0-> 退出游戏\n");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            printf("game start!\n");
            game();
            break;
        case 0:
            printf("game over!\n");
            break;
        default:
            printf("无效选项,请重新选择");
            break;
        }
    } while (input);
}
int main(int argc, char const *argv[])
{
    // 随机函数
    srand(time(NULL));
    test();

    return 0;
}

效果展示

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flutter的web页面

有几个服务器 有几个后台 直接通过web端进去虽然说很方便&#xff0c;但… 于是把web页面镶嵌到应用里面去&#xff0c; 这样就换了个方式打开web页面了 比如这里有有个列表 这里是写死了&#xff0c;活的列表可以通过io去获取 import package:flutter/material.dart; imp…

K8S 亲和性与反亲和性 深度好文

今天我们来实验 pod 亲和性。官网描述如下&#xff1a; 假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8-alpine docker pull nginx…

解决conda create速度过慢的问题

问题 构建了docker容器 想在容器中创建conda环境&#xff0c;但是conda create的时候速度一直很慢 解决办法 宿主机安装的是anaconda 能正常conda create,容器里安装的是miniforge conda create的时候速度一直很慢&#xff0c;因为容器和宿主机共享网络了&#xff0c;宿主机…

Banana Pi BPI-RV2 RISC-V路由开发板采用矽昌通信SF2H8898芯片

Banana Pi BPI-RV2 开源网关是⼀款基于矽昌SF2H8898 SoC的设备&#xff0c;1 2.5 G WAN⽹络接⼝、5 个千兆LAN ⽹络接⼝、板载 512MB DDR3 内存 、128 MiB NAND、16 MiB NOR、M.2接⼝&#xff0c;MINI PCIE和USB 2.0接⼝等。 Banana Pi BPI-RV2 开源网关是矽昌和⾹蕉派开源社…

C -- 大端对齐 小端对齐 的人性化解释

网上很多资料对大小端对齐的解释 很多 很全 很准 但为啥老是记不住呢&#xff0c;所有的知识都是基于人性的情感原理&#xff0c;或是世界基本的运行规律而产生的&#xff0c;如果不能把知识和这两点打通&#xff0c;即使记住也很容易忘记。本篇文章基于这两点 分析下大小端对齐…

在线图片马赛克处理工具

在线图片马赛克处理工具&#xff0c;无需登录&#xff0c;无需费用&#xff0c;用完就走。 包括中文和英文版本 官网地址&#xff1a; https://mosaic.openai2025.com

链家房价数据爬虫和机器学习数据可视化预测

完整源码项目包获取→点击文章末尾名片&#xff01;

Linux入门指令(一)

目录 1.前言 2.入门指令 whoami who clear pwd ls cd mkdir touch rmdir rm 1.前言 我们都知道&#xff0c;在日常生活中接触的电脑有使用Windows操作系统的&#xff08;微软&#xff09;&#xff0c;也有使用MacOS操作系统的&#xff08;苹果&#xff09;&#x…

第十二章:算法与程序设计

文章目录&#xff1a; 一&#xff1a;基本概念 1.算法与程序 1.1 算法 1.2 程序 2.编译预处理 3.面向对象技术 4.程序设计方法 5.SOP标志作业流程 6.工具 6.1 自然语言 6.2 流程图 6.3 N/S图 6.4 伪代码 6.5 计算机语言 二&#xff1a;程序设计 基础 1.常数 …

Golang Gin系列-4:Gin Framework入门教程

在本章中&#xff0c;我们将深入研究Gin&#xff0c;一个强大的Go语言web框架。我们将揭示制作一个简单的Gin应用程序的过程&#xff0c;揭示处理路由和请求的复杂性。此外&#xff0c;我们将探索基本中间件的实现&#xff0c;揭示精确定义路由和路由参数的技术。此外&#xff…

【MySQL索引:B+树与页的深度解析】

文章目录 MySQL索引&#xff1a;B树与页的深度解析1. 索引使用的数据结构——B树1.1 B树介绍1.2 B树的特点1.3 B树和B树的对比 2. MySQL中的页2.1 页的介绍2.2 页主体2.3 页目录2.4 B树在MySQL索引中的应用 MySQL索引&#xff1a;B树与页的深度解析 在MySQL数据库中&#xff0…

改进上一篇博文中的按键驱动读取程序,增加环形缓冲区

引言和具体的问题描述 上一篇博文&#xff1a;https://blog.csdn.net/wenhao_ir/article/details/145225508 中写的读取按键值的程序&#xff0c;如果按键按得很快&#xff0c;会出现前面的按键值被后面的按键值被覆盖的情况&#xff0c;即前面的按键值还没被来得及被读取&…

linux环境下软件安装

Linux环境下安装软件 linux安装tomcatLinux配置多台Tomcat linux 手动安装jdklinux yum安装jdk(openjdk)Nacos 安装下载nacos解压三、启动四、常用命令 git安装yum命令安装通过编译安装git linux安装tomcat 1.安装tomcat 下载tomcat安装包&#xff0c;解压到任意目录&#xff…

自定义提示确认弹窗-vue

最初可运行代码 弹窗组件代码&#xff1a; &#xff08;后来发现以下代码可运行&#xff0c;但打包 typescript 类型检查出错&#xff0c;可打包的代码在文末&#xff09; <template><div v-if"isVisible" class"dialog"><div class&quo…

leetcode707-设计链表

leetcode 707 思路 本题也是用了虚拟头节点来进行解答&#xff0c;这样的好处是&#xff0c;不管是头节点还是中间的节点都可以当成是中间节点来处理&#xff0c;用同一套方法就可以进行处理&#xff0c;而不用考虑太多的边界条件。 下面题目中最主要的实现就是添加操作addA…

LabVIEW桥接传感器配置与数据采集

该LabVIEW程序主要用于配置桥接传感器并进行数据采集&#xff0c;涉及电压激励、桥接电阻、采样设置及错误处理。第一个VI&#xff08;"Auto Cleanup"&#xff09;用于自动清理资源&#xff0c;建议保留以确保系统稳定运行。 以下是对图像中各个组件的详细解释&#…

OpenCV基础:获取子矩阵的几种方式

目录 相关阅读 方法一&#xff1a;使用切片操作 方法二&#xff1a;使用高级索引 方法三&#xff1a;使用条件筛选 方法四&#xff1a;使用 numpy 的 take 函数 相关阅读 OpenCV基础&#xff1a;矩阵的创建、检索与赋值-CSDN博客 OpenCV基础&#xff1a;图像运算-CSDN博客…

深入剖析Java线程安全的集合类:原理、特点与应用

引言&#xff1a;线程安全集合类的重要性 在当今的软件开发领域&#xff0c;多线程编程已经成为了构建高性能、响应式应用的关键技术。随着硬件技术的飞速发展&#xff0c;多核处理器的普及使得程序能够充分利用多个核心的计算能力&#xff0c;从而显著提升运行效率。在多线程环…

Ubuntu 22.04虚拟机安装配置调整(语言输入法字体共享剪切板等等

2025.01.07安装配置Ubuntu 22.04 记一下 快捷键 截屏 在设置-键盘-快捷键查看 跟搜到的不一样…不过shiftprint感觉也够用 安装 用的是VMware 参考&#xff1a;VMware中安装配置Ubuntu&#xff08;2024最新版 超详细&#xff09; 调教&#xff08;&#xff1f; 语言 改了…

vim练级攻略(精简版)

vim推荐配置: curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh 0. 规定 Ctrl-λ 等价于 <C-λ> :command 等价于 :command <回车> n 等价于 数字 blank字符 等价于 空格&#xff0c;tab&am…