C語言探索之旅 | 第二部分第十課: 實戰"懸掛小人"遊戲 答案

1240

-- 簡書作者 謝恩銘 轉載請註明出處

第二部分第十課: 實戰"懸掛小人"遊戲 答案


經過上一課C語言探索之旅 | 第二部分第九課: 實戰"懸掛小人"遊戲之後,相信大家都或多或少有寫自己的“懸掛小人”的遊戲代碼吧。

這一課我們就來"終結"這個遊戲吧 (聽着怎麼有點嚇人...)。

Yes, you are terminated.

解方(1. 遊戲的代碼)


如果你開始閱讀這裏,說明:

  • 或者你寫完了遊戲,想來看看我們怎麼寫

  • 或者你沒完成這個遊戲,想來看看怎麼寫

不管您是哪種情況,小編都會介紹一下如何來完成這個遊戲。

“說不說在我,聽不聽在您”~

事實上,小編自己花了比想象中更多的時間來完成這遊戲。

人生總是這樣的,“理想豐滿,現實骨感;看似美滿,人艱不拆”。

但是,我還是堅信大家是有能力獨自完成這個小遊戲的(如果你認真學習了之前的C語言課程),可以去查閱網上資料,花點時間(幾十分鐘,幾小時,幾天?),這並不是一次競賽,所以不用着急。

我更希望您花了不少時間,最終實現了這個遊戲; 比之您只花5分鐘,然後就來看答案要好很多。

千萬不要覺得小編是一蹴而就寫成這個遊戲的,這個遊戲雖小,但也還沒簡單到可以在腦中構思好一切,然後“下筆如有神”: 我也是一步步寫出來的。

我們將會分2步來介紹我們的解方:

  1. 首先我們會演示如何一步步寫遊戲的主體部分,一開始我們會只有一個猜測的單詞,而且是固定的; 我選了BOTTLE(英語 “瓶子”的意思),因爲我們要測試對於單詞中有大於等於兩個相同字母的情況是否處理正確了(BOTTLE中有2個T)。

  2. 然後我們會演示如何加入詞庫的處理程序,以便每一輪遊戲可以從詞庫中隨機抽取一個單詞。

牢記: 重要的不是結果,而是我們思考的方式和過程。

分析main函數


大家都知道,我們的C語言程序都是由main函數作爲入口的。

我們也不要忘了引入一些標準庫的頭文件: stdio.h, stdlib.h, ctype.h(爲了toupper函數)。

因此,我們的程序一開始會是這樣的:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(int argc, char* argv[])
{
  return 0;
}

是不是很簡單啊,慢慢來麼。

我們的main函數將控制遊戲的大部分運作,並且調用我們將要寫的不少函數。

我們來聲明一些必要的變量吧。這些變量也不是一次就能全部想到的,都是寫一點,想到一些。“羅馬不是一日建成的, 小人也不是一日能懸掛完的”。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(int argc, char* argv[])
{
  char letter = 0; // 存儲用戶輸入的字母
  char secretWord[] = "BOTTLE"; // 要猜測的單詞
  int letterFound[6] = {0}; // 布爾值的數組. 數組的每一個元素對應猜測單詞的一個字母。 0 = 還沒猜到此字母, 1 = 已猜到字母
  int leftTimes = 7; // 剩餘猜測次數 (0 = 失敗)
  int i = 0; // 爲了遍歷數組,需要一個下標

  return 0;
}

上述的變量中,起到關鍵作用的就是letterFound這個int型數組了。這個數組用於表示猜測的單詞中哪些字母已經猜到,哪些還沒猜到。

一開始,我們實現得簡單些:我們的單詞BOTTLE有6個字母,因此我們的數組就固定是6個元素的數組。

如果元素爲0,表示對應的那個字母還沒猜到;如果爲1,則表示已猜到。隨着遊戲的進行,這個數組的元素值會被修改。

例如,如果當下我們玩遊戲直到:

B*TT*E

那麼,letterFound這個數組的值應該是這樣:

101101

之後我們要測試遊戲的一輪是否已經勝利也就比較簡單了: 只需要測試letterFound數組的所有元素是否都等於1。

我們就來寫判斷一輪是否勝利的函數吧,取名爲win(英語 “勝利”的意思)好了。

int win(int letterFound[])
{
  int i = 0;
  int win = 1; // 1爲勝利,0爲失敗

  for (i = 0 ; i < 6 ; i++)
  {
    if (letterFound[i] == 0)
      win = 0;
  }

  return win;
}

