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

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

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

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

               

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

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ù)的聲明
 
//初始化棋盤(pán)的函數(shù)
void InitBoard(char board[ROW][COL], int row, int col);
 
//打印棋盤(pán)的函數(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ǔ)上改成十乘十的棋盤(pán)的時(shí)候,我們只需將頭文件中的函數(shù)聲明處的宏定義改為十即可 ,而不需要在每次傳參以及定義處更改,這樣便于節(jié)省很多不必要的步驟,大大提高寫(xiě)程序的效率。

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()
{
    //存儲(chǔ)數(shù)據(jù) - 二維數(shù)組
    char board[ROW][COL];
    //初始化棋盤(pán) - 初始化空格 
    InitBoard(board, ROW, COL);
 
    //打印棋盤(pán) - 本質(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("請(qǐng)選擇:>");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 2:
            printf("退出游戲!\n");
            break;
        default:
            printf("選擇錯(cuò)誤!\n");
            break;
        }
    } while (1);
    return 0;
}

建議:我們?cè)趯?xiě)代碼的時(shí)候,每個(gè)步驟前可以適當(dāng)?shù)募右恍┳⑨專(zhuān)@樣即使代碼很長(zhǎng),當(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"
 
// 初始化棋盤(pán)
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] = ' ';
        }
    }
}
 
//  打印棋盤(pán)
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("請(qǐng)輸入下棋的坐標(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)被占用,請(qǐng)重新輸入\n");
            }
        }
        else
        {
            printf("坐標(biāo)非法,請(qǐng)重新輸入\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;
        }
    }
}
 
 
// 判滿(mǎ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;  //棋盤(pán)沒(méi)滿(mǎn),還有空格
        }
    }
 
    return 1;  //棋盤(pán)滿(mǎn)了
}
 
// 判斷輸贏
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];
        }
    }
 
    //判斷對(duì)角線
    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';
}

思考提升

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

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

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

相關(guān)文章

  • 虛函數(shù)與純虛函數(shù)(C++與Java虛函數(shù)的區(qū)別)的深入分析

    虛函數(shù)與純虛函數(shù)(C++與Java虛函數(shù)的區(qū)別)的深入分析

    本篇文章是對(duì)虛函數(shù)與純虛函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • C語(yǔ)言單鏈表實(shí)現(xiàn)方法詳解

    C語(yǔ)言單鏈表實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了C語(yǔ)言單鏈表實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了基于C語(yǔ)言的單鏈表定義、創(chuàng)建、添加、刪除、排序、打印等操作技巧,并附帶了相關(guān)的優(yōu)化算法,需要的朋友可以參考下
    2018-04-04
  • C++兩種素?cái)?shù)判定方法

    C++兩種素?cái)?shù)判定方法

    這篇文章主要介紹了C++如何判斷一個(gè)數(shù)是不是素?cái)?shù),提供了兩種方法具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 淺析操作系統(tǒng)中的虛擬地址與物理地址

    淺析操作系統(tǒng)中的虛擬地址與物理地址

    本文主要介紹了操作系統(tǒng)中的虛擬地址與物理地址。在早期的計(jì)算機(jī)中,要運(yùn)行一個(gè)程序,會(huì)把這些程序全都裝入內(nèi)存,程序都是直接運(yùn)行在內(nèi)存上的,也就是說(shuō)程序中訪問(wèn)的內(nèi)存地址都是實(shí)際的物理內(nèi)存地址。那當(dāng)程序同時(shí)運(yùn)行多個(gè)程序時(shí),操作系統(tǒng)是如何為這些程序分配內(nèi)存的呢
    2021-06-06
  • C++實(shí)現(xiàn)希爾排序算法實(shí)例

    C++實(shí)現(xiàn)希爾排序算法實(shí)例

    大家好,本篇文章主要講的是C++實(shí)現(xiàn)希爾排序算法實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • MongoDB?C?驅(qū)動(dòng)程序安裝(libmongoc)?和?BSON?庫(kù)(libbson)方法

    MongoDB?C?驅(qū)動(dòng)程序安裝(libmongoc)?和?BSON?庫(kù)(libbson)方法

    這篇文章主要介紹了安裝?MongoDB?C?驅(qū)動(dòng)程序?(libmongoc)?和?BSON?庫(kù)?(libbson),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • QT編寫(xiě)tcp通信工具(Client篇)

    QT編寫(xiě)tcp通信工具(Client篇)

    這篇文章主要介紹了QT編寫(xiě)tcp通信工具,適用于Client端,類(lèi)似網(wǎng)上常見(jiàn)的網(wǎng)絡(luò)調(diào)試工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++多繼承多態(tài)的實(shí)例詳解

    C++多繼承多態(tài)的實(shí)例詳解

    這篇文章主要介紹了C++多繼承多態(tài)的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語(yǔ)言循環(huán)控制入門(mén)介紹

    C語(yǔ)言循環(huán)控制入門(mén)介紹

    大家好,本篇文章主要講的是C語(yǔ)言循環(huán)控制入門(mén)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 一文讓你徹底明白C++中的const

    一文讓你徹底明白C++中的const

    這篇文章主要給大家介紹了關(guān)于C++中const的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評(píng)論