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

C語言版三子棋小游戲

 更新時(shí)間:2021年07月22日 16:32:51   作者:捕獲一只小肚皮  
這篇文章主要為大家詳細(xì)介紹了C語言版三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

①游戲效果

  • 有一個(gè)3*3的棋盤
  • 每次下棋后(電腦和玩家),棋盤會(huì)更新數(shù)據(jù)
  • 會(huì)有菜單提示相關(guān)命令進(jìn)行相關(guān)操作
  • 下棋方法是輸入坐標(biāo)
  • 每一局游戲結(jié)束后,會(huì)詢問是否繼續(xù).

②主函數(shù)邏輯搭建

任何一個(gè)項(xiàng)目的實(shí)現(xiàn),最重要的就是邏輯結(jié)構(gòu)搭建,而各個(gè)功能的實(shí)現(xiàn)就是采取函數(shù)(模塊化)進(jìn)行細(xì)分.

所以我們需要搭建邏輯,那么邏輯結(jié)構(gòu)是啥呢?

  • 首先會(huì)跳出提示菜單,內(nèi)容為 0退出游戲,1開始/繼續(xù)游戲,其他鍵提示錯(cuò)誤,并重新輸入
  • 按0后提示 “成功退出游戲”
  • 按1開始游戲
#include <stdio.h>
int main()
{
 int input = 0;
 do
 {
        remind(); // 提示菜單
        scanf("%d",&input); //開始輸入命令
  switch (input)
  {
  case 0:
   printf("成功退出游戲\n");
   break;
  case 1:
   playgame(); // 開始游戲
            printf("是否繼續(xù)游戲\n");
   break;
  default :
   printf("命令錯(cuò)誤,請(qǐng)重新選擇\n");
   break;
  }
 } while (input);
 return 0;
}

③游戲模塊(playgame)邏輯搭建

前面的邏輯結(jié)構(gòu)已經(jīng)搭建,而我們需要實(shí)現(xiàn)的就是 playgame()模塊.

那么他的功能邏輯是啥呢??

  • 棋盤內(nèi)容用二維數(shù)組存儲(chǔ)
  • 初始化棋盤(即棋盤上還沒有下子).所以初始化是一個(gè)單獨(dú)模塊
  • 對(duì)弈分為兩個(gè)模塊(電腦下子與玩家下子)
  • 每一局對(duì)弈后,都要判斷電腦或玩家是否贏.(所以又是一個(gè)單獨(dú)的判斷輸贏模塊)
#define row 3
#define col 3

void playgame()
{
 char board[row][col]; // 存儲(chǔ)下子內(nèi)容
 int result = 0; //用來接收Iswin函數(shù)判斷的返回值

 Initboard(board, row, col); //初始化棋盤,即最開始棋盤都沒有下子

 Displayboard(board, row, col); //顯示棋盤,即顯示棋盤目前的狀態(tài)

 while (1) //開始進(jìn)行對(duì)弈,直到一方贏或者平局結(jié)束循環(huán)
 {
  player(board, row, col);  //玩家下子函數(shù)

  if ((result = Iswin(board, row, col)) == 1) break; // Iswin函數(shù)的設(shè)定是如果玩家勝利,返回1

  computer(board, row, col);  //電腦下子函數(shù)

  if ((result = Iswin(board, row, col)) == -1) break; // Iswin函數(shù)的設(shè)定是 如果電腦勝利,返回-1

  if (!result) break; //返回0平局,如果既沒有輸贏也不是平局,則繼續(xù)對(duì)弈
 }

 if (result == 1) printf("恭喜您取得勝利!!!!!!!!!\n");
 else if (result == -1) printf("你也太辣雞了吧,電腦都下不贏\n");
 else printf("哎~~,你的技術(shù)不行啊,居然和電腦達(dá)成平手\n");
}

解釋:

可以清晰的明白playgame()函數(shù)的邏輯結(jié)構(gòu).

