三子棋小遊戲(C語言數組實現)

一,遊戲效果
三子棋小遊戲(C語言數組實現)
二,遊戲規則
1.輸入1進入遊戲
2.輸入0退出遊戲
3.玩家先走
4.玩家落子是選擇棋盤的座標位置
5.電腦是隨機落子
6.如果電腦連了三子則提示電腦贏了,選擇要不要繼續遊戲
三,實現遊戲的代碼思路
先構架遊戲整體思路









void game()
{
    char ret = 0;
    //數組存放棋盤信息
    char board[ROW][COL] = { 0 };//二維數組的初始化並沒有這麼簡單
    int row = ROW;
    int col = COL;
    //1.初始化棋盤
    //一定要初始化
    InitBoard(board, ROW, COL);
    //2.打印棋盤
    DisplayBoard(board, ROW, COL);
    //3.玩遊戲,開始下棋了
    while (1)
    {
        //玩家下棋
        PlayerMove(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        //判斷玩家是否贏了
        ret = Iswin(board, ROW, COL);
        //如果不是遊戲繼續,那麼就直接跳出循環
        if (ret != 'D')
        {
            break;
        }

        //電腦下棋
        ComputerMove(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        //判斷電腦是否贏了
        ret = Iswin(board, ROW, COL);
        //如果不是遊戲繼續,那麼就直接跳出循環
        if (ret != 'D')
        {
            break;
        }
    }
    if (ret == 'X')
        printf("玩家贏了\n");
    else if (ret == 'O')
        printf("電腦贏了\n");
    else
        printf("平局\n");
}

再分步寫出相應所需函數
1.菜單函數

void mnue()
{
    printf("-------------------------------\n");
    printf("-------------------------------\n");
    printf("----1.play       0.exit--------\n");
    printf("-------------------------------\n");
    printf("-------------------------------\n");
}

2.初始化棋盤函數

//函數的初始化
//將棋盤所有元素都初始化爲空格
//空格爲不在屏幕上顯示其字符的字符(0也是)
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] = ' ';
        }
    }
}

3.打印棋盤函數

//打印棋盤
void DisplayBoard(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++)
        {
            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");
        }
    }
}

4.用來存儲玩家下棋信息的函數

//玩家下棋
void PlayerMove(char board[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 && y >= 1 && x <= row && y <= col)
        {
            if (board[x - 1][y - 1] == ' ')
            {
                board[x - 1][y - 1] = 'X';
                break;
            }
            else
                printf("該座標被佔用,請重新輸入\n");
        }
        else
            printf("該座標不存在,請重新輸入\n");
    }
}

5.電腦隨機下棋的函數

//電腦隨機下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
    printf("電腦走\n");//三子棋中電腦只要下在空棋盤上即可
    int x = 0;
    int y = 0;
    while (1)
    {
        x = rand() % row;//將電腦走的隨機值控制在棋盤中
        y = rand() % col;
        if (x >= 1 && y >= 1 && x <= row && y <= col)
        {
            if (board[x - 1][y - 1] == ' ')
            {
                board[x - 1][y - 1] = 'O';
                break;
            }
        }
    }
}

6.判斷棋盤是否滿了的函數

//返回1,表示棋盤滿了
//返回0,表示棋盤還沒滿
int IsFull(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] == ' ')
                return 0;//沒滿
        }
    }
    return 1;//滿了
}

7.判斷輸贏和遊戲是否繼續的函數

//判斷輸贏和遊戲是否繼續
//判斷輸贏
//4種狀態
//1.玩家贏了---'X'
//2.電腦贏了---'O'
//3.平局----'C'
//4.遊戲繼續---'D'

char Iswin(char board[ROW][COL], int row, int col)
{
    int i = 0;

    //橫3行
    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][0];//Iswin直接結束
        }
    }

    //列3行
    for (i = 0; i < col; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
        {
            return board[0][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 (1 == IsFull(board, ROW, COL))
        return 'C';

    //繼續遊戲
    return 'D';
}

8.主函數控制遊戲的進程

int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));//擴大電腦走的隨機值範圍
    do
    {
        mnue();
        printf("請輸入(0/1):");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            printf("三子棋遊戲開始\n");
            game();
            break;
        case 0:
            printf("退出遊戲\n");
            break;
        defout:
            printf("輸入錯誤,請重新輸入\n");
            break;
        }
    } while (input);
    return 0;
}

四,分文件實現遊戲代碼
三子棋小遊戲(C語言數組實現)
1.game.c源文件實現與game遊戲主體有關的函數代碼
初始化棋盤函數
三子棋小遊戲(C語言數組實現)
打印棋盤函數
三子棋小遊戲(C語言數組實現)
用來存儲玩家下棋信息的函數
三子棋小遊戲(C語言數組實現)
電腦隨機下棋的函數
三子棋小遊戲(C語言數組實現)
判斷棋盤是否滿了的函數
三子棋小遊戲(C語言數組實現)
判斷輸贏和遊戲是否繼續的函數
三子棋小遊戲(C語言數組實現)
2.game.h函數的頭文件
函數的聲明
#define定義的常量
其他所需要的頭文件
三子棋小遊戲(C語言數組實現)
3.test.c函數
遊戲的菜單函數
三子棋小遊戲(C語言數組實現)
玩遊戲的框架函數
三子棋小遊戲(C語言數組實現)
主函數控制遊戲的進程
三子棋小遊戲(C語言數組實現)
注意:如果函數細節srand函數,rand函數,time函數不明白的回到猜數字遊戲的那一次博客中,有詳細解說


























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章