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

C語(yǔ)言實(shí)現(xiàn)三子棋程序

 更新時(shí)間:2020年03月21日 15:53:02   作者:ljx_csdn  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)三子棋程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

先直接上代碼:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>   //2.實(shí)現(xiàn)三子棋游戲。
#include<Windows.h>  //Sleep() RAND_MAX 的頭文件

void menu()      //打印菜單
{
 printf("****************************\n");
 printf("**** 歡迎來(lái)到三子棋游戲 ****\n");
 printf("**** 1、 進(jìn)入游戲  ****\n");
 printf("**** 0、 退出游戲  ****\n");
 printf("****************************\n");
 printf("請(qǐng)輸入:->");
}

void print_chessboard(char coord[][3]) //打印棋盤函數(shù)
{  //多維數(shù)組在傳參時(shí),接收數(shù)組的形參最多只能是第一個(gè)方括號(hào)里沒有數(shù)字(下標(biāo)范圍)
   //否則就會(huì)出錯(cuò)(因?yàn)榇藭r(shí)編譯器不知道你要把傳過(guò)來(lái)的數(shù)組的元素劃分成幾行幾列,
   //但是當(dāng)除第一個(gè)方括號(hào)的其他方括號(hào)都有值時(shí),就可以經(jīng)過(guò)計(jì)算知道第一個(gè)方括號(hào)的值是多少
 int i = 0;
 int index_x = 0;
 int index_y = 0;
 for (i = 1; i <= 153; i++)
 {    
  char out_ch = ' ';
  if ((i % 51 == 20) || (i % 51 == 26) || (i % 51 == 32) )
  {
   out_ch = coord[index_x][index_y];
   index_x++;
   if (index_x < 3)
   {
    index_x = 0;
    index_y++;
   }
  }
  else if ((i % 17 == 6) || (i % 17 == 12))
  {
   out_ch = '|';
  }
  else if( (i >= 35 && i <= 51 && i != 40 && i != 46) || \
     (i >= 86 && i <= 102 && i != 91 && i != 97))
  {
   out_ch = '_';
  }
  putchar(out_ch);
  if (i % 17 == 0)     //每輸出 17 個(gè)字符換下一行輸出
  {
   printf("\n");
  }
 }
}

void winer(char coord[][3], int *flag);  //贏家判斷函數(shù)的聲明

int computer(char coord[][3])        //電腦下棋
{
 int flag = 0;
 int index_x2 = 0;
 int index_y2 = 0;
 srand((unsigned)time(NULL));
 while (1)
 {
  index_x2 = 2 * rand() / RAND_MAX;     //產(chǎn)生 0--2 的隨機(jī)數(shù)
  index_y2 = 2 * rand() / RAND_MAX;
  if ((coord[index_x2][index_y2] != '*') && (coord[index_x2][index_y2] != 'o'))
  {             //判斷該位置是否已有落子
   coord[index_x2][index_y2] = 'o';
   winer(coord, &flag);
   if (flag == 1)
   {
    return 1;
   }
   return 0;
  }
 }
}

int player(char coord[][3], int index_x1, int index_y1) //玩家下棋
{
 int flag = 0;
 int ret = 0;
 if ((coord[index_x1][index_y1] == '*') || (coord[index_x1][index_y1] == 'o'))
 {              //判斷該位置是否已有落子
  printf("此位置已有棋子,請(qǐng)重下!\n");
  return 0;
 }
 else
 {
  coord[index_x1][index_y1] = '*';
  winer(coord, &flag);
  if (flag == 1)
  {
   return 1;
  }
  ret = computer(coord);
  if (ret == 1)
  {
   return 1;
  }
  print_chessboard(coord);  //把打印棋盤放在是因?yàn)橄朐趦扇硕甲咄暌淮魏笤俅蛴‘?dāng)前棋盤狀態(tài)
 }
 return 0;
}