可以看到,我們的win函數的參數是一個int型數組,我們在main函數中調用win函數時,會將我們的letterFound數組傳給它。

這個函數很簡單: 遍歷數組,只要還有一個元素爲0,那遊戲還沒勝利; 如果所有元素都爲1,則遊戲勝利。

爲了與此函數搭配,我們還需要寫一個函數,起名叫researchLetter,這個函數將有兩個功能:

  1. 返回一個布爾值(在C語言裏用int型表示),用於表示所猜的字母是否存在於單詞中。

  2. 更新letterFound數組的元素,如果所猜的字母在單詞中,那麼就把對應的元素值修改爲1。

int researchLetter(char letter, char secretWord[], int letterFound[])
{
  int i = 0;
  int correctLetter = 0; // 0表示字母不在單詞裏,1表示字母在單詞裏

  // 遍歷單詞數組secretWord,以判斷所猜字母是否在單詞中
  for (i = 0 ; secretWord[i] != '\0' ; i++)
  {
    if (letter == secretWord[i]) // 如果字母在單詞中
    {
      correctLetter = 1; // 表示猜對了一個字母
      letterFound[i] = 1; // 對於所有等於所猜字母的數組位置,都使其數值變爲1
    }
  }

  return correctLetter;
}

researchLetter這個函數的好處還在於: 不會在找到第一個存在的字母后就停止,而會繼續查找,所以對於像BOTTLE這樣有兩個字母相同的單詞就可以一次揭示兩個T了。

好,寫完這兩個函數(放在main函數後面),我們繼續寫我們的main函數。我們添加一句歡迎詞:

printf("歡迎來到懸掛小人遊戲!\n");

然後添加一個主循環,是一個while循環:

while (leftTimes > 0 && !win(letterFound))
{
}

每輪遊戲在leftTimes(剩餘猜測機會)大於0並且還沒勝利的情況下,是不會停止的。

  • 如果剩餘次數爲0,則本輪遊戲失敗
  • 如果勝利,那本輪就贏了

在這兩種情況下,都要停止遊戲。

我們在while循環裏添加如下代碼:

printf("\n\n您還剩 %d 次機會", leftTimes);
printf("\n神祕單詞是什麼呢 ? ");

/* 我們顯示猜測的單詞,將還沒猜到的字母用*表示例如 : *O**LE */
for (i = 0 ; i < 6 ; i++)
{
  if (letterFound[i]) // 如果第i+1個字母已經猜到
    printf("%c", secretWord[i]); // 打印出來
  else
    printf("*"); // 還沒猜到,打印一個星號*
}

上面的代碼用於:

  • 打印剩餘機會數

  • 打印單詞(其中還沒猜到的字母用星號*表示)

接下來,我們寫請求用戶輸入一個字母的代碼:

printf("\n輸入一個字母 : ");
letter = readCharacter();

還記得我們之前寫的函數 readCharacter 嗎?它用於讀取用戶的第一個輸入的字母,讀到回車符結束,而且它會把該字母轉成大寫。

// 如果用戶輸入的字母不存在於單詞中
if (!researchLetter(letter, secretWord, letterFound))
{
  leftTimes--; // 將剩餘猜測機會數減1
}

以上代碼調用researchLetter函數在單詞中查找用戶輸入的字母,如果沒找到,則剩餘猜測機會數扣除一次。

如果字母存在於單詞中,則researchLetter函數還會更新letterFound數組(每個元素對應了神祕單詞的每一個字母的猜測情況),將其中對應的0(還沒猜到)改爲1(已經猜到)。

這樣,win函數在判斷的時候,如果letterFound數組的每一個元素都爲1,則返回1,表示本輪勝利,猜到單詞的全部字母了。

暫時,while循環體的內容就到這裏了,然後我們還要寫跳出while循環之後的代碼(或者勝利或者失敗):

if (win(letterFound))
  printf("\n\n勝利了! 神祕單詞是 : %s\n", secretWord);
else
  printf("\n\n失敗了! 神祕單詞是 : %s\n", secretWord);

遊戲主體部分的代碼就到這裏了,給出我們到目前爲止的完整程序:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int win(int letterFound[]);
int researchLetter(char letter, char secretWord[], int letterFound[]);
char readCharacter();

