當前位置:網站首頁>三子棋遊戲思路

三子棋遊戲思路

2022-01-28 07:24:33 照肆

今天用C語言來模擬一個三子棋遊戲。

總共大概分為五部

1.構建一個菜單出來,讓玩家可以選擇是否進行遊戲。

2.打印棋盤,通過對二維數組的運用,打印一個N*N的棋盤,主要是用空格將棋盤初始化,並將棋盤的框架打出。

3.玩家進行下棋,玩家會隨意的在空格出下棋。這裏需要注意的玩家並不知道二維數組的每行每列是從0開始的,並且玩家不能輸入超出棋盤的棋子或者在已經下過的比特置繼續輸入。

4.電腦進行下棋,電腦下棋要注意隨機性,這裏就引用rand函數(需要srand函數當作前提條件)和time函數。電腦下棋相比玩家下棋就簡單一些,可以用while循環讓電腦自己下到不是重複的比特置。

5.判斷輸贏,總共只有玩家贏,電腦贏和平局三種情况。寫出代碼判斷誰先連成一條線即可,否則就是棋盤下滿了還未分出勝負則為平局。


首先,先將代碼的基本構建寫出來,先來構建一個菜單:

#include<stdio.h>
void menu()   //構建的菜單 
{
    printf("********************************\n");
    printf("************  1.play  **********\n");
    printf("************  2.exit  **********\n");
    printf("********************************\n");
}
void test()    //玩家的選擇
{
    int input = 0;
    do
    {
        menu();
        printf("請選擇是否遊玩遊戲");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            printf("玩遊戲\n");
            break;
        case 2:
            printf("退出遊戲\n");
            break;
        default:
            printf("選擇錯誤,請重新選擇\n");
            break;
        }

    } while (input);
}
int main()
{
    test();
    return 0;
}

編譯代碼,大概是這個結果:

 

接下來,我們就要寫case 1中的玩遊戲的過程了,這裏我們創建一個game()的函數來實現:

void game()
{
    char board[ROW][COL] = { 0 };           //存放下棋的數據
    InitBoard(board, ROW, COL);             //存放下棋的數據
    DisplayBoard(board, ROW, COL);      //打印棋盤

先打印一個棋盤的模型:

 

這裏的函數很多,所以我們創建了一個game.h的頭文件和一個game.c的源文件去實現這些函數。

game.h:

#include<stdio.h>
#define ROW 3
#define COL 3
//初始化棋盤
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盤
void DisplayBoard(char borad[ROW][COL], int row, int col);

game.c:

要讓我們的棋盤中沒有數字,將我們的二維數組都賦值為空格

#include"game.h"
void InitBoard(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++)
        {
            board[i][j] = ' ';
        }
    }
}

下面的代碼每次打印一個數據,打印一個豎線 一行打印完之後換行打印橫線。就是除了數據元素,再就是打印棋盤的結構,讓我們的棋盤能顯現出來。

void DisplayBoard(char borad[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 ", borad[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 game()
{
    //玩家下棋
    Player_Move(board, ROW, COL);
    DisplayBoard(board, ROW, COL);
}

 

game.h:

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

game.c:

void Player_Move(char board[ROW][COL], int row, int col)
{
    int a = 0;
    int b = 0;
    printf("玩家下棋\n");
        while (1)
        {
            printf("請玩家輸入坐標:");
            scanf("%d %d", &a, &b);
            if(a >= 1 && a <= row && b >= 1 && b <= col)
            {
                //開始下棋
                if (board[a - 1][b - 1] == ' ')        //這裏是因為玩家不知道二維數組的每行每列是0開始的
                {
                    board[a - 1][b - 1] = '*';
                    break;
                }
                else
                {
                   printf("該坐標已被占用,請重新輸入坐標\n");
                }
            }
            else
            {
               printf("坐標輸入非法,請重新輸入\n");
            }
        }
}

接下來,來實現電腦下棋:

void game()
{
    //電腦下棋
    computer_move(board, ROW, COL);//隨機下棋
    DisplayBoard(board, ROW, COL);
}

game.h: 

//電腦下棋
void computer_move(char board[ROW][COL], int row, int col);

game.c:

void computer_move(char board[ROW][COL], int row, int col)
{
        int x = 0;
        int y = 0;
        printf("電腦下棋\n");
        while (1)
        {
        x = rand() % row;
        y = rand() % col;
        if (board[x][y] == ' ')
        {
            board[x][y]='#';
            break;
        }
    }
}

最後,就是判斷輸贏:

這裏要看在什麼情况下,遊戲就結束了。

1.玩家贏,返回'*'

2.電腦贏,返回'#'

3.平局,返回'Q'

如果都沒贏,那就繼續,返回'C'

while (1)
    {
        //玩家下棋
        Player_Move(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        //判斷輸贏
        ret = is_win(board, ROW, COL);       //新創建的函數
        if (ret != 'c')
        {
            break;
        }
        //電腦下棋
        computer_move(board, ROW, COL);//隨機下棋
        DisplayBoard(board, ROW, COL);
        ret = is_win(board, ROW, COL);
        if (ret != 'c')
        {
            break;
        }
    }
    if (ret == '*')
    {
        printf("玩家贏了\n");
    }
    else if (ret == '#')
    {
        printf("電腦贏了\n");
    }
    else
    {
        printf("平局\n");
    }
}

game.h:

//判斷輸贏
char is_win(char board[ROW][COL], int row, int col);game.c

game.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][1] != ' ')
        {
            return board[i][1];
        }
    }
    //判斷列
    for (i = 0; i < col; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
        {
            return board[1][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.c裏面實現上面if_full()的函數,因為我只需要放在當前源文件,不讓其他文件使用,這裏就可以用static來修飾。

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] == ' ')     //如果棋盤內有空的,則返回0;
            {
                return 0;
            }
        }
    }
        return 1;
}

版權聲明
本文為[照肆]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201280724327303.html

隨機推薦