C语言实现三子棋小游戏

一、首先说一下具体思路:
我们首先要想到的是三子棋的棋盘是一个3*3的正方形棋盘,那么这个棋盘我们可以用一个二维数组来实现。接下来就要想到具体要怎么玩儿,首先让电脑下一个棋子走一步,然后玩家再下一个棋子走一步。电脑下棋我们要产生一些随机数,玩家下棋需要输入具体的坐标。最后就是判断输赢了:我们知道,三行三列还有两斜如果都是电脑或者玩家的棋子,那么对应的电脑或玩家获胜。如果棋盘全部被占满,还没有人获胜,那么就是平局。大概的思路就是这样。
二、再说下具体的设计过程:
1.首先我们要定义并初始化我们的三子棋棋盘:定义一个三行三列的二维数组,并将其每个元素都初始化为空格。
2.接着需要打印显示我们的棋盘。
3.然后就要实现电脑下棋的函数了:电脑下棋,需要产生一些随机数,这些随机数需要用到srand()函数和rand()函数。接着放棋子,放棋子也有条件,即只有当将要放的位置是空格时,才能放入棋子。
4.然后就是玩家下棋的函数了:玩家下棋具体实现方法是要输入一个(x,y)坐标,确定要放棋子的位置。玩家放棋子也有条件,即1必须得在这个3*3棋盘内部,2只有当将要放的位置是空格时才能放入棋子。
5.最后一步是判断输赢。三行三列两斜三行三列还有两斜如果都是电脑或者玩家的棋子,那么对应的电脑或玩家获胜。如果棋盘全部被占满,还没有人获胜,那么就是平局。我们规定如果电脑赢返回字符X,如果玩家赢返回字符O,如果是平局,就返回字符Q。
三、我们需要创建一个头文件来定义具体实现游戏需要的函数,即三子棋.h。需要一个实现游戏的源文件,即三子棋.c。需要一个用于测试的源文件,即main.c。
四、最后,将具体实现代码奉上。

三子棋.h 头文件 用于定义各个函数

#ifndef __SANZIQI__
#define __SANZIQI__

#define ROW 3
#define COL 3

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

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

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

//人下棋
void Playermove(char arr[ROW][COL], int row, int col);

//判断输赢
char Iswin(char arr[ROW][COL], int row, int col);

#endif

三子棋.c 用于实现各个函数

#include"三子棋.h"

//初始化棋盘
void Initboard(char arr[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            arr[i][j] = ' ';//将棋盘初始化为全空格
        }
    }
}

//打印棋盘
void Printboard(char arr[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    printf("-------------\n");
    for (i = 0; i < row; i++)
    {
        printf("|");
        for (j = 0; j < col; j++)
        {
            printf("%2c |", arr[i][j]);
        }
        printf("\n-------------\n");
    }
}

//电脑下棋 首先产生随机数种子 其次放入棋子,放入棋子时要判断放入的位置是否为空格,如果是则放入
void Computermove(char arr[ROW][COL], int row, int col)
{
    printf("电脑下棋\n");
    do
    {   
        int x = rand() % ROW;//产生一个随机数 行0-2 应该放入循环体内
        int y = rand() % COL;//产生一个随机数 列0-2 应该放入循环体内
        if (arr[x][y] == ' ')//如果要放入的位置不是空格,则表示可以放入
        {
            arr[x][y] = 'X';
            break;
        }
    } while (1);

}

//人下棋 首先要判断放入棋子的位置是否在棋盘(3*3)内部,其次还要判断将要放入棋子的位置是否为空格,如果是则放入
void Playermove(char arr[ROW][COL], int row, int col)
{
    int x = 0;//行
    int y = 0;//列
    do
    {
        printf("玩家下棋\n");
        printf("请输入坐标(x,y):");
        scanf("%d%d", &x, &y);
        x -= 1;//输入的是从下标为1开始的,而程序运行的则是从下标为0开始
        y -= 1;
        if (((x >= 0) && (x < ROW)) && ((y >= 0) && (y < COL)))//判断是否在(3*3)棋盘内部
        {
            if (arr[x][y] == ' ')//判断将要放入棋子的位置是否为空格
            {
                arr[x][y] = 'O';
                break;
            }
            else
            {
                printf("该位置已有棋子\n");
            }
        }
        else
        {
            printf("跑到棋盘外面去啦\n");
        }
    } while (1);

}

//判断棋盘是否已满函数 因为要声明在函数内部,所以用static关键字修饰
static int Isfull(char arr[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 (arr[i][j] == ' ')//如果棋盘内还有空格,返回0
            {
                return 0;
            }
        }
    }
    return 1;//循环完了还没有找到有空格的位置,则棋盘已满,返回1
}

