亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言實現三子棋程序

發布時間:2020-10-02 11:13:07 來源:腳本之家 閱讀:147 作者:ljx_csdn 欄目:編程語言

本文實例為大家分享了C語言實現三子棋的具體代碼,供大家參考,具體內容如下

先直接上代碼:

#define _CRT_SECURE_NO_WARNINGS 1

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

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

void print_chessboard(char coord[][3]) //打印棋盤函數
{  //多維數組在傳參時,接收數組的形參最多只能是第一個方括號里沒有數字(下標范圍)
   //否則就會出錯(因為此時編譯器不知道你要把傳過來的數組的元素劃分成幾行幾列,
   //但是當除第一個方括號的其他方括號都有值時,就可以經過計算知道第一個方括號的值是多少
 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 個字符換下一行輸出
  {
   printf("\n");
  }
 }
}

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

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;     //產生 0--2 的隨機數
  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("此位置已有棋子,請重下!\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);  //把打印棋盤放在是因為想在兩人都走完一次后再打印當前棋盤狀態
 }
 return 0;
}

void winer(char coord[][3],int *flag)   //判斷是否產生贏家,贏家是誰
{
 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] } };
       //把所有能贏的情況定義成一個字符串數組
 int i = 0;
 for (i = 0; i < 8; i++)
 {
  if (strcmp(line_ch[i],"***") == 0) //判斷此時玩家已輸入的落子能不能組成一個使玩家能贏的字符串
  {
   print_chessboard(coord);   //先打印棋盤,再判斷誰勝誰負
   printf("\n恭喜您贏了!\n");
   *flag = 1;      //玩家贏,使最開始設置的贏的標志位為1,結束此次游戲
   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;    //一次游戲最多的內層while循環可循環的次數
  int ret = 0;   //是否結束此次游戲的標志位
  int is_play = 0;  //是否再次玩游戲的標志位
  char coordinate[3][3] = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' };
        //為了拓展游戲比較方便,可以把行和列定義成宏定義
  menu();     
  scanf("%d", &num);
  if (num == 0)
  {
   printf("5秒后退出程序!\n");
   Sleep(5000);
   exit(0);
  }
  computer(coordinate);  //因為設計電腦智商低,所以游戲開始前先讓電腦落一子
  print_chessboard(coordinate);
  while ((i))    //因為總共有九個位置可以落子,已用一個,還剩八個,每次循環不結束的話會用掉兩個
         //所以最多循環四次
  {
   printf("請輸入 X、Y 的坐標(0--2)來確定你下棋的位置:"); //也可以加一個判斷輸入是否合法
   scanf("%d %d", &x, &y);
   ret = player(coordinate, x, y);
   if (ret == 1)
   {
    break;
   }
   i--;
  } 
  printf("\n");
  printf("請選擇接下來的操作:\n");
  printf("1、 再玩一次游戲 0、退出游戲系統\n");
  scanf("%d", &is_play);
  if(is_play == 0)
  {
   printf("5秒后退出程序!\n");
   Sleep(5000);
   exit(0);
  }
  else
  {
   system("cls");
  }
 }
 system("pause");
 return 0;
}

C語言實現三子棋程序

C語言實現三子棋程序

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

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

下面來分析一下幾個函數的設計思路:

1.菜單打印函數

這個函數很簡單,一看就能明白,這兒就不多說了。

2.棋盤打印函數

首先得構思一下三子棋的棋盤應該是什么樣

C語言實現三子棋程序

簡單點,上圖就可以作為三子棋棋盤(其實就是利用 putchar() 函數和 printf() 把顯示在屏幕上的字符一個個,一行行打印上去)。設計時可把其分成四部分來看,(1) 短豎杠 ; (2) 短橫杠 ; (3) 棋子(用一個二維字符數組來定義每一個棋子,用二維是因為方便輸入的 X 和 Y 值與數組下標對應) ; (4) 空格(一開始打印的時候,因為還沒有落子,所以把棋子也設計成空格)。 先確定要輸入幾行幾列字符,以確定循環輸出的次數,還有確定每個位置該輸出的字符,這樣就可以依靠循環和判斷打印出棋盤了。

3 . 贏家判斷函數

在每次落子后都要先進行一次判斷,看是否已經產生贏家了。
因為會出現贏家的情況就八種———–

{ 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] }

定義一個字符串數組,里面共有八個字符串,每一個字符串就是上面的一個花括弧里的內容,當某個字符串的內容與 * 或 ooo 相等,那么說明產生贏家了,否則不會產生贏家,那么就用一個循環,遍歷字符串數組里的每一個字符串,判斷是否會產生贏家。

4. 玩家下棋函數

玩家通過輸入 x,y 坐標來確定落子的位置, x,y 對應的就是 定義的棋子二維字符數組的下標,每次先判斷輸入的 x,y 值對應數組下標的元素是否是 * 或 o ,是的話就說明此處已有落子,得重新輸入,不是的話就落下該棋子,接著判斷是否產生贏家,是的話就結束此次游戲,不是的話就判斷棋盤上是否還有空位置沒落子,有的話就輪到電腦繼續落子,沒有的話就結束此次游戲。

5. 電腦下棋函數

因為電腦是自動落子,所以得為電腦產生一個隨機的 棋子二維數組下標值,使電腦隨機落子,這個用srand((unsigned)time(NULL)); index_x2 = 2 * rand() / RAND_MAX; index_y2= 2 * rand() / RAND_MAX;來實現把它們放在一個while 死循環里,因為可能產生的兩個隨機下標那兒已經有棋子了,需要重新產生一次隨機下標,當下標值與已落棋子不沖突時,就落下該棋子,接著判斷是否產生贏家,是的話,就結束此次游戲,不是的話就判斷棋盤上是否還有空位置沒落子,有的話就輪到玩家繼續落子,沒有的話就結束此次游戲。

6. 主函數

在主函數里適當調用以上定義的幾個函數,實現正確的邏輯功能。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

茌平县| 大港区| 盱眙县| 安康市| 枞阳县| 金溪县| 清水河县| 花莲县| 朝阳区| 温宿县| 武鸣县| 临安市| 民勤县| 临澧县| 讷河市| 兴仁县| 鹤壁市| 玛沁县| 安徽省| 宜宾市| 海原县| 大石桥市| 建瓯市| 施甸县| 普兰县| 鹤庆县| 视频| 赤峰市| 瑞安市| 达拉特旗| 准格尔旗| 徐水县| 乌鲁木齐县| 津南区| 波密县| 郓城县| 象山县| 定边县| 天门市| 平顺县| 玉林市|