int main(int argc, char* argv[])
{
  char letter = 0; // 存儲用戶輸入的字母
  char secretWord[] = "BOTTLE"; // 要猜測的單詞
  int letterFound[6] = {0}; // 布爾值的數組. 數組的每一個元素對應猜測單詞的一個字母。 0 = 還沒猜到此字母, 1 = 已猜到字母
  int leftTimes = 7; // 剩餘猜測次數 (0 = 失敗)
  int i = 0; // 爲了遍歷數組,需要一個下標

  printf("歡迎來到懸掛小人遊戲!\n");

  while (leftTimes > 0 && !win(letterFound))
  {
    printf("\n\n您還剩 %d 次機會", leftTimes);
    printf("\n神祕單詞是什麼呢 ? ");

    /* 我們顯示猜測的單詞,將還沒猜到的字母用*表示例如 : *O**LE */
    for (i = 0 ; i < 6 ; i++)
    {
      if (letterFound[i]) // 如果第i+1個字母已經猜到
        printf("%c", secretWord[i]); // 打印出來
      else
        printf("*"); // 還沒猜到,打印一個*
    }

    printf("\n輸入一個字母 : ");

    letter = readCharacter();

    // 如果用戶輸入的字母不存在於單詞中
    if (!researchLetter(letter, secretWord, letterFound))
    {
      leftTimes--; // 將剩餘猜測機會數減1
    }
  }

  if (win(letterFound))
    printf("\n\n勝利了! 神祕單詞是 : %s\n", secretWord);
  else
    printf("\n\n失敗了! 神祕單詞是 : %s\n", secretWord);

  return 0;
}

int win(int letterFound[])
{
  int i = 0;
  int win = 1; // 1爲勝利,0爲失敗

  for (i = 0 ; i < 6 ; i++)
  {
    if (letterFound[i] == 0)
      win = 0;
  }

  return win;
}

int researchLetter(char letter, char secretWord[], int letterFound[])
{
  int i = 0;
  int correctLetter = 0; // 0表示字母不在單詞裏,1表示字母在單詞裏

  // 遍歷單詞數組secretWord,以判斷所猜字母是否在單詞中
  for (i = 0 ; secretWord[i] != '\0' ; i++)
  {
    if (letter == secretWord[i]) // 如果字母在單詞中
    {
      correctLetter = 1; // 表示猜對了一個字母
      letterFound[i] = 1; // 對於所有等於所猜字母的數組位置,都將其數值變爲1
    }
  }

  return correctLetter;
}

char readCharacter()
{
  char character = 0;
  character = getchar(); // 讀取一個字母

  character = toupper(character); // 把這個字母轉成大寫

  // 讀取其他的字符,直到 \n (爲了忽略它)
  while (getchar() != '\n')
    ;

  return character; // 返回讀到的第一個字母
}

這一部分的程序,你可以將其存放在一個.c文件,例如叫hangman.c

然後用gcc編譯(如果是在IDE裏面,例如CodeBlocks,那直接點擊編譯運行):

gcc hangman.c -o hangman

運行:

./hangman

接下來我們要開始第二部分:

詞庫的代碼

根據這部分的代碼,我們還會接着修改和添加main函數的內容。

好吧,稍作休息,繼續前進!

解方(2. 詞庫的代碼)


我們已經編寫了遊戲主體部分的基本代碼,但是我們的遊戲目前還不能做到每輪隨機抽取一個單詞。

因此,接下來我們就帶大家編寫處理詞庫的代碼。

首先,我們需要創建一個文件,用於存放所有的單詞。

在Linux或Unix或Mac電腦下,我們都可以直接創建一個不帶後綴名的文件,在Windows下可以創建.txt結尾的文本文件。

小編寫這個遊戲是在Linux系統下,所以直接用VIM或Emacs或其他編輯器創建一個文件, 位於我們源文件的相同目錄下:

dictionary

在裏面寫入以下單詞(每行一個,用回車符隔開):

YOU
MOTHER
LOVE
PANDA
BOTTLE
FUNNY
HONEY
LIKE
JAZZ
MUSIC
BREAD
APPLE
WATER
PEOPLE
DOG
CAT
GLASS
SKY
GOD
ZERO

當然了,我這裏只是舉個例子,你可以創建屬於自己的詞庫。

新建兩個文件


處理這個文件的代碼將會不少(至少,我是這麼預感的),因此,我們新建一個.c源文件,可以命名爲dictionary.c

順便,我們也創建dictionary.h這個頭文件,其中存放dictionary.c中的函數的原型,這樣我們在main函數裏就可以通過