void winer(char coord[][3],int *flag)   //判斷是否產(chǎn)生贏家,贏家是誰(shuí)
{
 char line_ch[8][4] = { { coord[0][0], coord[1][1], coord[2][2] }, { coord[0][0], coord[0][1], coord[0][2] }, \
       { coord[0][0], coord[1][0], coord[2][0] }, { coord[0][1], coord[1][1], coord[2][1] }, \
       { coord[0][2], coord[1][2], coord[2][2] }, { coord[1][0], coord[1][1], coord[1][2] }, \
       { coord[2][0], coord[2][1], coord[2][2] }, { coord[0][2], coord[1][1], coord[2][0] } };
       //把所有能贏的情況定義成一個(gè)字符串?dāng)?shù)組
 int i = 0;
 for (i = 0; i < 8; i++)
 {
  if (strcmp(line_ch[i],"***") == 0) //判斷此時(shí)玩家已輸入的落子能不能組成一個(gè)使玩家能贏的字符串
  {
   print_chessboard(coord);   //先打印棋盤,再判斷誰(shuí)勝誰(shuí)負(fù)
   printf("\n恭喜您贏了!\n");
   *flag = 1;      //玩家贏,使最開始設(shè)置的贏的標(biāo)志位為1,結(jié)束此次游戲
   return;
  }
  else if (strcmp(line_ch[i],"ooo") == 0)
  {
   print_chessboard(coord);
   printf("\n很遺憾,您輸了!\n");
   *flag = 1;
   return;
  }
  else
  {
   ;
  }
 }
}

int main()
{
 while (1)
 {
  int num = 0;   //決定開始或退出游戲
  int x = 0;
  int y = 0;
  int i = 4;    //一次游戲最多的內(nèi)層while循環(huán)可循環(huán)的次數(shù)
  int ret = 0;   //是否結(jié)束此次游戲的標(biāo)志位
  int is_play = 0;  //是否再次玩游戲的標(biāo)志位
  char coordinate[3][3] = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' };
        //為了拓展游戲比較方便,可以把行和列定義成宏定義
  menu();     
  scanf("%d", &num);
  if (num == 0)
  {
   printf("5秒后退出程序!\n");
   Sleep(5000);
   exit(0);
  }
  computer(coordinate);  //因?yàn)樵O(shè)計(jì)電腦智商低,所以游戲開始前先讓電腦落一子
  print_chessboard(coordinate);
  while ((i))    //因?yàn)榭偣灿芯艂€(gè)位置可以落子,已用一個(gè),還剩八個(gè),每次循環(huán)不結(jié)束的話會(huì)用掉兩個(gè)
         //所以最多循環(huán)四次
  {
   printf("請(qǐng)輸入 X、Y 的坐標(biāo)(0--2)來(lái)確定你下棋的位置:"); //也可以加一個(gè)判斷輸入是否合法
   scanf("%d %d", &x, &y);
   ret = player(coordinate, x, y);
   if (ret == 1)
   {
    break;
   }
   i--;
  } 
  printf("\n");
  printf("請(qǐng)選擇接下來(lái)的操作:\n");
  printf("1、 再玩一次游戲 0、退出游戲系統(tǒng)\n");
  scanf("%d", &is_play);
  if(is_play == 0)
  {
   printf("5秒后退出程序!\n");
   Sleep(5000);
   exit(0);
  }
  else
  {
   system("cls");
  }
 }
 system("pause");
 return 0;
}

程序一共設(shè)計(jì)了六個(gè)函數(shù),一個(gè)主函數(shù),五個(gè)自定義函數(shù)— 菜單打印函數(shù)、棋盤打印函數(shù)、電腦下棋函數(shù)、玩家下棋函數(shù)、贏家判斷函數(shù)。

其中最難設(shè)計(jì)的就是棋盤打印函數(shù)和贏家判斷函數(shù)。這兩個(gè)函數(shù)需要完成的任務(wù)多,計(jì)算量大,邏輯設(shè)計(jì)麻煩。

下面來(lái)分析一下幾個(gè)函數(shù)的設(shè)計(jì)思路:

1.菜單打印函數(shù)

這個(gè)函數(shù)很簡(jiǎn)單,一看就能明白,這兒就不多說(shuō)了。

2.棋盤打印函數(shù)

首先得構(gòu)思一下三子棋的棋盤應(yīng)該是什么樣

