首頁 > 軟體

使用C語言實現三子棋小遊戲

2022-08-03 14:00:19

本文範例為大家分享了C語言實現三子棋小遊戲的具體程式碼,供大家參考,具體內容如下

1、實現原理

採用二位陣列儲存棋盤資訊,棋盤上面的任何一個位置,裡頭可以放三個資訊:

1、空
2、使用者落子
3、電腦落子

下三子棋就是在二維陣列種找對應的空位置,進行落子,落完之後立即就要判斷落子位置是否有三字連珠,從而判斷誰數輸誰贏。每走一次棋會有四種情況:

*使用者1贏
*使用者2贏
*平局(棋盤被沾滿)
**沒有出結果 繼續下棋

2、實現模組

檔名                       作用
three_chress.h       三子棋的函數宣告,標頭檔案宣告等
three_chress.c       三子棋函數介面的實現
main.c                     三子棋函數測試功能

3、實現邏輯

一、我們要先在main.c這個檔案,還是一樣把框架構建好,再去分別實現他們的功能。實現選單以及遊戲的開始結束都在main函數裡面,再從裡面拿出遊戲開始函數去具體實現遊戲的進行。並把每次用到的標頭檔案包含再three_chress.h裡面。

main.c

#include"three_chress.h"
void menu()
{
    printf("######   1、開始遊戲   #######n");
    printf("######   2、退出       #######n");

}
void game()
{
    char ret = 0;
    srand((unsigned int)time(NULL));
    char a[ROW][COL] = { 0 };
    init_a(a,ROW,COL);//初始化
    show(a, ROW, COL);//視覺化
    while (1)
    {
        play_move(a, ROW, COL);//使用者走
        show(a, ROW, COL);


        ret = Is_over(a,ROW,COL);//判斷是否結束
        if (ret != 'N')//N這個字元表示繼續的意思
        {
            break;
        }


        computer_move(a, ROW, COL);//電腦走
        show(a, ROW, COL);
        ret = Is_over(a,ROW, COL);//判斷是否結束
        if (ret != 'N')//N這個字元表示繼續的意思
        {
            break;
        }
    }
    if (ret == '*')
    {
        printf("使用者贏n");
    }
    else if (ret =='#')
    {
        printf("電腦贏n");
    }
    else if (ret ='D')//D表示為平局
    {
        printf("平局n");
    }
    show(a, ROW, COL);
}
int main()
{
    int input = 0;
    do{
        menu();
        printf("請選擇->  ");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 2:
            printf("退出");
            break;
        default:
            printf("不存在,請重新輸入");
            break;
        }
    } while (input);
    return 0;

}

three_chress.h

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

#define ROW 3
#define COL 3
void init_a(char a[][COL], int row, int col);//初始化

void show(char a[][COL], int row , int col);//視覺化

void play_move(char a[][COL],int row,int col);//使用者下

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

char Is_over(char a[][COL],int row,int col);//判斷是否結束

int is_full(char a[][COL],int row, int col);

二、那麼遊戲怎麼進行?我們要先實現這樣的邏輯:構建二維陣列並初始化——>顯示棋盤資訊即視覺化——>讓使用者走並顯示棋盤資訊而且要立即判斷使用者是否贏,在判斷時候我們用字元N來取表示遊戲繼續,如果返回的不是N說明遊戲結束。——>如果沒贏讓電腦走並顯示棋盤資訊且判斷電腦是否贏。最後我們用返回字元方式去判斷誰贏或者平局。

三、把以上用到的邏輯用函數去一步一步實現,重點說幾個函數:

1、在play_move函數裡面需要注意的是 ,下棋所輸入的座標要先去判斷其合法性以及多重性也就是重複。之後再賦棋子。
2、在computer_move實現比較簡單,讓電腦自動走、隨機走 ,就要想到rand函數,而rand函數又和srand函數有,再用他們的性質讓是X,Y隨機生成0到2的值,去賦棋子即可。
3、而Is_over函數去判斷輸贏就是四種情況:使用者贏;電腦贏;平局;繼續。
直接比較四個方向上下兩個對角線上的每個位置是否相等,且不為空。再寫個判斷是否滿的函數去判斷是否是平局,最後返回繼續。這裡面返回的都是字元。

如下程式碼:

three_chree.c

#include"three_chress.h"
static int is_full(char a[][COL], int row, int col)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            if (a[i][j]== ' ')
            {
                return 0;
            }
            
        }
    }
    return 1;
}
void init_a(char a[][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            a[i][j] = ' ';
        }
        
    }
}
void show(char a[][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            printf(" %c ", a[i][j]);
            if (j < col - 1)
            {
                printf("|");
            }
        
        }
        printf("n");
        if (i < row - 1)
        {
            for (int j = 0; j < col; j++)
            {
                printf("---");
                if (j < col - 1)
                {
                    printf("|");
                }
            }
            printf("n");
        }
    }
}
void play_move(char a[][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    printf("使用者下n");
    while (1)
    {
        printf("使用者請輸入:n");
        scanf("%d %d", &x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            if (a[x - 1][y - 1] == ' ')
            {
                a[x - 1][y - 1] = '*';
                break;
            }
            else
            {
                printf("已被佔用,請重新輸入");
        
            }
        }
        else
        {
            printf("非法輸入");
    
        }
    }
}
void computer_move(char a[][COL], int row, int col)
{
    printf("電腦走n");
    int x = 0;
    int y = 0;
    x = rand() % row;
    y = rand() % col;
    while (1)
    {
        if (a[x][y] == ' ')
        {
            a[x][y] = '#';
            break;
        }
    }
}
char Is_over(char a[][COL], int row, int col)//判斷是否結束
{
    for (int i = 0; i < row; i++)
    {
        if (a[i][0] == a[i][1] && a[i][1] == a[i][2] && a[i][0] != ' ')
        {
            return a[i][0];
        }
    }
    for (int j = 0; j < col; j++)
    {
        if (a[0][j] == a[1][j] && a[1][j] == a[2][j] && a[0][j] != ' ')
        {
            return a[0][j];
        }
    }
    if (a[0][0] == a[1][1] && a[1][1] == a[2][2] && a[0][0] != ' ')
    {
        return a[0][0];
    }
    if (a[0][2] == a[1][1] && a[1][1] == a[2][0] && a[0][2] != ' ')
    {
        return a[0][2];
    }
    if ( is_full(a, ROW, COL) == 1)
    {
        return 'D';
    }
    return 'N';//表示遊戲繼續

}

4、實現結果

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com