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

C語言實現(xiàn)簡單的控制臺三子棋游戲

 更新時間:2020年11月06日 08:54:25   作者:一入猿門深似海  
這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的控制臺三子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

用C語言實現(xiàn)簡單的控制臺三子棋游戲

首先,確定一局游戲的基本流程:

1、創(chuàng)建棋盤并初始化。(將棋盤看作一個二維數(shù)組)
2、打印顯示出棋盤。
3、玩家落子(玩家通過輸入行列坐標的方式來落子)。
4、判定勝負關系。(如果玩家勝出,則退出游戲。)
5、電腦落子(隨機位置落子) 。
6、判定勝負關系(如果電腦勝出,退出游戲。否則,回到步驟 2 繼續(xù)執(zhí)行。)

第一步,此處通過構造menu()函數(shù)搭建一個簡單的交互菜單和玩家交互,用來判斷是否開始進行一局游戲。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int menu() {
 printf("====================\n");
 printf("1.開始游戲\n");
 printf("0.結束游戲\n");
 printf("====================\n");
 printf(" 請輸入您的選擇: ");
 int choice = 0;
 scanf("%d", &choice);
 return choice;
}
int main() {
 while (1) {
 int choice = menu();
 if (choice == 1) {
 //game();//此處調用了一個game函數(shù)。
 }
 else if (choice == 0) {
 printf("goodbye!\n");
 break;
 }
 }
 system("pause");
 return 0;
}

第二步,對第一步中調用的game()函數(shù)進行構造。game()函數(shù)為核心功能函數(shù),其主要任務是完成基本流程。

1.構建初始化init()函數(shù)。初始化一個3*3的二維數(shù)組,將它當做棋盤,并將數(shù)組元素全部初始化為0。

void init(char chessBoard[MAX_ROW][MAX_COL]) {
 // 把數(shù)組中的每個元素都設=初始化為“空格”。
 for (int row = 0; row < MAX_ROW; row++) {
 for (int col = 0; col < MAX_COL; col++) {
 chessBoard[row][col] = ' ';
 }
 }
}

2.構建棋盤打印printChessBoard()函數(shù)。運用for循環(huán)打印出3*3的棋盤。

void printChessBoard(char chessBoard[MAX_ROW][MAX_COL]) {
 //把棋盤打印出來。
 printf("+---+---+---+\n");
 for (int row = 0; row < MAX_ROW; row++) {
 printf("| %c | %c | %c |\n", chessBoard[row][0],
 chessBoard[row][1], chessBoard[row][2]);
 printf("+---+---+---+\n");
 }
}

3.構建玩家落子playerMove()函數(shù),玩家通過輸入行列坐標的方式來落子。此過程中需要判斷:1.玩家輸入的行列坐標是否在棋盤的合理位置。2.玩家輸入的行列坐標位置是否已經有棋子。

void playerMove(char chessBoard[MAX_ROW][MAX_COL]) {
 // 讓玩家落子. 通過控制臺輸入行列坐標的方式來實現(xiàn)。
 while (1) {
 printf(" 請玩家輸入坐標(row col): ");
 int row = 0;
 int col = 0;
 scanf("%d %d", &row, &col);
 // 校驗玩家輸入的坐標是否合法(是否在棋盤合理范圍內)。
 if (row < 0 || row >= MAX_ROW
 || col < 0 || col >= MAX_COL) {
 // 若出現(xiàn)非法情況,此時應該讓玩家重新輸入。
 printf("您的坐標不在合法范圍[0, 2]內 \n");
 continue;
 }
 // 校驗玩家落子位置是否已經有子了。 
 if (chessBoard[row][col] != ' ') {
 printf("您的坐標位置已經有子了!\n");
 continue;
 }
 // 真正落子。用“X”表示玩家落子。
 chessBoard[row][col] = 'x';
 break;
 }
}

4.構建一個computerMove()函數(shù)來控制電腦落子。通過電腦產生一系列隨機數(shù)來控制棋子落在棋盤坐標范圍內。