簡(jiǎn)單點(diǎn),上圖就可以作為三子棋棋盤(其實(shí)就是利用 putchar() 函數(shù)和 printf() 把顯示在屏幕上的字符一個(gè)個(gè),一行行打印上去)。設(shè)計(jì)時(shí)可把其分成四部分來(lái)看,(1) 短豎杠 ; (2) 短橫杠 ; (3) 棋子(用一個(gè)二維字符數(shù)組來(lái)定義每一個(gè)棋子,用二維是因?yàn)榉奖爿斎氲?X 和 Y 值與數(shù)組下標(biāo)對(duì)應(yīng)) ; (4) 空格(一開始打印的時(shí)候,因?yàn)檫€沒有落子,所以把棋子也設(shè)計(jì)成空格)。 先確定要輸入幾行幾列字符,以確定循環(huán)輸出的次數(shù),還有確定每個(gè)位置該輸出的字符,這樣就可以依靠循環(huán)和判斷打印出棋盤了。

3 . 贏家判斷函數(shù)

在每次落子后都要先進(jìn)行一次判斷,看是否已經(jīng)產(chǎn)生贏家了。
因?yàn)闀?huì)出現(xiàn)贏家的情況就八種———–

{ coord[0][0], coord[1][1], coord[2][2] }, { coord[0][0], coord[0][1], coord[0][2] },
{ coord[0][0], coord[1][0], coord[2][0] }, { coord[0][1], coord[1][1], coord[2][1] },
{ coord[2][0], coord[2][1], coord[2][2] }, { coord[1][0], coord[1][1], coord[1][2] },
{ coord[2][0], coord[2][1], coord[2][2] }, { coord[0][2], coord[1][1], coord[2][0] }

定義一個(gè)字符串?dāng)?shù)組,里面共有八個(gè)字符串,每一個(gè)字符串就是上面的一個(gè)花括弧里的內(nèi)容,當(dāng)某個(gè)字符串的內(nèi)容與 * 或 ooo 相等,那么說(shuō)明產(chǎn)生贏家了,否則不會(huì)產(chǎn)生贏家,那么就用一個(gè)循環(huán),遍歷字符串?dāng)?shù)組里的每一個(gè)字符串,判斷是否會(huì)產(chǎn)生贏家。

4. 玩家下棋函數(shù)

玩家通過(guò)輸入 x,y 坐標(biāo)來(lái)確定落子的位置, x,y 對(duì)應(yīng)的就是 定義的棋子二維字符數(shù)組的下標(biāo),每次先判斷輸入的 x,y 值對(duì)應(yīng)數(shù)組下標(biāo)的元素是否是 * 或 o ,是的話就說(shuō)明此處已有落子,得重新輸入,不是的話就落下該棋子,接著判斷是否產(chǎn)生贏家,是的話就結(jié)束此次游戲,不是的話就判斷棋盤上是否還有空位置沒落子,有的話就輪到電腦繼續(xù)落子,沒有的話就結(jié)束此次游戲。

5. 電腦下棋函數(shù)

因?yàn)殡娔X是自動(dòng)落子,所以得為電腦產(chǎn)生一個(gè)隨機(jī)的 棋子二維數(shù)組下標(biāo)值,使電腦隨機(jī)落子,這個(gè)用srand((unsigned)time(NULL)); index_x2 = 2 * rand() / RAND_MAX; index_y2= 2 * rand() / RAND_MAX;來(lái)實(shí)現(xiàn)把它們放在一個(gè)while 死循環(huán)里,因?yàn)榭赡墚a(chǎn)生的兩個(gè)隨機(jī)下標(biāo)那兒已經(jīng)有棋子了,需要重新產(chǎn)生一次隨機(jī)下標(biāo),當(dāng)下標(biāo)值與已落棋子不沖突時(shí),就落下該棋子,接著判斷是否產(chǎn)生贏家,是的話,就結(jié)束此次游戲,不是的話就判斷棋盤上是否還有空位置沒落子,有的話就輪到玩家繼續(xù)落子,沒有的話就結(jié)束此次游戲。

6. 主函數(shù)

在主函數(shù)里適當(dāng)調(diào)用以上定義的幾個(gè)函數(shù),實(shí)現(xiàn)正確的邏輯功能。

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