其中有一步驟是這樣的if (Iswin(board, row, col) >= 0),它的執(zhí)行是先調(diào)用函數(shù)(滿足我們需要判斷誰贏的要求),再利用返回結(jié)果判斷是否結(jié)束循環(huán),一條程序就達(dá)到兩個(gè)效果,比較妙.

④分支模塊具體實(shí)現(xiàn)

0.remind函數(shù)實(shí)現(xiàn)

就是起到一個(gè)提示作用,直接打印就行.

void remind()
{
 printf("+------------------------------------------+\n"
        "+--------------  0 結(jié)束游戲  --------------+\n"
        "+-----------  1 開始/繼續(xù)游戲  ------------+\n"
        "+------------------------------------------+\n");

}

1.Initboard函數(shù)實(shí)現(xiàn)

既然是初始化函數(shù),說明我們的要求就是把二維數(shù)組board初始化為全空格.

void Initboard(char(*board)[3],int Row,int Col )
{
 int i = 0, j = 0;
 for (i = 0; i < Row; i++)
 {
  for (j = 0; j < Col; j++)
  {
   board[i][j] = ' '; // 賦予空格
  }
 }
}

2.Displayboard函數(shù)實(shí)現(xiàn)

顯示棋盤內(nèi)容顯示的不止是二維數(shù)組board的內(nèi)容,還要加上邊界(如圖),所以Displayboard的要求是什么?

既要顯示邊界,也要顯示board的存儲(chǔ)內(nèi)容.

而顯示邊界我們可以分成小塊循環(huán)顯示,比如看成3個(gè)條形加上最后下邊界

每一個(gè)條形又可以看成三個(gè)小方塊加上小右邊界

void Displayboard(char(*board)[3], int Row, int Col)
{
 int i = 0, j = 0;
 for (i = 0; i < Row; i++)
 {
  printf("+---+---+---+\n");   //打印小條形的上邊界
  for (j = 0; j < Col; j++)
  {
   printf("| %c ",board[i][j]); //打印小條形中的方塊內(nèi)容
  }
  printf("|\n"); //補(bǔ)上 小右邊界
 }
 printf("+---+---+---+\n"); //補(bǔ)上 下邊界
}

3.player函數(shù)實(shí)現(xiàn)

玩家下棋采用的是坐標(biāo)輸入方式

玩家輸入一個(gè)坐標(biāo),那么棋盤上的相應(yīng)位置就應(yīng)該更新.(相應(yīng)位置用 * 表示)

輸入坐標(biāo)時(shí)候還要檢驗(yàn)該位置是否已經(jīng)落子了.

void player(char(*board)[3], int Row, int Col)
{
 printf("請(qǐng)分別輸入橫縱坐標(biāo)(輸入數(shù)據(jù)請(qǐng)用空格隔開):\n");
 scanf("%d%d", &Row, &Col);
 while (1)
 {
  if (((1 <= Row) && (Row <= 3))  //邊界必須合格,且該地方無子
   && ((1 <= Col) && (Col <= 3))
   && (board[Row-1][Col-1] == ' '))
  {
   board[Row - 1][Col - 1] = '*'; //之所以Row - 1  Col - 1是考慮到玩家不一定是程序員,他不知道編程從0開始數(shù)
   break;
  }
  else
  {
   printf("請(qǐng)仔細(xì)堅(jiān)持你的坐標(biāo)位置,是否已經(jīng)落子或坐標(biāo)超界,然后重新輸入坐標(biāo).\n");
   printf("請(qǐng)輸入坐標(biāo):\n");
   scanf("%d%d", &Row, &Col);
  }
 }
 printf("下子成功!\n");
 Displayboard(board, row, col); // 無論是玩家還是電腦下子,都需要顯示出下子內(nèi)容
}

4.Iswin函數(shù)實(shí)現(xiàn)

玩家或者電腦下子后,需要判斷雙方有一方是否贏.

Iswin的作用就是判斷是否有一方贏.

其中返回值1代表玩家勝利,返回值0代表平局,返回值-1代表電腦贏

判斷勝利方法就是檢查每行每列以及斜線是否有一樣的,以及是否不輸不贏