void computerMove(char chessBoard[MAX_ROW][MAX_COL]) {
 // 電腦落子,讓電腦隨機產生一組行列坐標。
 while (1) {
 int row = rand() % MAX_ROW;
 int col = rand() % MAX_COL;
 if (chessBoard[row][col] != ' ') {
 // 需要保證隨機數(shù)不能是已經有棋子的位置。
 continue;
 }
 chessBoard[row][col] = 'o';
 break;
 }
}

在該函數(shù)模塊中,電腦落子隨機位置的生成通過rand()函數(shù)控制,需要注意的是,我們需要通過設置隨機種子來避免“偽隨機”的出現(xiàn)。

srand((unsigned int)time(0));//以當前時間戳作為隨機種子。

5.構建isWin()函數(shù)判斷是否勝利。此處人為約定該函數(shù)的返回結果的含義: ‘x' 表示玩家獲勝?!畂' 表示電腦獲勝。 ' ' 表示勝負未分。 ‘q' 表示和棋。

char isWin(char chessBoard[MAX_ROW][MAX_COL]) {
 // 判定所有的行。
 for (int row = 0; row < MAX_ROW; row++) {
 if (chessBoard[row][0] != ' '
 && chessBoard[row][0] == chessBoard[row][1]
 && chessBoard[row][0] == chessBoard[row][2]) {
 return chessBoard[row][0];
 }
 }
 // 判定所有的列。
 for (int col = 0; col < MAX_COL; col++) {
 if (chessBoard[0][col] != ' '
 && chessBoard[0][col] == chessBoard[1][col]
 && chessBoard[0][col] == chessBoard[2][col]) {
 return chessBoard[0][col];
 }
 }
 // 判定兩個對角線。
 if (chessBoard[0][0] != ' '
 && chessBoard[0][0] == chessBoard[1][1]
 && chessBoard[0][0] == chessBoard[2][2]) {
 return chessBoard[0][0];
 }
 if (chessBoard[2][0] != ' '
 && chessBoard[2][0] == chessBoard[1][1]
 && chessBoard[2][0] == chessBoard[0][2]) {
 return chessBoard[2][0];
 }
 // 判定是否和棋??雌灞P中是否有剩余空間。
 //調用了isFull函數(shù)。
 if (isFull(chessBoard)) {
 return 'q';
 }
 return ' ';
}

6.構造isFull()函數(shù)用來判斷棋盤中是否有剩余空間供玩家落子,以便判斷是否是和棋。

int isFull(char chessBoard[MAX_ROW][MAX_COL]) {
 // 找”空格“. 如果找不到, 說明棋盤滿了。
 for (int row = 0; row < MAX_ROW; row++) {
 for (int col = 0; col < MAX_COL; col++) {
 if (chessBoard[row][col] == ' ') {
 // 如果找到“空格”說明棋盤沒滿。
 return 0;
 }
 }
 }
 return 1;
}

最后,根據(jù)組合調用上面的幾個功能函數(shù),我們可以獲得最終的game()函數(shù)的整體架構。

void game() {
 // 1. 創(chuàng)建棋盤并初始化
 char chessBoard[MAX_ROW][MAX_COL] = { 0 };
 init(chessBoard);//調用初始化函數(shù)
 char winner = ' ';
 while (1) {
 // 2. 打印棋盤
 printChessBoard(chessBoard);
 // 3. 玩家落子(玩家輸入行列坐標的方式來落子)
 playerMove(chessBoard);
 // 4. 判定勝負關系
 winner = isWin(chessBoard);
 if (winner != ' ') {
 break;
 }
 // 5. 電腦落子(隨機位置落子) 
 computerMove(chessBoard);
 // 6. 判定勝負關系
 winner = isWin(chessBoard);
 if (winner != ' ') {
 break;
 }
 }
 printChessBoard(chessBoard);
 if (winner == 'x') {
 printf("恭喜您, 您贏了!\n");
 }
 else if (winner == 'o') {
 printf("很遺憾, 您輸了!再接再厲!\n");
 }
 else {
 printf("您棋逢對手,這一局是平局!\n");
 }
}

