C语言——初级三子棋游戏的实现

简介: C语言史上最全初级三子棋游戏的实现,看完点个关注哦

一、三子棋游戏的整体设计思路

首先我们可将实现该游戏代码总体分为三个部分来实现:
1.test.c三子棋游戏的测试实现
2.game.h 三子棋游戏的函数声明
3.game.c 三子棋游戏的实现

二、三子棋游戏的各部分代码实现

2.1游戏菜单的打印

我们知道一个游戏程序的实现,我们必须先要打印一个游戏菜单来供游戏用户选择进入游戏,还是选择退出游戏,我们可以通过if---else语句或者switch语句来实现该功能模块的实现,在此,我通过if---else语句来为大家演示。我们先打印一个游戏菜单,在此通menu()来实现其打印:

void menu()
{
    printf("*********************************\n");
    printf("**********    1.play   **********\n");
    printf("**********    0.exit   **********\n");
    printf("*********************************\n");

}

接下来我们来实现游戏进入或者退出模块:

int main()
{
    //游戏菜单打印
    menu();
    //判断进入游戏界面
    int i = 0;
    
    while (1)
    {
        if (i == 1)
        {
            //成功进入游戏
            game();
            break;
            
        }
        else if (i == 0)
        {
            printf("退出游戏成功!\n");
            break;
        }
        else
        {
            printf("输入错误,请重新输入!\n");
            break;
        }
    }


    return 0;
}

游戏代码运行截图:
在这里插入图片描述

2.2对游戏棋盘进行初始化

在对进入游戏菜单进行选择之后,我们需要对游戏菜单进行初始化操作,在此我们通过自定义一个==init_board()==来实现该阶段:

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] = ' ';
        }
    }
}

我们用==ROW==来代表三子棋游戏的行数,用==COL==来代表三子棋游戏的列数
三子棋顾名思义为一个3*3的游戏框架,所以我们可以利用二维数组来实现其功能:

char board[ROW][COL] = { 0 };

2.3对三子棋游戏棋盘进行装饰

在对棋盘进行初始化之后,我们需要对其进行一定的装饰,使其变得更加美观,使其更加具有一定的观赏性,所以我们可以通过自定义一个display_board函数来实现。


//装饰棋盘
void display_board(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
        //数据格式
        //printf(" %c | %c | %c \n ", board[i][0], board[i][1], board[i][2]);
    {
        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)
        {
            //printf("---|---|---\n");
            for (j = 0; j < col; j++)
            {
                printf("---");
                if (j < col - 1)
                    printf("|");
            }
            printf("\n");
        }
    }
}

运行代码如下:
在这里插入图片描述
注意:我们为了避免以后可能会产生不必要的麻烦,我们需要定义两个全局变量==ROW== 和==COL==,这样我们就可以通过控制ROW和COL来控制整个游戏棋盘。

2.4 玩家用户下棋模块的实现

实现该功能我们需要注意两个点:
==1.玩家用户输入的坐标是否合法
2.玩家用户输入的坐标地址是否被占用==
我们通过自定义player_board()来实现该功能
代码实现如下:

//玩家下棋
void player_move(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("玩家下棋:>");
    while (1)
    {
        printf("请输入需要下棋的坐标:>");
        scanf("%d %d", &x, &y);
        //需要注意:1.坐标的合法性 2.坐标是否被占用
        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");
        }
    }
}

2.5电脑随机下棋模块的实现

使电脑产生随机数字我们需要运用==rand==和==time==函数,所以我们需要包含两个头文件==stdlib.h==和==time.h==,同时我们需要判断电脑下棋的位置是否被用户所占用,我们通过自定义computer_move函数来实现该功能。

void computer_move(char board[ROW][COL], int row, int col)
{
    printf("电脑下棋:>\n");
    //利用rand来产生随机数
    while (1)
    {
        int x = rand() % row;
        int y = rand() % col;
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}

2.6三子棋游戏胜负的判断

我们通过自定义is_win函数来实现该功能,我们规定如下规则:
==1.玩家赢 --> 返回'*'
2.电脑赢 --> 返回'#'
3.平局 --> 返回'Q'
4.游戏继续 --> 返回'C'==
代码如下:

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[0][i];
        }
        
    }
    for (i = 0; i < col; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
        {
            return board[0][i];
        }

    }
    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];

    }
    //判断平局
    if (is_full(board, row, col) == 1)
    {
        return 'Q';
    }
    return 'C';

}

在判断平局时我们还需要通过自定义一个full_board函数来实现该功能:

//棋盘满了,返回1
//不满,返回0
static int is_full(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++)
        {
            if (' ' == board[i][j])
            {
                return 0;
            }
        }
    }
    return 1;
}

三、三子棋游戏运行实况

在这里插入图片描述

四、各部分完整代码附录

==test.c==完整代码块

