三子棋的实现

简介: 三子棋的实现

所谓三子棋游戏,在有些地方还被叫做井字棋。

现在,让我来为大家讲解三子棋游戏的详细过程;

先看游戏运行:

5a2b942484c72467f9b178edfd697a7e_9a2f8afa8b0d4431a0be76277f3c3b64.png

首先,我将游戏分成了三个部分:


1、text.c                   //测试三子棋游戏


2、game.h                //三子棋游戏的函数声明


3、game.c                 //三子棋游戏函数的实现        


创建好文件后,我们首先在text.c文件中写main函数


头文件include<stdio.h>只放在game.h文件中,再用text.c和game.c调用game.h即可


调用时采用#include "game.h"


这里采用do{}while循环,因为玩家打开程序后,首先看见的是游戏菜单界面(menu)

void menu()                                                  //打印菜单界面函数
{
    printf("***************************\n");
    printf("********   1.play  ********\n");
    printf("********   0.exit  ********\n");
    printf("***************************\n");
    printf("***************************\n");
}
int main()
{
    int input = 0;
      do
    {
        menu();                                                     //打印菜单
        printf("请选择;>");
        scanf("%d", &input);                                  
        switch (input)                                            //采用循环,游戏可以进行多次,直至你输入0
        {                                                                //表示退出游戏,这也是while循环中括号条件
        case 1:                                                      //的缘故
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("输入错误,请重新选择\n");
            break;
        }
    } while (input);
    return 0;
};

之后也就是输入1 进入游戏模块,游戏的开始

game()函数:

首先给玩家呈现的是一个棋盘

例如

9ce2b670791755bca8d36ad99362599f_7478f44c7a434035b08cf6ea851e7d24.png

那么想要打印棋盘,首先要明白三子棋要怎样存放,这里我们定义一个数组来存放,

定义数组,首先得让数组初始化,为了方便之后改数据,可以使用全局变量        

这里我都放在了game.h文件中,用来函数的声明

game.h

#include <stdio.h>
#define ROW 3
#define COL 3

game()函数:

char board[ROW][COL] = { 0 };                                  //定义数组来储存
init_board(board, ROW, COL);                                   //数组的初始

全部初始化为空格

放在game.c文件中

//初始化棋盘
void init_board(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] = ' ';
        }
    }
}

同时,在game.h文件中加入声明

void display_board(char board[ROW][COL], int row, int col); 

再然后,初始化之后,就要开始打印棋盘了

void display_board(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++)
        {
            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 player_move(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    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("坐标被占用,请重新输入\n");
            }
        }
        else
        {
            printf("坐标非法,请重新输入\n");
        }
    }
}
电脑下棋
//电脑随机下棋
void computer_move(char board[ROW][COL], int row, int col)
{
    printf("电脑下棋;>\n");
    while (1)
    {
        int x = rand() % row;              
        int y = rand() % col; 
        if (board[x][y] == ' ')
        {  
            board[x][y] = '#';
            break;
        }
    }
}

这里采用rand函数,调用ranf函数必须先使用srand函数,这里采用时间,因为时间是在不断变化

07d9ccc4b7f93044876a436a460fb8cc_ec91855ef4c748ff883a246a3b9f1a88.png

在主函数中调用一次即可


接下来讲就是判断游戏状态,比如玩家在对角线,或者每一行、每一列相同就获胜,电脑也是一样,但是还有一种情况就是平局

int is_full(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;
}
char is_win(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0]!=' ')
        {
            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[0][i];
        }
    }
    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[1][1] != ' ')
    {
        return board[0][2];
    }
    if (is_full(board, row, col) == 1)
    {
        return 'Q';
    }
    else
    {
        return 'C';
    }
} 

最后,我将展示三个文件 的完整代码如下:

text.c

4ca7d1a66d849ea977615367f89a1da6_806fd998ff074242bf0da9d469fe3cc2.png

game.c

4922991379518d2d04e597919802116e_0eef6fabf50a425badd1839ce6ec59a9.png

game.h

1dcd8a2458af0bff6e8302d24349ef00_22567a1faf9a43529504e13fd3edd9d0.png

文章的最后,谢谢大家的观看,加油!!!

相关文章
|
移动开发
RN开发快速切换底部导航时react-native-swiper轮播图组件白屏
RN开发快速切换底部导航时react-native-swiper轮播图组件白屏
538 0
RN开发快速切换底部导航时react-native-swiper轮播图组件白屏
|
7月前
|
SQL 分布式计算 关系型数据库
|
缓存 安全 Java
【Java面试题汇总】Java基础篇——基础、修饰符和关键字(2023版)
Java的特点和优点,、Java 8的新特性、面向对象、基本数据类型和引用类型、自动拆装箱与自动装箱、==与equals()的区别、为什么重写equals()就要重写hashcode()、抽象类和接口的区别、重载和重写的区别、四种引用方式、wt()和sleep()的区别、java方法是值传递还是引用传递?访问修饰符、static、final、this和super、volatile的用法及原理
【Java面试题汇总】Java基础篇——基础、修饰符和关键字(2023版)
|
传感器 存储 设计模式
嵌入式C语言之策略模式简单说明
嵌入式C语言之策略模式简单说明
|
安全 网络安全 API
kotlin安卓开发JetPack Compose 如何使用webview 打开网页时给webview注入cookie
在Jetpack Compose中使用WebView需借助AndroidView。要注入Cookie,首先在`build.gradle`添加WebView依赖,如`androidx.webkit:webkit:1.4.0`。接着创建自定义`ComposableWebView`,通过`CookieManager`设置接受第三方Cookie并注入Cookie字符串。最后在Compose界面使用这个自定义组件加载URL。注意Android 9及以上版本可能需要在网络安全配置中允许第三方Cookie。
|
小程序 前端开发 JavaScript
小程序项目实战-基于微信小程序的自习室系统设计与实现,可作为毕业设计(二)
小程序项目实战-基于微信小程序的自习室系统设计与实现,可作为毕业设计
|
iOS开发 开发者
hbuilder打包IOS上线APP流程(一)
hbuilder打包IOS上线APP流程
|
机器学习/深度学习 人工智能 算法
AAAI,ICML,CVPR,NeurIPS...31篇国际七大AI顶会2021年度Best Papers 一文回顾(3)
AAAI,ICML,CVPR,NeurIPS...31篇国际七大AI顶会2021年度Best Papers 一文回顾
411 0
|
JSON 小程序 数据格式
微信小程序数据赋值错误不停地报 SyntaxError: Unexpected end of JSON input错误
微信小程序数据赋值错误不停地报 SyntaxError: Unexpected end of JSON input错误
528 0
微信小程序数据赋值错误不停地报 SyntaxError: Unexpected end of JSON input错误
|
云安全 弹性计算 运维
海外证券交易类APP公共云防护实践
弹性防护与全球性合规能力,帮助用户节约云服务器成本50%以上。
海外证券交易类APP公共云防护实践