運行截圖如下:

勝利啦!

失敗了!

此處有棋子!

更多有趣的經典小游戲實現(xiàn)專題,分享給大家:

C++經典小游戲匯總

python經典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經典游戲 玩不停

java經典小游戲匯總

javascript經典小游戲匯總

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

相關文章

  • C/C++實現(xiàn)磁盤相關操作的示例代碼

    C/C++實現(xiàn)磁盤相關操作的示例代碼

    這篇文章主要為大家詳細介紹了C/C++如何實現(xiàn)磁盤相關操作,例如遍歷磁盤容量、實現(xiàn)磁盤格式化、移除指定磁盤等,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-11-11
  • C++ Futures與Promises線程使用示例講解

    C++ Futures與Promises線程使用示例講解

    future和promise的作用是在不同線程之間傳遞數(shù)據(jù)。使用指針也可以完成數(shù)據(jù)的傳遞,但是指針非常危險,因為互斥量不能阻止指針的訪問;而且指針的方式傳遞的數(shù)據(jù)是固定的,如果更改數(shù)據(jù)類型,那么還需要更改有關的接口,比較麻煩
    2022-11-11
  • C++11/14 線程的創(chuàng)建與分離的實現(xiàn)

    C++11/14 線程的創(chuàng)建與分離的實現(xiàn)

    這篇文章主要介紹了C++11/14 線程的創(chuàng)建與分離的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-01-01
  • STL區(qū)間成員函數(shù)及區(qū)間算法總結

    STL區(qū)間成員函數(shù)及區(qū)間算法總結

    這篇文章主要匯總介紹了STL區(qū)間成員函數(shù)及區(qū)間算法,有需要的小伙伴可以參考下。
    2015-07-07
  • MFC對話框自定義消息映射的方法

    MFC對話框自定義消息映射的方法

    這篇文章主要介紹了MFC對話框自定義消息映射的方法,實例分析了MFC自定義消息映射的消息定義、響應、聲明及實現(xiàn)消息映射的相關技巧,需要的朋友可以參考下
    2015-07-07
  • C/C++實現(xiàn)精靈游戲的示例代碼

    C/C++實現(xiàn)精靈游戲的示例代碼

    這篇文章主要為大家介紹了如何利用C++實現(xiàn)簡單的精靈游戲,文中的示例代碼講解詳細,有一定的參考價值,感興趣的小伙伴可以了解一下
    2022-06-06
  • C++抽象數(shù)據(jù)類型介紹

    C++抽象數(shù)據(jù)類型介紹

    這篇文章主要介紹了C++抽象數(shù)據(jù)類型,我們在學數(shù)據(jù)結構的時候,經常遇到的一個概念就是抽象數(shù)據(jù)類型(Abstract Data Type),簡稱ADT。下面我們就對ADT作更多介紹,需要的朋友可以參考一下
    2022-01-01
  • C語言實現(xiàn)高精度加法

    C語言實現(xiàn)高精度加法

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)高精度加法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • C++讀寫Excel的實現(xiàn)方法詳解

    C++讀寫Excel的實現(xiàn)方法詳解

    本篇文章是對C++讀寫Excel的實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • opencv實現(xiàn)圖片與視頻中人臉檢測功能

    opencv實現(xiàn)圖片與視頻中人臉檢測功能

    這篇文章主要為大家詳細介紹了opencv實現(xiàn)圖片與視頻中人臉檢測功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論

临武县| 吴忠市| 伊金霍洛旗| 曲麻莱县| 报价| 芒康县| 新兴县| 谢通门县| 新津县| 米林县| 屏南县| 集贤县| 大英县| 安仁县| 茌平县| 九寨沟县| 拜城县| 囊谦县| 云阳县| 大英县| 湘阴县| 全椒县| 柏乡县| 邵东县| 南投市| 新蔡县| 贡山| 临泉县| 安岳县| 凤城市| 涡阳县| 涞源县| 左云县| 招远市| 横峰县| 梅州市| 温泉县| 大港区| 错那县| 和顺县| 沁水县|