#include "dictionary.h"

來引入這些函數的定義了。

在dictionary.c中,首先我們引入一些頭文件:

#include <stdio.h>
#include <stdlib.h>
#include <time.h> //我們需要這裏面的隨機數函數,還記得我們的第一個小遊戲“或多或少”嗎? 
#include <string.h> //我們需要strlen這個計算字符串長度的函數

#include "dictionary.h"

chooseWord函數


這個函數用於從文件dictionary中隨機選取一個單詞,此函數只有一個參數: 指向內存中可以寫入單詞的地址的指針,這個指針實參將由main函數提供。

函數返回值是int變量: 1表示一切順利; 0表示出現錯誤。

此函數的開頭是這樣:

int chooseWord(char *wordChosen)
{
  FILE* dictionary = NULL; // 指向我們的文件dictionary(詞庫)的文件指針
  int wordNum = 0; // 詞庫中單詞總數
  int chosenWordNum = 0; // 選中的單詞編號
  int i = 0; // 下標
  int characterRead = 0; // 讀入的字符
}

聲明瞭一些變量,我們接着寫:

dictionary = fopen("dictionary", "r"); // 以只讀模式打開詞庫(dictionary文件)

if (dictionary == NULL) // 如果打開文件不成功
{
  printf("\n無法裝載詞庫\n");

  return 0; // 返回0表示出錯
}

這段代碼不難吧,就是嘗試打開詞庫(dictionary文件),並檢測dictionary文件指針是否爲NULL。

如果爲NULL,表示打開失敗。如果打開文件失敗,則程序中止,因爲沒有進行下去的必要了。

// 統計詞庫中的單詞總數,也就是統計回車符 \n 的數目
do
{
  characterRead = fgetc(dictionary);
  if (characterRead == '\n')
    wordNum++;
} while(characterRead != EOF);

上面這段代碼中,我們藉助fgetc函數遍歷整個文件(一個字符一個字符讀取)

我們統計讀到的回車符(\n)的數目,每讀到一個\n,我們對wordNum(單詞總數)的值加1。

我們通過以上代碼,就可以知道詞庫中的單詞總數了,就是wordNum的值。

然後,我們需要一個函數,根據wordNum的值計算一個僞隨機數出來,作爲隨機選取的單詞編號,我們就來寫一個函數,命名爲: randomNum。

randomNum函數


此函數裏的代碼我們之前編寫第一個C語言小遊戲: “或多或少” 時已經用過了,就是簡單的僞隨機數生成。

作用: 用於返回一個介於 0~(單詞總數-1) 之間的隨機數。

int randomNum(int maxNum)
{
  srand(time(NULL));
  return (rand() % maxNum);
}

寫好了randomNum函數,我們立即來使用它:

chosenWordNum = randomNum(wordNum); // 隨機選取一個單詞(編號)

接着,我們需要重新回到文件開始處來進行讀取,爲了回到文件開始處,可以調用函數 rewind。

// 我們重新從文件開始處讀取(rewind函數),直到遇到選中的那個單詞
rewind(dictionary);

while (chosenWordNum > 0)
{
  characterRead = fgetc(dictionary);
  if (characterRead == '\n')
    chosenWordNum--;
}

/* 文件指針已經指向正確位置,我們就用fgets來讀取那一行(也就是那個選中的單詞)*/
fgets(wordChosen, 100, dictionary);

// 放置 \0 字符用於表示字符串結束
wordChosen[strlen(wordChosen) - 1] = '\0';

fclose(dictionary);

return 1; // 一切順利,返回1

dictionary.h文件


其中包含我們的dictionary.c中的函數原型,內容如下:

#ifndef DICTIONARY_H
#define DICTIONARY_H

int chooseWord(char *wordChosen);
int randomNum(int maxNum);

#endif

完整的dictionary.c文件