int Iswin(char(*board)[3], int Row, int Col)
{
 //怎么判斷一方贏?? 橫,豎,斜線只要都一樣,則可以知道一方贏(全是空格除外)
 for (int i = 0; i < Row; i++) //每一行
 {
  if ((board[i][0] == board[i][1])
   && (board[i][1] == board[i][2])
   && (board[i][0] != ' '))
  {
   if (board[i][0] == '*') return 1;  //如果一行都是*,說明玩家勝利,否則電腦勝利
   return -1;
  }
 }

 for (int j = 0; j < Col; j++) //每一列
 {
  if ((board[0][j] == board[1][j])
   && (board[1][j] == board[2][j])
   && (board[0][j] != ' '))
  {
   if (board[0][j] == '*') return 1; //如果一列都是*,說明玩家勝利,否則電腦勝利
   return -1;
  }
 }

 if (((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != ' ')) //斜線
  ||((board[0][2] == board[1][1]) && (board[1][1] ==board[2][0]) && (board[1][1] != ' ')))
 {
  if (board[1][1] == '*') return 1;
  return -1;
 }

 for (int i = 0; i < Row; i++)
 {
  for (int j = 0; j < Col; j++)
  {
   if (board[i][j] == ' ')
    return -2; //如果前三者情況都沒有,只要目前棋盤上還剩下空余位置
                  //就說明不輸不贏,需要繼續(xù)對(duì)弈.返回[-1,1]之外的值就行
  }
 }

 return 0; //除去上面4種情況就是平局
}

5.computer函數(shù)實(shí)現(xiàn)

由于是電腦下載,我們無法操作,于是只有讓電腦隨機(jī)下載了.缺陷是電腦就有點(diǎn)智障了,哈哈.

#include <stdlib.h>
#include <time.h>
void computer(char(*board)[3], int Row, int Col)
{
 srand(time(NULL));
 while (1)
 {
  int i = rand() % 3;
  int j = rand() % 3;
  if (board[i][j] == ' ')
  {
   board[i][j] = '#';//#代表電腦下子
   break;
  }
 }
 printf("電腦已下子:\n");
 Displayboard(board, row, col); //電腦下子后,顯示棋盤
}

⑤完整代碼

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define row 3
#define col 3

void remind()
{
 printf("+------------------------------------------+\n"
        "+--------------  0 結(jié)束游戲  --------------+\n"
        "+-----------  1 開始/繼續(xù)游戲  ------------+\n"
        "+------------------------------------------+\n");

}

void Initboard(char(*board)[3],int Row,int Col )
{
 int i = 0, j = 0;
 for (i = 0; i < Row; i++)
 {
  for (j = 0; j < Col; j++)
  {
   board[i][j] = ' '; // 賦予空格
  }
 }
}

 

void Displayboard(char(*board)[3], int Row, int Col)
{
 int i = 0, j = 0;
 for (i = 0; i < Row; i++)
 {
  printf("+---+---+---+\n");
  for (j = 0; j < Col; j++)
  {
   printf("| %c ",board[i][j]);
  }
  printf("|\n");
 }
 printf("+---+---+---+\n");
}

void player(char(*board)[3], int Row, int Col)
{
 printf("請(qǐng)分別輸入橫縱坐標(biāo)(輸入數(shù)據(jù)請(qǐng)用空格隔開):\n");
 scanf("%d%d", &Row, &Col);
 while (1)
 {
  if (((1 <= Row) && (Row <= 3))  //邊界必須合格,且該地方無子
   && ((1 <= Col) && (Col <= 3))
   && (board[Row-1][Col-1] == ' '))
  {
   board[Row - 1][Col - 1] = '*'; //之所以Row - 1  Col - 1是考慮到玩家不一定是程序員,他不知道編程從0開始數(shù)
   break;
  }
  else
  {
   printf("請(qǐng)仔細(xì)堅(jiān)持你的坐標(biāo)位置,是否已經(jīng)落子或坐標(biāo)超界,然后重新輸入坐標(biāo).\n");
   printf("請(qǐng)輸入坐標(biāo):\n");
   scanf("%d%d", &Row, &Col);
  }
 }
 printf("下子成功!\n");
 Displayboard(board, row, col); // 無論是玩家還是電腦下子,都需要顯示出下子內(nèi)容
}


