最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于C語言實(shí)現(xiàn)三子棋小游戲

 更新時(shí)間:2021年11月12日 17:20:04   作者:xaiobit_hl  
這篇文章主要為大家詳細(xì)介紹了基于C語言實(shí)現(xiàn)三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

在寫三子棋之前,我們要先了解三子棋的一個(gè)大概的圖形,以便于我們整理思路。

               

首先我們要分模塊寫代碼,不要全部寫在主函數(shù)里面,模塊化的代碼便于理解,而且給人一種賞心悅目的感覺,如:

game.h

game.c

test.c

game.h---頭文件的包含,定義宏變量以及函數(shù)聲明

#pragma once
 
//頭文件的包含
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
 
//函數(shù)的聲明
#define ROW 3
#define COL 3
 
//函數(shù)的聲明
 
//初始化棋盤的函數(shù)
void InitBoard(char board[ROW][COL], int row, int col);
 
//打印棋盤的函數(shù)
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);

這樣的好處是:例如后期想在這個(gè)代碼的基礎(chǔ)上改成十乘十的棋盤的時(shí)候,我們只需將頭文件中的函數(shù)聲明處的宏定義改為十即可 ,而不需要在每次傳參以及定義處更改,這樣便于節(jié)省很多不必要的步驟,大大提高寫程序的效率。

test.c---游戲思路

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu() {
    printf("***********************\n");
    printf("******* 1.play ********\n");
    printf("******* 2.exit ********\n");
    printf("***********************\n");
}
 
void game()
{
    //存儲數(shù)據(jù) - 二維數(shù)組
    char board[ROW][COL];
    //初始化棋盤 - 初始化空格 
    InitBoard(board, ROW, COL);
 
    //打印棋盤 - 本質(zhì)是打印數(shù)組的內(nèi)容
    DisplayBoard(board, ROW, COL);
    char ret = 0;//接收游戲狀態(tài) 
    while (1)
    {
        //玩家下棋
        PlayerMove(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        //判斷玩家是否贏的游戲
        ret = IsWin(board, ROW, COL);
        if (ret != 'c')
            break;
        //電腦下棋
        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");
    }
    DisplayBoard(board, ROW, COL);
}
int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));
    do {
        menu();
        printf("請選擇:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 2:
            printf("退出游戲!\n");
            break;
        default:
            printf("選擇錯(cuò)誤!\n");
            break;
        }
    } while (1);
    return 0;
}

建議:我們在寫代碼的時(shí)候,每個(gè)步驟前可以適當(dāng)?shù)募右恍┳⑨?,這樣即使代碼很長,當(dāng)我們運(yùn)行有錯(cuò)誤的時(shí)候,或者后期回顧的時(shí)候,可以很容易的找出錯(cuò)誤點(diǎn),而且能夠很清晰的看出哪一塊代碼是在實(shí)現(xiàn)什么功能,不僅方便自己復(fù)習(xí),當(dāng)朋友借鑒的時(shí)候也可以讓朋友通俗易懂,能夠快速產(chǎn)生共鳴。

game.c---游戲的實(shí)現(xiàn)

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
 
// 初始化棋盤
void InitBoard(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");
    }
}
 
//  玩家走
void PlayerMove(char board[ROW][COL], int row, int col)
{
    int x = 0;
    int y = 0;
 
    printf("玩家走:>\n");
    while (1)
    {
        printf("請輸入下棋的坐標(biāo):>\n");
        scanf("%d %d", &x, &y);
        //判斷坐標(biāo)的合法
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            //下棋
            //坐標(biāo)是否被占用
            if (board[x - 1][y - 1] == ' ')
            {
                board[x - 1][y - 1] = '*';
                break;
            }
            else
            {
                printf("坐標(biāo)被占用,請重新輸入\n");
            }
        }
        else
        {
            printf("坐標(biāo)非法,請重新輸入\n");
        }
    }
}
 
//  電腦走
void ComputerMove(char board[ROW][COL], int row, int col)
{
    printf("電腦走:>\n");
 
    while (1)
    {
        int x = rand() % row;//0-2
        int y = rand() % col;//0-2
        //判斷坐標(biāo)被占用
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}
 
 
// 判滿
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;  //棋盤滿了
}
 