/*
懸掛小人遊戲

dictionary.c
------------

這裏定義了兩個函數:

1. chooseWord 用於每輪從dictionary文件中隨機抽取一個單詞
2. randomNum 用於返回一個介於 0~(單詞總數-1) 之間的隨機數

*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#include "dictionary.h"

int chooseWord(char *wordChosen)
{
  FILE* dictionary = NULL; // 指向我們的文件dictionary的文件指針
  int wordNum = 0; // 單詞總數
  int chosenWordNum = 0; // 選中的單詞編號
  int i = 0; // 下標
  int characterRead = 0; // 讀入的字符

  dictionary = fopen("dictionary", "r"); // 以只讀模式打開詞庫(dictionary文件)
  if (dictionary == NULL) // 如果打開文件不成功
  {
    printf("\n無法裝載詞庫\n");
    return 0; // 返回0表示出錯
  }

  // 統計詞庫中的單詞總數,也就是統計回車符 \n 的數目
  do
  {
    characterRead = fgetc(dictionary);
    if (characterRead == '\n')
      wordNum++;
  } while(characterRead != EOF);

  chosenWordNum = randomNum(wordNum); // 隨機選取一個單詞(編號)

  // 我們重新從文件開始處讀取(rewind函數),直到遇到選中的那個單詞
  rewind(dictionary);
  while (chosenWordNum > 0)
  {
    characterRead = fgetc(dictionary);
    if (characterRead == '\n')
      chosenWordNum--;
  }

   /* 文件指針已經指向正確位置,我們就用fgets來讀取那一行(也就是那個選中的單詞)*/
  fgets(wordChosen, 100, dictionary);

  // 放置 \0 字符用於表示字符串結束
  wordChosen[strlen(wordChosen) - 1] = '\0';
  fclose(dictionary);

  return 1; // 一切順利,返回1
}

int randomNum(int maxNum)
{
  srand(time(NULL));
  return (rand() % maxNum);
}

修改hangman.c文件


現在,既然我們的處理詞庫的函數已經寫完了,也就是在dictionary.c中,那麼我們需要相應地修改我們的hangman.c文件中的main函數和其他幾個子函數:

有了之前所有課程的知識,靠着註釋,應該不難看懂。

完整的hangman.c文件

/*
懸掛小人遊戲

main.c
------------

遊戲的主體代碼
*/

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#include "dictionary.h"

int win(int letterFound[], long wordSize);
int researchLetter(char letter, char secretWord[], int letterFound[]);
char readCharacter();

int main(int argc, char* argv[])
{
  char letter = 0; // 存儲用戶輸入的字母
  char secretWord[100] = {0}; // 要猜測的單詞
  int *letterFound = NULL; // 布爾值的數組. 數組的每一個元素對應猜測單詞的一個字母。 0 = 還沒猜到此字母, 1 = 已猜到字母
  int leftTimes = 7; // 剩餘猜測次數 (0 = 失敗)
  int i = 0; // 下標
  long wordSize = 0; // 單詞的長度(字母數目)

  printf("歡迎來到懸掛小人遊戲!\n");

  // 從詞庫(文件dictionary)中隨機選取一個單詞
  if (!chooseWord(secretWord))
    exit(0); // 退出遊戲

 // 獲取單詞的長度
 wordSize = strlen(secretWord);

  letterFound = malloc(wordSize * sizeof(int)); // 動態分配數組的大小,因爲我們一開始不知道單詞長度
  if (letterFound == NULL)
    exit(0);

  // 初始化布爾值數組,都置爲0,表示還沒有字母被猜到
  for (i = 0 ; i < wordSize ; i++)
    letterFound[i] = 0;

  // 主while循環,如果還有猜測機會並且還沒勝利,繼續
  while (leftTimes > 0 && !win(letterFound, wordSize))
  {
    printf("\n\n您還剩 %d 次機會", leftTimes);
    printf("\n神祕單詞是什麼呢 ? ");

    /* 我們顯示猜測的單詞,將還沒猜到的字母用*表示
        例如 : *O**LE */
    for (i = 0 ; i < wordSize ; i++)
    {
      if (letterFound[i]) // 如果第i+1個字母已經猜到
        printf("%c", secretWord[i]); // 打印出來
      else
        printf("*"); // 還沒猜到,打印一個*
    }

    printf("\n輸入一個字母 : ");
    letter = readCharacter();

    // 如果用戶輸入的字母不存在於單詞中
    if (!researchLetter(letter, secretWord, letterFound))
    {
      leftTimes--; // 將剩餘猜測機會數減1
    }
  }

  if (win(letterFound, wordSize))
    printf("\n\n勝利了! 神祕單詞是 : %s\n", secretWord);
  else
    printf("\n\n失敗了! 神祕單詞是 : %s\n", secretWord);

  return 0;
}

// 判斷是否勝利
int win(int letterFound[], long wordSize)
{
  int i = 0;
  int win = 1; // 1爲勝利,0爲失敗

  for (i = 0 ; i < wordSize ; i++)
  {
    if (letterFound[i] == 0)
    win = 0;
  }

  return win;
}