# define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
    printf("*********************************\n");
    printf("**********    1.play   **********\n");
    printf("**********    0.exit   **********\n");
    printf("*********************************\n");

}
void game()
{
    char ret = 0;
    //数据的存储需要一个3*3的二维数组
    char board[ROW][COL] = { 0 };
    //初始化棋盘
    init_board(board, ROW, COL);
    display_board(board, ROW, COL);
    //玩游戏部分
    while (1)
    {
        player_move(board, ROW, COL);
        display_board(board, ROW, COL);
        ret=is_win(board, ROW, COL);
        if (ret != 'C')
            break;
        computer_move(board, ROW, COL);
        display_board(board, ROW, COL);
        ret = is_win(board, ROW, COL);
        if (ret != 'C')
            break;
    }
    //规定:玩家赢- *
    //      电脑赢-#
    //       平局 -Q
    //       游戏继续-C
    if (ret == '*')
    {
        printf("玩家赢\n");
    }
    else if (ret == '#')
    {
        printf("电脑赢\n");
    }
    else if (ret == 'Q')
    {
        printf("平局\n");
    }
    display_board(board, ROW, COL);

}
int main()
{
    //游戏菜单打印
    menu();
    //判断进入游戏界面
    int i = 0;
    srand((unsigned int)time(NULL));
    scanf("%d", &i);
    while (1)
    {
        if (i == 1)
        {
            //成功进入游戏
            game();
            break;
            
        }
        else if (i == 0)
        {
            printf("退出游戏成功!\n");
            break;
        }
        else
        {
            printf("输入错误,请重新输入!\n");
            break;
        }
    }


    return 0;
}

==game.c==完整代码块

# define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//初始化棋盘
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] = ' ';
        }
    }
}

//装饰棋盘
void display_board(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
        //数据格式
        //printf(" %c | %c | %c \n ", board[i][0], board[i][1], board[i][2]);
    {
        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)
        {
            //printf("---|---|---\n");
            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("玩家下棋:>");
    while (1)
    {
        printf("请输入需要下棋的坐标:>");
        scanf("%d %d", &x, &y);
        //需要注意:1.坐标的合法性 2.坐标是否被占用
        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");
    //利用rand来产生随机数
    while (1)
    {
        int x = rand() % row;
        int y = rand() % col;
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}

//棋盘满了,返回1
//不满,返回0
static int is_full(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++)
        {
            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[0][i];
        }
        
    }
    for (i = 0; i < col; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
        {
            return board[0][i];
        }

    }
    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];

    }
    //判断平局
    if (is_full(board, row, col) == 1)
    {
        return 'Q';
    }
    return 'C';

}

game.h完整代码块

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
# define ROW 3   //ROW 代表棋盘的行数
# define COL 3   //COL 代表棋盘的列数
//初始化棋盘
void init_board(char board[ROW][COL], int row, int col);
//装饰棋盘
void display_board(char board[ROW][COL],int row,int col);
//玩家下棋
void player_move(char board[ROW][COL], int row,int col);
//电脑随机下棋
void computer_move(char board[ROW][COL],int row, int col);
//判断游戏的状态
char is_win(char board[ROW][COL], int row, int col);

在这里插入图片描述

相关文章
|
1月前
|
C语言
C语言之斗地主游戏
该代码实现了一个简单的斗地主游戏,包括头文件引入、宏定义、颜色枚举、卡牌类、卡牌类型类、卡牌组合类、玩家类、游戏主类以及辅助函数等,涵盖了从牌的生成、分配、玩家操作到游戏流程控制的完整逻辑。
72 8
|
2月前
|
C语言
扫雷游戏(用C语言实现)
扫雷游戏(用C语言实现)
125 0
|
4月前
|
机器学习/深度学习 C语言
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
47 1
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
|
26天前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
44 2
|
5月前
|
存储 C语言 开发者
C语言实战 | Flappy Bird游戏
【7月更文挑战第4天】Flappy Bird是由越南开发者制作的简单却极具挑战性的游戏,玩家需控制小鸟穿越水管障碍。游戏涉及角色初始化、显示和更新。小鸟和水管结构体存储数据,使用变量和数组。初始化小鸟和水管,显示背景、小鸟和水管,更新小鸟位置及碰撞检测。代码示例展示了小鸟和水管的状态管理,当小鸟与管道碰撞或触地时,游戏结束。游戏的成功在于其独特的虐心体验。
85 0
C语言实战 | Flappy Bird游戏
|
1月前
|
C语言 Windows
C语言课设项目之2048游戏源码
C语言课设项目之2048游戏源码,可作为课程设计项目参考,代码有详细的注释,另外编译可运行文件也已经打包,windows电脑双击即可运行效果
33 1
|
2月前
|
编译器 C语言
猜数字游戏实现#C语言
猜数字游戏实现#C语言
95 1
|
2月前
|
存储 C语言
揭秘C语言:泊舟的猜数字游戏
揭秘C语言:泊舟的猜数字游戏
|
2月前
|
存储 算法 安全
C语言实现扫雷游戏
C语言实现扫雷游戏
|
2月前
|
算法 编译器 C语言
【C语言】实现猜数字游戏(分支语句与循环语句的运用)
【C语言】实现猜数字游戏(分支语句与循环语句的运用)