欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言版三子棋游戲?qū)崿F(xiàn)代碼

 更新時間:2021年08月18日 10:35:32   作者:zhengjiatao2002  
這篇文章主要為大家詳細介紹了C語言版三子棋游戲的實現(xiàn)代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了C語言版三子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下

實現(xiàn)一個三子棋小游戲

下面是實現(xiàn)步驟:

總共有需要三個文件

第一,test.c

我們要在這個文件里面實現(xiàn)游戲的主體流程

第二,game.c

在這個文件里我們可以實現(xiàn)各個游戲函數(shù)的分裝

第三,game.h

在這個文件里我們實現(xiàn)的是各個函數(shù)的聲明

test.c

1、首先要有一個菜單

讓玩家可以做出選擇

2、接著對玩家做出的不同選擇進行實現(xiàn)

選1就是開始游戲,所以我們進入到game函數(shù)里就好了

選0就是退出游戲,

其他選擇的話就是選擇錯誤,重新選擇

這個我們可以用switch語句來實現(xiàn)

這里我們要先用的是do,while循環(huán),條件里放入我們要輸入的數(shù)

這樣的話如果輸入的數(shù)為0,即為假,正好會跳出循環(huán),后面接上return 0的話程序就結(jié)束了

所以我們先把以上所描述的功能寫出來

#include<stdio.h>
#include"game.h"
void menu()
{
    printf("***********\n");
    printf("***1play***\n");
    printf("***0exit***\n");
    printf("***********\n");
    
}
​
int main()
{
    menu();
    int input = 0;
    do
    {
        printf("請選擇\n");
        scanf("%d", &input);
        switch(input)
        {
            case 1:
                game();
                break;
            case 0:
                printf("退出游戲\n");
                break;
            default:
                printf("選擇錯誤,請重新選擇\n");
        }
    }while(input);
    
    return 0;
}

3、實現(xiàn)游戲函數(shù)的各個功能

我們要做的是三子棋,應(yīng)該先有一個棋盤

所以我們就可以用二維數(shù)組來創(chuàng)建這樣一個 3 * 3的棋盤

鑒于以后可能會想要不同行和列的棋盤

所以我們可以定義宏來表示數(shù)組的行和列,以后想要修改行數(shù)和列數(shù)也很方便

創(chuàng)建棋盤之后,我們要將棋盤里的元素進行初始化

接著還要打印出來呈現(xiàn)給玩家

然后就是下棋的過程,因為我們得不斷下到一方贏或者棋盤滿

所以我們可以用while循環(huán)來實現(xiàn)

接著就是

玩家下棋,展示棋盤,判斷輸贏

電腦下棋,展示棋盤,判斷輸贏

......

我們可以把以上功能表達出來

