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

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

 更新時間:2022年08月03日 16:49:19   作者:7昂7.  
這篇文章主要為大家詳細(xì)介紹了使用C語言實(shí)現(xiàn)三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

1、實(shí)現(xiàn)原理

采用二位數(shù)組保存棋盤信息,棋盤上面的任何一個位置,里頭可以放三個信息:

1、空
2、用戶落子
3、電腦落子

下三子棋就是在二維數(shù)組種找對應(yīng)的空位置,進(jìn)行落子,落完之后立即就要判斷落子位置是否有三字連珠,從而判斷誰數(shù)輸誰贏。每走一次棋會有四種情況:

*用戶1贏
*用戶2贏
*平局(棋盤被沾滿)
**沒有出結(jié)果 繼續(xù)下棋

2、實(shí)現(xiàn)模塊

文件名                       作用
three_chress.h       三子棋的函數(shù)聲明,頭文件聲明等
three_chress.c       三子棋函數(shù)接口的實(shí)現(xiàn)
main.c                     三子棋函數(shù)測試功能

3、實(shí)現(xiàn)邏輯

一、我們要先在main.c這個文件,還是一樣把框架構(gòu)建好,再去分別實(shí)現(xiàn)他們的功能。實(shí)現(xiàn)菜單以及游戲的開始結(jié)束都在main函數(shù)里面,再從里面拿出游戲開始函數(shù)去具體實(shí)現(xiàn)游戲的進(jìn)行。并把每次用到的頭文件包含再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);//判斷是否結(jié)束
?? ??? ?if (ret != 'N')//N這個字符表示繼續(xù)的意思
?? ??? ?{
?? ??? ??? ?break;
?? ??? ?}


?? ??? ?computer_move(a, ROW, COL);//電腦走
?? ??? ?show(a, ROW, COL);
?? ??? ?ret = Is_over(a,ROW, COL);//判斷是否結(jié)束
?? ??? ?if (ret != 'N')//N這個字符表示繼續(xù)的意思
?? ??? ?{
?? ??? ??? ?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);//判斷是否結(jié)束

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

二、那么游戲怎么進(jìn)行?我們要先實(shí)現(xiàn)這樣的邏輯:構(gòu)建二維數(shù)組并初始化——>顯示棋盤信息即可視化——>讓用戶走并顯示棋盤信息而且要立即判斷用戶是否贏,在判斷時候我們用字符N來取表示游戲繼續(xù),如果返回的不是N說明游戲結(jié)束。——>如果沒贏讓電腦走并顯示棋盤信息且判斷電腦是否贏。最后我們用返回字符方式去判斷誰贏或者平局。

三、把以上用到的邏輯用函數(shù)去一步一步實(shí)現(xiàn),重點(diǎn)說幾個函數(shù):

1、在play_move函數(shù)里面需要注意的是 ,下棋所輸入的坐標(biāo)要先去判斷其合法性以及多重性也就是重復(fù)。之后再賦棋子。
2、在computer_move實(shí)現(xiàn)比較簡單,讓電腦自動走、隨機(jī)走 ,就要想到rand函數(shù),而rand函數(shù)又和srand函數(shù)有,再用他們的性質(zhì)讓是X,Y隨機(jī)生成0到2的值,去賦棋子即可。
3、而Is_over函數(shù)去判斷輸贏就是四種情況:用戶贏;電腦贏;平局;繼續(xù)。
直接比較四個方向上下兩個對角線上的每個位置是否相等,且不為空。再寫個判斷是否滿的函數(shù)去判斷是否是平局,最后返回繼續(xù)。這里面返回的都是字符。

如下代碼:

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("電腦走\(yùn)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)//判斷是否結(jié)束
{
?? ?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';//表示游戲繼續(xù)

}

4、實(shí)現(xiàn)結(jié)果

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

相關(guān)文章

  • OpenCV 圖像金字塔的實(shí)現(xiàn)示例

    OpenCV 圖像金字塔的實(shí)現(xiàn)示例

    本文將結(jié)合實(shí)例代碼,介紹OpenCV 圖像金字塔,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • 詳解C++類的成員函數(shù)做友元產(chǎn)生的循環(huán)依賴問題

    詳解C++類的成員函數(shù)做友元產(chǎn)生的循環(huán)依賴問題

    這篇文章主要為大家詳細(xì)介紹了C++類的成員函數(shù)做友元產(chǎn)生的循環(huán)依賴問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++ vector的用法小結(jié)

    C++ vector的用法小結(jié)

    這篇文章主要介紹了c++中,vector是一個十分有用的容器,下面對這個容器做一下總結(jié)
    2013-12-12
  • C語言異常處理機(jī)制案例講解

    C語言異常處理機(jī)制案例講解

    這篇文章主要介紹了C語言異常處理機(jī)制案例講解,本文講解了異常處理機(jī)制所用的函數(shù)和具體的代碼實(shí)現(xiàn)等,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言字符串替換:字符,字符串,字符數(shù)組詳解

    C語言字符串替換:字符,字符串,字符數(shù)組詳解

    這篇文章主要介紹了C++字符串替換的字符,字符串,字符數(shù)組,需要考慮的情況比較全面,有不錯的借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 10個步驟Opencv輕松檢測出圖片中條形碼

    10個步驟Opencv輕松檢測出圖片中條形碼

    這篇文章主要為大家詳細(xì)介紹了Opencv輕松檢測出圖片中條形碼的10個步驟,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 區(qū)分C++中的&和&&

    區(qū)分C++中的&和&&

    這篇文章主要介紹了如何區(qū)分C++的&和&&,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-09-09
  • 在while中使用cin>>a?為條件及注意事項(xiàng)說明

    在while中使用cin>>a?為條件及注意事項(xiàng)說明

    這篇文章主要介紹了在while中使用cin>>a?為條件及注意事項(xiàng)說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • c++ class中成員與分配內(nèi)存的問題詳解

    c++ class中成員與分配內(nèi)存的問題詳解

    很多人都知道C++類是由結(jié)構(gòu)體發(fā)展得來的,所以他們的成員變量(C語言的結(jié)構(gòu)體只有成員變量)的內(nèi)存分配機(jī)制是一樣的,下面這篇文章主要給大家介紹了關(guān)于c++ class中成員與分配內(nèi)存問題的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • 你真的知道C++對象大小嗎?

    你真的知道C++對象大小嗎?

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

最新評論

湖北省| 文化| 海林市| 和林格尔县| 海伦市| 兴文县| 乃东县| 湘乡市| 甘南县| 金门县| 徐水县| 彰武县| 安龙县| 白玉县| 西安市| 当雄县| 灵石县| 泽普县| 寻乌县| 阿拉善盟| 舒城县| 石棉县| 明水县| 佛冈县| 沁水县| 深水埗区| 夏河县| 乌兰察布市| 额济纳旗| 武汉市| 丘北县| 黎平县| 吉林市| 阳信县| 南和县| 磴口县| 沾益县| 古交市| 淄博市| 延边| 甘孜县|