// 在所要猜的單詞中查找用戶輸入的字母
int researchLetter(char letter, char secretWord[], int letterFound[])
{
  int i = 0;
  int correctLetter = 0; // 0表示字母不在單詞裏,1表示字母在單詞裏

  // 遍歷單詞數組secretWord,以判斷所猜字母是否在單詞中
  for (i = 0 ; secretWord[i] != '\0' ; i++)
  {
    if (letter == secretWord[i]) // 如果字母在單詞中
    {
      correctLetter = 1; // 表示猜對了一個字母
      letterFound[i] = 1; // 對於所有等於所猜字母的數組位置,都將其數值變爲1
    }
  }

  return correctLetter;
}

char readCharacter()
{
  char character = 0;

  character = getchar(); // 讀取一個字母
  character = toupper(character); // 把這個字母轉成大寫

  // 讀取其他的字符,直到 \n (爲了忽略它)
  while(getchar() != '\n')
    ;

  return character; // 返回讀到的第一個字母
}

好了,這個小遊戲已經寫完了,用gcc編譯並運行看看吧!

gcc dictionary.c hangman.c -o hangman

./hangman

優化建議


因爲我們的項目是在Linux下用gcc來編譯的,如果你是在Windows下用CodeBlocks等IDE來編譯的,那麼請將字典文件dictionary改成dictionary.txt

因爲Windows的文件儲存形式和Linux(或Unix)有些不一樣。

改進遊戲


  1. 目前來說,我們只讓玩家玩一輪,如果能加一個循環,使得遊戲每次詢問玩家是否要再玩一次,那“真真是極好的”

  2. 目前還是單機模式,可以創建一個二人模式,就是一個玩家輸入一個單詞,第二個玩家來猜。

  3. 爲什麼不用printf函數來打印(繪製)一個懸掛小人呢?在每次我們猜錯的時候,就把它畫出來,每錯一個,多畫一筆,這樣可以增加樂趣,可以用如下的代碼:

if (猜錯1個字母)
{
  printf(" _____\n");
  printf(" | |\n");
  printf(" | O\n");
  printf(" |\n");
  printf(" |\n");
  printf(" |\n");
  printf(" |\n");
  printf("__|__\n");
}
else if (猜錯2個字母)
{
  printf(" _____\n");
  printf(" | |\n");
  printf(" | O\n");
  printf(" | |\n");
  printf(" |\n");
  printf(" |\n");
  printf(" |\n");
  printf("__|__\n");
}
else if (猜錯3個字母)
{
  printf(" _____\n");
  printf(" | |\n");
  printf(" | O\n");
  printf(" | \\|\n");
  printf(" |\n");
  printf(" |\n");
  printf(" |\n");
  printf("__|__\n");
}
else if (猜錯4個字母)
{
  printf(" _____\n");
  printf(" | |\n");
  printf(" | O\n");
  printf(" | \\|/\n");
  printf(" |\n");
  printf(" |\n");
  printf(" |\n");
  printf("__|__\n");
}
else if (猜錯5個字母)
{
  printf(" _____\n");
  printf(" | |\n");
  printf(" | O\n");
  printf(" | \\|/\n");
  printf(" | |\n");
  printf(" |\n");
  printf(" |\n");
  printf("__|__\n");
}
else if (猜錯6個字母)
{
  printf(" _____\n");
  printf(" | |\n");
  printf(" | O\n");
  printf(" | \\|/\n");
  printf(" | |\n");
  printf(" | /\n");
  printf(" |\n");
  printf("__|__\n");
}
else if (猜錯7個字母)
{
  printf(" _____\n");
  printf(" | |\n");
  printf(" | O\n");
  printf(" | \\|/\n");
  printf(" | |\n");
  printf(" | / \\\n");
  printf(" |\n");
  printf("__|__\n");
}

上面代碼中的空格也許不同平臺的顯示不一樣,我這裏是5個空格。可能需要大家自行調整。

如果7次機會全部用完,則小人掛掉,遊戲結束。

請大家花點時間,好好理解這個遊戲,並且儘可能地改進它。如果你可以不看我們的答案,而自己完成遊戲和改進,那麼你會收穫很多的!

第二部分第十一課預告:


今天的課就到這裏,一起加油吧。

下一課我們來做點複習性質的練習題,然後就開始第三部分[用C語言寫圖形界面的遊戲]了。

C語言探索之旅 | 第二部分第十一課:練習題和習作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章