C语言-三子棋-小游戏

一 主要涉及到的知识点:

1.1 数组:

1 二维数组

1.2 循环语句:

1. for循环语句

2. while()循环

2. do while()语句

1.3 if else 判断语句

        这里随便找一个, 玩家下棋的逻辑判断

1.4 switch() 语句

1.5 函数:

1. 函数的定义:

1.6 如何将不同的.c文件,在主函数调用其他.c的函数逻辑代码:

1.test.c: 这里是主函数文件

2. game.c 这个是函数逻辑代码文件

3. game.h 这个是头文件

        首先怎么在主函数test,c文件调用game.c里的代码, 这里需要将函数定义声明,放到头文件里,然后需要的话, 就将这个头文件导入即可, 这里三子棋里就有使用, 如下图所示:

        这里是主函数导入头文件,就可以使用函数逻辑代码, 要想使用就需要先声明如图:

        这里就是函数的声明,将函数声明就可以在主函数里, 导入头文件, 进行函数的调用使用

1.7 随机数的生成与定义:

1.7.1 rand()

        需要使用的时候, 调用rand()函数, 就可以生成32767范围内里的证书数, 但是在使用它之前要, 设置随机数的生成起点; 如1.5.2

1.7.2 srand((unsigned int)time(NULL))

        这里为什么这样,我就不叙述了, 要想了解的, 可以自己深入查一下. 

二 游戏代码讲解: 

2.1 打印界面函数定义:

        这里首先要打印游戏界面, 然后让玩家进行选择, 选择1进入游戏, 选择0退出游戏;如图所示:

2.2 判断进入游戏或者退出游戏:

        如下图所示, 这里通过do while 循环进入, 然后打印界面后, 玩家要输入是否进入游戏或者退出游戏, 通过switch语句进行判断, 1进入游戏,0退出游戏,出入去其他就打印输入错误 

2.3 进入三子棋函数:

        //进入三子棋函数
        ThreeChessFunction();

        进入游戏函数里,这里定义了一个二维数组,进行存储数据, 紧接着就是  //初始化棋盘,

        InitializeCheckerboard(ThreeChessArr, ROW, COL); 如下图,就是将' '存入二维数组里.

        //打印棋盘
        PrintfCheckerboard(ThreeChessArr, ROW, COL);

        打印棋盘,如下图,  这里是第一个for循环是行循环, 行循环就是第一次循环, 打印第一行, 进入后  打印的第一行, 然后将空格存入数组里, 再将|也存进去,这个是打印数据,然后打印分隔符----|----|----, 这里需要注意的是, 分隔符还有|最后一个都不需要打印,通过判断行列然后循环判断里-1

2.4 下棋

        进入循环里, 然后玩家和电脑进行下棋, 玩家下棋函数逻辑代码分析:如下图:

        首先玩家输入坐标后, 进行判断, 这里判断的是, 玩家输入的坐标是否正确

        电脑下棋: 

        电脑下棋比较简单, 直接判断数组里是否有空位, 有直接就将随机生成的数,将#存入进去

       2.5 判断输赢

         判断输赢, 这里我就不叙述,都有注释

三 源代码如下:

3.1 test.c文件:

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"


//函数定义逻辑-------------------------------------------------------------
//打印界面函数定义
void menu()
{
    printf("*****************************************\n");
    printf("**************   1. play   **************\n");
    printf("**************   0. exit   **************\n");
    printf("*****************************************\n");
}
//定义三子棋函数
void ThreeChessFunction()
{
    //定义二维数组
    char ThreeChessArr[ROW][COL] = { 0 };
    //初始化棋盘
    InitializeCheckerboard(ThreeChessArr, ROW, COL);
    //打印棋盘
    PrintfCheckerboard(ThreeChessArr, ROW, COL);

    char ret = 0 ;
    //下棋
    while (1)
    {
        //玩家下棋
        PlayerMove(ThreeChessArr, ROW, COL);
        //判断输赢
        ret = IsWin(ThreeChessArr, ROW, COL);
        //如果ret返回值不等于'C',退出循环
        if (ret != 'C')
        {
            break;
        }
        //打印棋盘
        PrintfCheckerboard(ThreeChessArr, ROW, COL);


        //电脑下棋
        ComputerMove(ThreeChessArr, ROW, COL);
        //判断输赢
        ret = IsWin(ThreeChessArr, ROW, COL);
        //如果ret返回值不等于'C',退出循环
        if (ret != 'C')
        {
            break;
        }
        //打印棋盘
        PrintfCheckerboard(ThreeChessArr, ROW, COL);
    }

    //判断ret返回值,
    if (ret == '*')
    {
        printf("玩家赢了\n");
    }
    else if (ret == '#')
    {
        printf("电脑赢了\n");
    }
    else
    {
        printf("平局了\n");
    }
    //打印棋盘
    PrintfCheckerboard(ThreeChessArr, ROW, COL);
}
int main()
{
    srand((unsigned int)time(NULL)); //设置随机数的生成起点
    int input = 0;
    do
    {
        //1.打印界面
        menu(); 
        printf("清选择:>");
        //2.输入是否进入游戏或退出游戏
        scanf("%d", &input); 
        //3.通过switch语句进行判断
        switch (input)
        {
            case 1:
            {
                //进入三子棋函数
                ThreeChessFunction();
                break;
            }
            case 0:
            {
                printf("退出游戏\n");
                break;
            }
            default:
            {
                printf("输入错误!\n");
                break;
            }
        }

    } while (input);
    return 0;
}