// 判斷輸贏
char IsWin(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];
    }
 
    //判斷平局
    int ret = IsFull(board, row, col);
    if (ret == 1)
    {
        return 'Q';
    }
    //繼續(xù)
    else
        return 'c';
}

思考提升

從代碼中可以看出初始化棋盤沒有寫死,而判斷輸贏的時(shí)候,代碼寫死了,這里留給大家思考。

例子:提供三行改成多行的代碼

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

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode(93.復(fù)原IP地址)

    C++實(shí)現(xiàn)LeetCode(93.復(fù)原IP地址)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(93.復(fù)原IP地址),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言代碼實(shí)現(xiàn)猜數(shù)字

    C語言代碼實(shí)現(xiàn)猜數(shù)字

    這篇文章主要為大家詳細(xì)介紹了C語言代碼實(shí)現(xiàn)猜數(shù)字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++處理鍵盤輸入的方法

    C++處理鍵盤輸入的方法

    這篇文章主要介紹了C++處理鍵盤輸入的方法,是C++程序設(shè)計(jì)中非常實(shí)用的技巧,需要的朋友可以參考下
    2014-10-10
  • 幫VS2019 找回丟失的 SDK問題

    幫VS2019 找回丟失的 SDK問題

    最近很多朋友向小編求助在機(jī)器上的 vs2019 編譯 C++ 工程報(bào)錯(cuò)問題,今天小編給大家分享幫VS2019 找回丟失的 SDK問題,感興趣的朋友一起看看吧
    2020-05-05
  • C語言控制臺實(shí)現(xiàn)打飛機(jī)小游戲

    C語言控制臺實(shí)現(xiàn)打飛機(jī)小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言控制臺實(shí)現(xiàn)打飛機(jī)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++中函數(shù)模板與類模板的簡單使用及區(qū)別介紹

    C++中函數(shù)模板與類模板的簡單使用及區(qū)別介紹

    這篇文章介紹了C++中的模板機(jī)制,包括函數(shù)模板和類模板的概念、語法和實(shí)際應(yīng)用,函數(shù)模板通過類型參數(shù)實(shí)現(xiàn)泛型操作,而類模板允許創(chuàng)建可處理多種數(shù)據(jù)類型的類,文章還討論了模板的關(guān)鍵區(qū)別、注意事項(xiàng)以及它們在實(shí)際編程中的應(yīng)用,感興趣的朋友一起看看吧
    2025-03-03
  • Opencv EigenFace人臉識別算法詳解

    Opencv EigenFace人臉識別算法詳解

    這篇文章主要為大家詳細(xì)介紹了Opencv EigenFace人臉識別算法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C++實(shí)現(xiàn)冒泡排序(BubbleSort)

    C++實(shí)現(xiàn)冒泡排序(BubbleSort)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)冒泡排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Qt之QTimer使用及技巧小結(jié)

    Qt之QTimer使用及技巧小結(jié)

    QTimer是Qt中的定時(shí)器類,用于執(zhí)行定時(shí)操作,如在一段時(shí)間間隔后觸發(fā)某個(gè)槽函數(shù)或執(zhí)行特定的代碼,下面就來介紹一下Qt之QTimer使用及技巧小結(jié),感興趣的可以了解一下
    2023-10-10
  • C++檢查某個(gè)文件或目錄是否存在的函數(shù)

    C++檢查某個(gè)文件或目錄是否存在的函數(shù)

    這篇文章主要介紹了C++檢查某個(gè)文件或目錄是否存在的函數(shù),是Windows應(yīng)用程序設(shè)計(jì)中非常常見的實(shí)用技巧,需要的朋友可以參考下
    2014-10-10

最新評論

忻城县| 华容县| 金山区| 安陆市| 新宾| 农安县| 通江县| 独山县| 奎屯市| 沙河市| 江西省| 上饶县| 花莲县| 漳平市| 衡水市| 尼木县| 神木县| 富源县| 博兴县| 铜陵市| 旬阳县| 敦煌市| 凌源市| 白沙| 彭水| 富宁县| 邯郸市| 宝鸡市| 汶川县| 滁州市| 磐安县| 镇康县| 安新县| 博爱县| 馆陶县| 太谷县| 新乐市| 满城县| 和林格尔县| 东阿县| 武隆县|