C语言三子棋小游戏

C语言三子棋小游戏,第1张

1.头文件:

#define ROW 3
#define COL 3
#include
#include
#include
 
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);
char IsWin(char board[ROW][COL], int row, int col);
int IsFull(char board[ROW][COL], int row, int col);

为了方便程序修改,将棋盘的行和列使用宏定义。

2.函数功能实现源文件:

#include "game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
    int i;
    for (i = 0; i < row; i++)
    {
        int j;
        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;
        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=0, 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 ComputerMove(char board[ROW][COL], int row, int col)
{
    int i, j;
    printf("电脑走: \n");
    
    while (1)
    {
        i = rand() % row;
        j = rand() % col;
        if (board[i][j] == ' ')
        {
            board[i][j] = '#';
            break;
        }
    }
}
//返回1表示棋盘满了  返回0表示棋盘没满
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++)
        {
            if (board[i][j] == ' ')
                return 0;
        }
    }
    return 1;
}
//共四种情况,*玩家获胜   #电脑获胜 C继续游戏  Q平局
char IsWin(char board[ROW][COL], int row, int col)
{
    int i, j;
    //横三行
    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][i];
        }
    }
 
    //竖三列
    for (j = 0; j < col; j++)
    {
        if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
        {
            return board[1][j];
        }
    }
    //两个对角线
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
        return board[1][1];
    if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
        return board[1][1];
    //判断是否是平局
    if (1 == IsFull(board, ROW, COL))
    {
        return 'Q';
    }
    return 'C';
}

3.功能测试源文件:

//测试三子棋游戏
#include
#include"game.h"
void game()
{
    char ret;
    char board[ROW][COL] = { 0 };
    InitBoard(board, ROW, COL);//初始化棋盘 c
    DisplayBoard(board, ROW, COL);
    ret = IsWin(board, ROW, COL);
    while (1)
    {
        PlayerMove(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        if (ret != 'C')//判断玩家是否获胜
        {
            break;
        }
        ComputerMove(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        ret = IsWin(board, ROW, COL);
        if (ret != 'C')//判断电脑是否获胜
        {
            break;
        }
    }
    if (ret == '*')
    {
        printf("玩家获胜!!\n");
    }
    else if (ret == '#')
        printf("电脑获胜!!\n");
    else
        printf("平局!!\n");
 
}
void menu()
{
    printf("##############################\n");
    printf("##1.开始游戏     0.退出游戏###\n");
    printf("##############################\n");
}
void text()
{
    int input = 0;
    srand((unsigned int)time(NULL));
    do {
        menu();
        printf("请选择数字: \n");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("输入的数字有误!!请重新输入\n");
            break;
        }
    } while (input);
}
int main()
{
    text();
    return 0;
}

注:该小游戏实现思路:玩家自己选择空格进行下棋,而电脑则需要随机选择空格进行下棋,后续需要进行判断是否棋盘已满,判断获胜情况等。

在函数功能实现源文件中,主要实现的模块有:初始化棋盘,打印棋盘,玩家下棋,电脑下棋,以及判断获胜。

1.初始化棋盘:将棋盘也就是数组中的元素全部赋值字符空格(' '),便于后续 *** 作

2.打印棋盘:直接循环打印即可

3.玩家下棋:核心功能就是下棋之后对下棋位置的判断,满了就需要重新 *** 作,不满则下棋。

因为程序员知道数组下标是从0开始,而玩家不知晓,所以玩家在选择好下棋位置之后,数组下标应当-1;

4.电脑下棋:电脑与玩家不同,玩家可以自主选择下棋位置,而电脑则需要判断每个位置是否已被占用,随机挑选位置进行下棋:这里为了让电脑随机生成坐标,使用rand生成随机数对棋盘行列模2(rand()%2)刚好可以表示棋盘坐标,rand需要与srand配合使用srand((unsigned int)time NULL),注意这里time的头文件是time.h

当产生随机坐标以后,只需进行判断而后下棋就可

5.判断获胜:获胜情况有:1.玩家赢 2.电脑赢 3.平局    获胜条件是三行的元素相同,或者三列以及两条对角线元素相同。

接受该函数返回的字符进行判断即可。

该三子棋涉及的C语言的相关知识点有:1.for循环  2.do  while 循环   3.自定义函数实现

若有不理解的地方可以评论,看到就会回复哦

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/674313.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存