相關(guān)文章

  • C++中的動(dòng)態(tài)規(guī)劃子序列問(wèn)題分析探討

    C++中的動(dòng)態(tài)規(guī)劃子序列問(wèn)題分析探討

    可能有些讀者有接觸過(guò)動(dòng)態(tài)規(guī)劃,可能也有一些讀者以前完全不知道動(dòng)態(tài)規(guī)劃這個(gè)東西,別擔(dān)心,我這篇文章會(huì)為讀者做一個(gè)入門,好讓讀者掌握這個(gè)重要的知識(shí)點(diǎn)
    2023-03-03
  • C++使用一個(gè)棧實(shí)現(xiàn)另一個(gè)棧的排序算法示例

    C++使用一個(gè)棧實(shí)現(xiàn)另一個(gè)棧的排序算法示例

    這篇文章主要介紹了C++使用一個(gè)棧實(shí)現(xiàn)另一個(gè)棧的排序算法,結(jié)合實(shí)例形式分析了C++借助輔助棧實(shí)現(xiàn)棧排序算法的相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • 利用Matlab制作一款3D版2048小游戲

    利用Matlab制作一款3D版2048小游戲

    2048作為一款經(jīng)典的小游戲,相信很多人都玩過(guò)吧?但是3D版的2048不知道有沒有人玩過(guò)呢?本文將用Matlab制作一個(gè)3D版的2048小游戲,快跟隨小編一起動(dòng)手試一試吧
    2022-02-02
  • C語(yǔ)言實(shí)現(xiàn)圖的搜索算法示例

    C語(yǔ)言實(shí)現(xiàn)圖的搜索算法示例

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)圖的搜索算法,結(jié)合具體實(shí)例形式分析了C語(yǔ)言實(shí)現(xiàn)圖的定義及搜索相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • 基于排列與組合輸出多少中情況詳解

    基于排列與組合輸出多少中情況詳解

    本篇文章對(duì)排列與組合輸出多少中情況進(jìn)行了介紹。需要的朋友參考下
    2013-05-05
  • VC文件目錄常見操作實(shí)例匯總

    VC文件目錄常見操作實(shí)例匯總

    這篇文章主要介紹了VC文件目錄常見操作實(shí)例匯總,總結(jié)了VC針對(duì)文件目錄的各種常用操作,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C語(yǔ)言快速排序函數(shù)用法(qsort)

    C語(yǔ)言快速排序函數(shù)用法(qsort)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的快排函數(shù)用法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C語(yǔ)言運(yùn)算符與表達(dá)式

    C語(yǔ)言運(yùn)算符與表達(dá)式

    這篇文章主要介紹了C語(yǔ)言運(yùn)算符與表達(dá)式,表達(dá)式是C語(yǔ)言的主體。在C語(yǔ)言中,表達(dá)式由操作符和操作數(shù)組成,更多相關(guān)介紹需要的小伙伴可以參考下面文章內(nèi)容
    2022-07-07
  • C++基于EasyX框架實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲

    C++基于EasyX框架實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲

    EasyX是針對(duì)C/C++的圖形庫(kù),可以幫助使用C/C++語(yǔ)言的程序員快速上手圖形和游戲編程。本文將利用EasyX框架實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲,需要的可以參考一下
    2023-01-01
  • 用Visual Studio2017寫C++靜態(tài)庫(kù)圖文詳解

    用Visual Studio2017寫C++靜態(tài)庫(kù)圖文詳解

    這篇文章主要介紹了用Visual Studio2017寫C++靜態(tài)庫(kù)的圖文教程,需要的朋友可以參考下
    2017-04-04

最新評(píng)論

萨嘎县| 麻栗坡县| 尉犁县| 吉水县| 巴塘县| 溧水县| 淮北市| 江达县| 卓尼县| 交口县| 郎溪县| 辽中县| 航空| 临夏市| 瑞安市| 怀宁县| 馆陶县| 尖扎县| 当雄县| 大渡口区| 布拖县| 双柏县| 平昌县| 上饶县| 迁西县| 曲靖市| 沭阳县| 永仁县| 三明市| 绿春县| 龙海市| 盐津县| 萝北县| 凤翔县| 新巴尔虎左旗| 吴忠市| 南昌市| 铁岭市| 枣阳市| 满洲里市| 永修县|