void computer(char(*board)[3], int Row, int Col)
{
 srand(time(NULL));
 while (1)
 {
  int i = rand() % 3;
  int j = rand() % 3;
  if (board[i][j] == ' ')
  {
   board[i][j] = '#';//#代表電腦下子
   break;
  }
 }
 printf("電腦已下子:\n");
 Displayboard(board, row, col); //電腦下子后,顯示棋盤
}

int Iswin(char(*board)[3], int Row, int Col)
{
 //怎么判斷一方贏?? 橫,豎,斜線只要都一樣,則可以知道一方贏(全是空格除外)
 for (int i = 0; i < Row; i++) //每一行
 {
  if ((board[i][0] == board[i][1])
   && (board[i][1] == board[i][2])
   && (board[i][0] != ' '))
  {
   if (board[i][0] == '*') return 1;  //如果一行都是*,說明玩家勝利,否則電腦勝利
   return -1;
  }
 }

 for (int j = 0; j < Col; j++) //每一列
 {
  if ((board[0][j] == board[1][j])
   && (board[1][j] == board[2][j])
   && (board[0][j] != ' '))
  {
   if (board[0][j] == '*') return 1; //如果一列都是*,說明玩家勝利,否則電腦勝利
   return -1;
  }
 }

 if (((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != ' ')) //斜線
  ||((board[0][2] == board[1][1]) && (board[1][1] ==board[2][0]) && (board[1][1] != ' ')))
 {
  if (board[1][1] == '*') return 1;
  return -1;
 }

 for (int i = 0; i < Row; i++)
 {
  for (int j = 0; j < Col; j++)
  {
   if (board[i][j] == ' ')
    return -2; //如果前三者情況都沒有,只要目前棋盤上還剩下空余位置
                  //就說明不輸不贏,需要繼續(xù)對(duì)弈.返回[-1,1]之外的值就行
  }
 }

 return 0; //除去上面4種情況就是平局
}


void playgame()
{
 char board[row][col]; // 存儲(chǔ)下子內(nèi)容
 int result = 0; //用來接收Iswin函數(shù)判斷的返回值

 Initboard(board, row, col); //初始化棋盤,即最開始棋盤都沒有下子

 Displayboard(board, row, col); //顯示棋盤,即顯示棋盤目前的狀態(tài)

 while (1) //開始進(jìn)行對(duì)弈,直到一方贏或者平局結(jié)束循環(huán)
 {
  player(board, row, col);  //玩家下子函數(shù)

  if ((result = Iswin(board, row, col)) == 1) break; // Iswin函數(shù)的設(shè)定是如果玩家勝利,返回1

  computer(board, row, col);  //電腦下子函數(shù)

  if ((result = Iswin(board, row, col)) == -1) break; // Iswin函數(shù)的設(shè)定是 如果電腦勝利,返回-1

  if (!result) break; //返回0平局,如果既沒有輸贏也不是平局,則繼續(xù)對(duì)弈
 }

 if (result == 1) printf("恭喜您取得勝利!!!!!!!!!\n");
 else if (result == -1) printf("你也太辣雞了吧,電腦都下不贏\n");
 else printf("哎~~,你的技術(shù)不行啊,居然和電腦達(dá)成平手\n");
}


#include <stdio.h>
int main()
{
 int input = 0;
 do
 {
  remind(); // 提示菜單
  scanf("%d", &input); //開始輸入命令
  switch (input)
  {
  case 0:
   printf("成功退出游戲\n");
   break;
  case 1:
   playgame(); // 開始游戲
   printf("是否繼續(xù)游戲\n");
   break;
  default:
   printf("命令錯(cuò)誤,請(qǐng)重新選擇\n");
   break;
  }
 } while (input);
 return 0;
}

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