//判断输赢 3行3列2斜,玩家赢或电脑赢。如果棋盘满了还没有一方赢,则为平局。
char Iswin(char arr[ROW][COL], int row, int col)
{
    int i = 0;
    //判断电脑赢
    //三行
    for (i = 0; i < row; i++)
    {
        if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][1] == 'X'))
        {
            return 'X';
        }
    }
    //三列
    for (i = 0; i < col; i++)
    {
        if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[1][i] == 'X'))
        {
            return 'X';
        }
    }
    //2斜
    if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[1][1] == 'X'))
    {
        return 'X';
    }
    if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[1][1] == 'X'))
    {
        return 'X';
    }

    //判断玩家赢
    //三行
    for (i = 0; i < row; i++)
    {
        if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][1] == 'O'))
        {
            return 'O';
        }
    }
    //三列
    for (i = 0; i < col; i++)
    {
        if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[1][i] == 'O'))
        {
            return 'O';
        }
    }
    //2斜
    if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[1][1] == 'O'))
    {
        return 'O';
    }
    if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[1][1] == 'O'))
    {
        return 'O';
    }

    //判断棋盘是否已满
    if (Isfull(arr,row,col))
    {
        return 'Q';
    }
    return ' ';//如果以上情况全部没有满足,则返回空格
}

main.c 用于测试

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#include"三子棋.h"

//菜单函数
void menu()
{
    printf("**************************\n");
    printf("******   1.play   ********\n");
    printf("******   0.exit   ********\n");
    printf("**************************\n");
}

//玩游戏函数
void game(void)
{
    char ret = 0;//定义判断函数返回值
    char arr[ROW][COL];//初始化棋盘数组
    srand((unsigned int)time(NULL));//产生一个此刻时间为初始值的随机数种子
    Initboard(arr, ROW, COL);//初始化棋盘
    do
    {
        Computermove(arr, ROW, COL);//电脑走一步
        Printboard(arr, ROW, COL);//打印棋盘
        ret = Iswin(arr, ROW, COL);//判断输赢
        if (ret != ' ')//如果ret不是空格,则说明是其他情况(电脑赢或玩家赢或平局),此时游戏已结束,所以break跳出
        {
            break;
        }
        Playermove(arr, ROW, COL);//玩家走一步
        Printboard(arr, ROW, COL);//打印棋盘
        ret = Iswin(arr, ROW, COL);//判断输赢
        if (ret != ' ')//如果ret不是空格,则说明是其他情况(电脑赢或玩家赢或平局),此时游戏已结束,所以break跳出
        {
            break;
        }
    } while ( 1 );

    if (ret == 'X')  //若返回字符X 则电脑赢
    {
        printf("电脑赢\n");
    }
    else if (ret == 'O')//若打印字符O 则玩家赢
    {
        printf("玩家赢\n");
    }
    else if (ret == 'Q')//若打印字符Q 则为平局
    {
        printf("平局\n");
    }
}


int main()
{
    int choose = 0;
    do
    {
        menu();
        printf("请选择:");
        scanf("%d", &choose);
        switch (choose)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("输入错误,请重新输入\n");
            break;
        }

    } while (choose);
    system("pause");
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值