3.2 game.h 文件:

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//通过宏定义变量,后边可以随时更改
#define ROW 3
#define COL 3

//初始化棋盘
void InitializeCheckerboard(char ThreeChessArr[ROW][COL], int row, int col);

//打印棋盘
void PrintfCheckerboard(char ThreeChessArr[ROW][COL], int row, int col);

//玩家下棋
void PlayerMove(char ThreeChessArr[ROW][COL], int row, int col);

//电脑下棋
void ComputerMove(char ThreeChessArr[ROW][COL], int row, int col);

//判断输赢
//1.玩家赢 '*'
//2.电脑赢 '#'
//3.平局 'Q'
//4.继续 'C'
char IsWin(char ThreeChessArr[ROW][COL], int row, int col);

3.3 game.h 文件

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

//初始化棋盘
void InitializeCheckerboard(char ThreeChessArr[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        int j = 0;
        for (j = 0; j < col; j++)
        {
            ThreeChessArr[i][j] = ' ';
        }
    }
}

//打印棋盘
void PrintfCheckerboard(char ThreeChessArr[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 ", ThreeChessArr[i][j]);
            if (j < col - 1)
            {
                printf("|");
            }
        }
        printf("\n");

        //打印分割信息
        if (i < row - 1)
        {
            int h = 0;
            for (h = 0; h < col; h++)
            {
                printf("---");
                if (h < col - 1)
                {
                    printf("|");
                }
            }
        }
        printf("\n");

    }
}

//玩家下棋
void PlayerMove(char ThreeChessArr[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("玩家下棋:>\n");
    while (1)
    {
        printf("请输入坐标:>");
        scanf("%d %d", &x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            if (ThreeChessArr[x - 1][y - 1] == ' ')
            {
                ThreeChessArr[x - 1][y - 1] = '*';
                break;
            }
            else
            {
                printf("坐标被占用,不能下棋,请选择其他位置\n");
            }
        }
        else
        {
            printf("非法坐标,请重新输入\n");
        }
    }

}

//电脑下棋
void ComputerMove(char ThreeChessArr[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("电脑下棋:>\n");
    while (1)
    {
        x = rand() & row; //0-2
        y = rand() & col; //0-2
        if (ThreeChessArr[x][y] == ' ')
        {
            ThreeChessArr[x][y] = '#';
            break;
        }
        
    }

}

//判断是否是平局函数定义
//返回1为平局,返回0则继续
int IsFull(char ThreeChessArr[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 (ThreeChessArr[i][j] == ' ')
            {
                return 0;
            }
        }
    }
    return 1;
}

//判断输赢
//1.玩家赢 '*'
//2.电脑赢 '#'
//3.平局 'Q'
//4.继续 'C'
char IsWin(char ThreeChessArr[ROW][COL], int row, int col)
{
    //判断行
    int i = 0;
    for (i = 0; i < row; i++)
    {
        if (ThreeChessArr[i][0] == ThreeChessArr[i][1] &&
            ThreeChessArr[i][1] == ThreeChessArr[i][2] && ThreeChessArr[i][1] != ' ')
        {
            return ThreeChessArr[i][1];
        }
    }

    //判断列
    int j = 0;
    for (j = 0; j < col; j++)
    {
        if (ThreeChessArr[0][j] == ThreeChessArr[1][j] &&
            ThreeChessArr[1][j] == ThreeChessArr[2][j] && ThreeChessArr[1][j] != ' ')
        {
            return ThreeChessArr[1][j];
        }
    }

    //判断对角线
    if (ThreeChessArr[0][0] == ThreeChessArr[1][1] &&
        ThreeChessArr[1][1] == ThreeChessArr[2][2] && ThreeChessArr[1][1] != ' ')
    {
        return ThreeChessArr[1][1];
    }
    if (ThreeChessArr[0][2] == ThreeChessArr[1][1] &&
        ThreeChessArr[1][1] == ThreeChessArr[2][0] && ThreeChessArr[1][1] != ' ')
    {
        return ThreeChessArr[1][1];
    }
    //没有人赢,平局
    if (IsFull(ThreeChessArr, row, col))
    {
        return 'Q';
    }

    //继续
    return 'C';
}

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值