三子棋的实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Pg_dog/article/details/53314624
 三子棋的实现还是比较简单的,在写代码之前,你先构建一下游戏的架构,这样写的时候思路比较清晰,不容易思想卡克,很容易就完成。再一个,你写的代码并不是孤芳自赏的,而是要拿出来给别人看,别人可以清楚地看懂你的代码,这才是好代码。
我们先来看三子棋的架构如何实现,这就看你的思维逻辑能力了。下面代码很清晰的展现了这一架构:
    void game()                                         //主游戏模块
{ 
    char ret = 0;
    char arr[ROWS][COLS] = {0};                         //用二维数组来实现落子的坐标
    init_chessboard(arr, ROWS, COLS);                   //初始化棋盘
    display_chessboard(arr, ROWS, COLS);                //打印棋盘
    while (1)      //通过while循环来实现玩家与电脑交替下棋的过程
    {
        player_move(arr, ROWS, COLS);                    //玩家下棋
        display_chessboard(arr, ROWS, COLS);              
        ret = judge_win(arr, ROWS, COLS);                //判断是否棋盘满了
        if ( ret !=' ')
        {
            break;
        }
        printf("------------\n");
        computer_move(arr, ROWS, COLS);                  //电脑下棋
        display_chessboard(arr, ROWS, COLS);
        ret = judge_win(arr, ROWS, COLS);                //判断棋盘是否已满
        if (ret != ' ')
        {
            break;
        }
    }
    if ('O' == ret)
        printf("恭喜你赢了!!!\\n");
    else if ('X' == ret)`这里写代码片`
        printf("很遗憾你输了!!!\n");
    else
        printf("平局\n");
}

下来我们来设计主函数。切记,主函数一定要简单,这样看上去一目了然,很有条理性。看下面主函数代码:

int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));         //利用rand()函数设计随机数种子     
    do                                       //利用do while循环语句保证玩家可以连续玩游戏
    {
        print_menu();                        //主菜单
        printf("请选择:");
        scanf("%d", &input);
        switch (input)
        {
        case PLAY:
            game();                           //主游戏模块  
            break;
        case EXIT:
            break;
        default:
            printf("输入错误,请重新输入!");
        }

    } while (input);
    return 0;
}

写到这,可以说游戏已经完成了60%,剩下的就是具体功能块的实现和一些有待完善的小细节。
一, 玩家下棋

void player_move(char arr[ROWS][COLS], int rows, int cols)
{
    int x = 0;
    int y = 0;  

    while (1)
    {   
        printf("输入你要落子的位置:");
        scanf("%d%d", &x, &y);  
        x--;
        y--;
        if ((x >= 0) && (x <= rows - 1) && (y >= 0) && (y <= cols - 1))
        {
            if (arr[x][y] == ' ')
            {
                arr[x][y] = 'O';
                break;
            }
        }
            else
            {
                printf("输入错误,请重新输入!!!\n");
            }
    }
}

二, 电脑下棋

void computer_move(char arr[ROWS][COLS], int rows, int cols)
{
    while (1)
    {
        int x = rand()%3;
        int y = rand()%3;
            if (arr[x][y] == ' ')
            {
                arr[x][y] = 'X';
                break;
            }
    }

}

三, 判断棋盘是否已满

static int is_full(char arr[ROWS][COLS],int rows,int  cols)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < cols; j++)
        {
            if (' ' == arr[i][j])
            {
                return 0;  //没有满,继续下
            }
        }
    }
    return 1;   //满了,平局
}

char judge_win(char arr[ROWS][COLS], int rows, int cols)
{
    int i = 0;
    for (i = 0; i < rows; i++)
    {
        if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2])&&arr[i][0] != ' ')
        {
            return arr[i][0];
        }
        if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && arr[0][i] != ' ')
        {
            return arr[0][i];
        }
    }
        if ((arr[0][0]) == (arr[1][1]) && (arr[1][1]) == (arr[2][2])&&arr[1][1]!=' ')
        {
            return arr[1][1];
        }
        if ((arr[0][2]) == (arr[1][1]) && (arr[1][1]) == (arr[2][0])&&arr[1][1] != ' ')
        {
            return arr[1][1];
        }
    if (is_full(arr, rows, cols))
    {
        return 'd';                                  //平局
    }
    else
        return ' ';                                  //没满,继续下
}

四, 初始化棋盘

void init_chessboard(char arr[ROWS][COLS],int rows,int cols)
{
    //int i = 0;                             //方法一
    //int j = 0;
    //for (i = 0; i < 3; i++)
    //{
    //  for (j = 0; j < 3; j++)
    //  {
    //      arr[i][j] = ' ';
    //  }
    //}
    memset(arr, ' ', sizeof(char)*rows*cols);     //方法二,效率更高
}

五, 打印棋盘

void display_chessboard(char arr[ROWS][COLS], int rows, int cols)
{
    int i = 0;
    int j = 0;
    for (i = 0; i <= 2; i++)
    {
            printf(" %c | %c | %c \n", arr[i][0],arr[i][1],arr[i][2]);
            if (i != ROWS - 1)
            {
                printf("---|---|---\n");
            }
    }
}

六, 菜单模块

void print_menu()   //菜单函数
{
    printf("-------------三子棋---------------\n");
    printf("**********************************\n");
    printf("*    1,开始游戏    \n");
    printf("*    0,退出 \n");
    printf("**********************************\n");
}

最后一点就是建立头文件对函数进行声明。代码如下:

#ifndef __CHEES_H__
#define __CHEES_H__

#define ROWS 3                //宏定义
#define COLS 3

void init_chessboard(char arr[ROWS][COLS], int rows, int cols);
void  display_chessboard(char arr[ROWS][COLS], int rows, int cols);
void player_move(char arr[ROWS][COLS], int rows, int cols);
void computer_move(char arr[ROWS][COLS], int rows, int cols);
char judge_win(char arr[ROWS][COLS], int rows, int cols);
int is_full(char arr[ROWS][COLS], int rows,int cols);


#endif //__CHEES_H__

这个三子棋小游戏就完成了,是不是很简单,只要思路清晰,写出这个应该对你还是比较简单的。相信你,加油!!!

猜你喜欢

转载自blog.csdn.net/Pg_dog/article/details/53314624