void game()
{
    char board[ROW][COL];//宏的定義放在game.h里面
    char ret = 0;//我們用ret這個變量去接收判斷輸贏的函數(shù)所返回的值
    
    IntBoard(board, ROW, COL);//這些具體的函數(shù)都會分裝到game.c上面
    DisplayBoard(board, ROW, COL);
    //創(chuàng)建和展示棋盤之后,就是不斷  下棋,展示,判斷的過程了
    
    while(1)
    {
        PlayerMove(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        ret = IsWin(board, ROW, COL);
        if(ret != 'C')//也就是指要么一方贏,要么棋盤滿,就應(yīng)該跳出循環(huán),不再繼續(xù)下棋了
            break;
        //這兩步的區(qū)別就只是第一行而已
        ComputerMove(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        ret = IsWin(board, ROW, COL);
        if(ret != 'C')
            break;
    }
    
    if(ret == '*')
        printf("玩家贏\n");
    else if(ret == '#')
        printf("電腦贏\n");
    else
        printf("平局\n");
}

game函數(shù)放在menu函數(shù)后面就好了

game.c

所以我們所需要分裝到game.c里的函數(shù)有:

初始化棋盤,打印棋盤,玩家下棋,電腦下棋,判斷輸贏

那么接下來我們就在game.c里實現(xiàn)上述函數(shù)的功能

初識化棋盤

我們利用for循環(huán)把里面的元素都初始化為空格

#include"game.h"
void IntBoard(char board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for(i = 0; i < row; i++)
    {
        for(j = 0; j < col; j++)
        {
            board[i][j] = ' ';
        }
    }
}

打印棋盤

這里要特別注意分割行的問題

void DisplayBoard(char board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for(i = 0; i < row; i++)
    {
        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");//棋盤全都打印好之后打印分割行
    }
}

玩家下棋

這里的實現(xiàn)思路是:

1、判斷輸入的位置有無越界

2、有則提示,沒有則判斷有無棋子

3、有則提示,沒有則將該位置放入元素*

(因為玩家可能要連續(xù)輸入幾次,所以我們要用到while循環(huán))

void PlayerMove(char board[ROW][COL], int row, int col)
{
    int x;
    int y;
    //玩家要輸入的行和列
    
while (1)
{
    printf("請輸入坐標\n");
    scanf("%d %d", &x, &y);
    if (x >= 1 && x <= row && y >= 1 && y <= col)//判斷有無越界
    {
        if (board[x-1][y-1] == ' ')//判斷有無棋子
        {
            board[x-1][y-1] = '*';
            break;//輸入成功之后跳出循環(huán)
        }
        else
            printf("坐標被占用,請重新輸入\n");
    }
    else
        printf("坐標非法,請重新輸入\n");
​
}

電腦下棋

這里的實現(xiàn)思路是:

1、生成隨機數(shù)(這個數(shù)值不能越界)

2、將該位置放入元素#,這里不需要判斷,因為本身就不需要輸入

void ComputerMove(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
    srand((unsigned int)time(NULL));
    printf("電腦走\n");
    while(1)
    {
        x = rand() % row;//生成隨機數(shù),這里就需要用到時間戳了,我們還要做test.c里面包含一個<time.h>
        y = rand() % col;
        if(board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}

判斷輸贏

這里還要分為棋盤是否滿子和一方贏

是否滿子

實現(xiàn)思路:

這個比較簡單,我們只要依次查看棋盤,若有一個元素為空格,即為滿

然后注意一下返回值就好了

int IsFull(char board[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(board[i][j] == ' ')
                return 0;
        }
    }
    return 1;
}

哪一方贏

實現(xiàn)思路:

根據(jù)規(guī)則,我們要判斷是否有三個相同的棋子連成直線

所以,每一行,每一列判斷一次,然后對角線再判斷兩次就好了

使用for循環(huán)和if語句來實現(xiàn)

char IsWin(char board[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for(i = 0; i < row; i++)//先判斷行
    {
        if(board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
            return board[i][0];
    }
    for(j = 0; j < col; j++)//再判斷列
    {
        if(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board != ' ')
            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];
    //然后我們再這里直接調(diào)用IsFull函數(shù),就不用在game函數(shù)里調(diào)用了,而且返回值都能統(tǒng)一管理
    if(IsFull(board, row, col))
    {
        return 'Q';
    }
    return 'C';
}

到這里我們的game.c文件的任務(wù)就完成了

game.h

然后我們還需要一個game.h文件來對函數(shù)進行聲明

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
​
#define ROW 3
#define COL 3
​
​
void IntBoard(char board[ROW][COL], int row, int col);
​
void DisplayBoard(char board[ROW][COL], int row, int col);
​
void PlayerMove(char board[ROW][COL], int row, int col);
​
void ComputerMove(char board[ROW][COL], int row, int col);
​
char IsWin(char board[ROW][COL], int row, int col);
​
int IsFull(char board[ROW][COL], int row, int col);

​好了,到了這里我們的三子棋小游戲就完成了!快去試試吧!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言編程gcc如何生成靜態(tài)庫.a和動態(tài)庫.so示例詳解

    C語言編程gcc如何生成靜態(tài)庫.a和動態(tài)庫.so示例詳解

    本文主要敘述了gcc如何生成靜態(tài)庫(.a)和動態(tài)庫(.so),幫助我們更好的進行嵌入式編程。因為有些時候,涉及安全,所以可能會提供靜態(tài)庫或動態(tài)庫供我們使用
    2021-10-10
  • C語言字符串常用處理函數(shù)小結(jié)

    C語言字符串常用處理函數(shù)小結(jié)

    C語言中有很多內(nèi)置的字符串處理函數(shù),這些函數(shù)都在<string.h>頭文件中聲明,本文給大家介紹C語言字符串常用處理函數(shù)小結(jié),感興趣的朋友一起看看吧
    2023-11-11
  • 淺談Qt實現(xiàn)HTTP的Get/Post請求

    淺談Qt實現(xiàn)HTTP的Get/Post請求

    本文主要介紹了淺談Qt實現(xiàn)HTTP的Get/Post請求,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2022-05-05
  • Cocos2d-x中背景音樂和音效使用實例

    Cocos2d-x中背景音樂和音效使用實例

    這篇文章主要介紹了Cocos2d-x中背景音樂和音效使用實例,注意本文中使用大量注釋來說明背景音樂和音效的使用方法,需要的朋友可以參考下
    2014-09-09
  • C語言實現(xiàn)航班管理系統(tǒng)

    C語言實現(xiàn)航班管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)航班管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++中g(shù)SOAP的使用詳解

    C++中g(shù)SOAP的使用詳解

    這篇文章主要介紹了C++中g(shù)SOAP的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-11-11
  • C++中雙冒號::的作用淺析

    C++中雙冒號::的作用淺析

    在C++中經(jīng)常使用雙冒號::,很多朋友不知道是什么意思,這篇文章主要介紹了C++中雙冒號::的作用,需要的朋友可以參考下
    2018-06-06
  • 舉例分析private的作用(c/c++學(xué)習)

    舉例分析private的作用(c/c++學(xué)習)

    我知道我們可以用 public 中的值,把private中的數(shù)據(jù)給提出來,但是還是搞不懂private該怎么用,或者說在一個具體程序中,private有什么用
    2020-08-08
  • 使用C++實現(xiàn)給PDF文檔添加文字水印

    使用C++實現(xiàn)給PDF文檔添加文字水印

    這篇文章主要為大家詳細介紹了如何通過第三方國產(chǎn)庫Spire.PDF?for?C++來實現(xiàn)給PDF文檔添加文字水印,感興趣的小伙伴可以跟隨小編一起學(xué)習一下
    2023-11-11
  • JS調(diào)用C++函數(shù)拋出異常及捕捉異常詳解

    JS調(diào)用C++函數(shù)拋出異常及捕捉異常詳解

    這篇文章主要介紹了js調(diào)用C++函數(shù)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-08-08

最新評論