相關(guān)文章

  • C語言如何輸出中文

    C語言如何輸出中文

    這篇文章主要介紹了C語言如何輸出中文問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • C語言數(shù)據(jù)結(jié)構(gòu)與算法時(shí)間空間復(fù)雜度基礎(chǔ)實(shí)踐

    C語言數(shù)據(jù)結(jié)構(gòu)與算法時(shí)間空間復(fù)雜度基礎(chǔ)實(shí)踐

    這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)與算法中時(shí)間空間復(fù)雜度的基礎(chǔ)實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • C++移動(dòng)語義介紹與使用講解

    C++移動(dòng)語義介紹與使用講解

    首先,移動(dòng)語義和完美轉(zhuǎn)發(fā)這兩個(gè)概念是在C++的模板編程的基礎(chǔ)上,新增的特性,主要是配合模板來使用。本篇會(huì)從C++的值類型,到移動(dòng)拷貝與移動(dòng)賦值來理解移動(dòng)語義與完美轉(zhuǎn)發(fā)
    2022-09-09
  • 使用C語言計(jì)算長方體的表面積和體積

    使用C語言計(jì)算長方體的表面積和體積

    這篇文章主要給大家介紹了關(guān)于如何使用C語言計(jì)算長方體的表面積和體積的相關(guān)資料,在C語言中,我們可以使用乘法運(yùn)算符(*)來進(jìn)行乘法運(yùn)算,并將結(jié)果保存在一個(gè)變量中,需要的朋友可以參考下
    2023-10-10
  • C語言中sizeof函數(shù)的基本使用總結(jié)

    C語言中sizeof函數(shù)的基本使用總結(jié)

    這篇文章主要給大家介紹了關(guān)于C語言中sizeof函數(shù)的基本使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • 詳解計(jì)數(shù)排序算法及C語言程序中的實(shí)現(xiàn)

    詳解計(jì)數(shù)排序算法及C語言程序中的實(shí)現(xiàn)

    技術(shù)排序算法與我們普通接觸的冒泡排序和快速排序等基于元素比較的算法不同,在編程中通過C語言的數(shù)組能夠清除地表達(dá)出來,這里我們就來詳解計(jì)數(shù)排序算法及C語言程序中的實(shí)現(xiàn)
    2016-07-07
  • C語言解決字符串中插入和刪除某段字符串問題

    C語言解決字符串中插入和刪除某段字符串問題

    這篇文章主要介紹了C語言解決字符串中插入和刪除某段字符串問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++實(shí)現(xiàn)LeetCode(63.不同的路徑之二)

    C++實(shí)現(xiàn)LeetCode(63.不同的路徑之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(63.不同的路徑之二),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++using聲明和using編譯指令

    C++using聲明和using編譯指令

    這篇文章主要介紹了C++using聲明和using編譯指令,C++當(dāng)中提供了兩種機(jī)制來簡(jiǎn)化對(duì)名稱空間中名稱的使用。using聲明使特定的標(biāo)識(shí)符keys,using編譯指令使整個(gè)名稱空間可用。下面我們就來看看這兩種機(jī)制的相關(guān)資料吧,需要的小伙伴可以參考一下
    2021-12-12
  • C++中的復(fù)制構(gòu)造函數(shù)詳解

    C++中的復(fù)制構(gòu)造函數(shù)詳解

    今天小編就為大家分享一篇關(guān)于關(guān)于C++復(fù)制構(gòu)造函數(shù)的實(shí)現(xiàn)講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2021-09-09

最新評(píng)論

香河县| 巫溪县| 司法| 海林市| 灵宝市| 廉江市| 谷城县| 苍南县| 屏东县| 池州市| 罗田县| 浑源县| 永修县| 旬阳县| 大丰市| 遂溪县| 钟山县| 游戏| 宁都县| 镇雄县| 台北市| 漠河县| 永吉县| 新巴尔虎左旗| 玛纳斯县| 台东市| 汶川县| 新建县| 五莲县| 濮阳县| 二手房| 南岸区| 忻州市| 湘乡市| 阳曲县| 濮阳市| 大名县| 江安县| 海门市| 城口县| 日喀则市|