2017年1月1日 星期日

[C/C++自製2D遊戲]#03 第一支程式 --- 先玩玩無圖像的<主控台>(中篇)

在前一篇教學中,我們在主控台<console>內使用printf()函數印出了字串。
在本篇教學中,我們要教大家如何從主控台中取得玩家輸入的字串。

===============
原理解說:

  1. 標準C函式庫(library, 簡稱lib)中,經典輸入輸出函數都存放在<stdio.lib>中;透過在程式的開端以#include <stdio.h>指令,即可使用經典輸入輸出函數。
  2. 經典C函式輸入輸出函數:
         A. 輸出函數printf()
         B. 輸入函數scanf()
  3. 掌握了scanf()之後,我們再多學習一個函數:getchar()。getchar()提供了一個便捷的字元輸入方式,非常的好用。
* 請注意,本節使用的stdio函式庫都是標準C函式庫。C++系列另有一套更簡便的輸入輸出函式庫稱為iostream。
===============

STEP #1:

打開VC++ 2008 Express,開啟前節專案(project)或是新造一個專案。
開啟main.cpp程式檔,將程式內容修改為下:

#include <stdio.h>

void main(){
 char inChar = 'a';

 printf("您好,\n");
 printf("inChar的內容值目前為: %c \n", inChar);
}

按CTRL+F5運行,可看到以下畫面:


程式解說:
  • #4行為變數宣告。在此我們宣告了一個字元(char)變數,其名為inChar,初始值為字元'a'。要注意的是字元變數僅能儲存一個字元。
  • 我們可以發現以下的事情:
    • printf()有兩種不一樣的格式:
      • A. printf("輸出字串");
      • B. printf("輸出字串%c", 字元變數);
    • 其中,內埋在字串中的%c,意指將第二個參數視為字元變數,並具體呈現出插進字串的位置。
請確實吸收這兩種不同格式的printf()用法,之後進行下一步。

STEP #2:

將main.cpp的內容修改如下:
*請注意,#9行使用了新的函數scanf(),請確實輸入一次#9行,並注意到該行尾端的inChar變數前方有個&符號(and)!

#include <stdio.h>

void main(){
 char inChar = 'a';

 printf("您好,\n");
 printf("inChar的內容值目前為: %c \n", inChar);
 printf("請輸入新的字元,輸入完畢請按Enter鍵\n");
 scanf("%c",&inChar);
 printf("更新後的inChar的內容值為: %c \n", inChar);
}

程式解說:

  • #9行是典型的以scanf進行單字元輸入語句。第一個參數"%c"代表將使用者的輸入視為字元character。第二個參數代表將獲得的字元存入inChar的記憶體位置上。
  • 由上我們可以知:在程式中,inChar指的是inChar變數內容值;而&inChar指的是inChar變數的記憶體位置。有沒有那個&符號是相差非常大的。
  • 注意scanf()的第二個參數一定要加上&符號,否則程式運行會報錯。

測試一下,確認字元輸入與字串輸出功能正常。

STEP #3:

修改程式碼:
*此處使用兩撇斜線(slash,注意是從右上畫到左下),也就是單行註解格式,將#9行註解掉。如此一來#9行就不會執行。

#include <stdio.h>

void main(){
 char inChar = 'a';

 printf("您好,\n");
 printf("inChar的內容值目前為: %c \n", inChar);
 printf("請輸入新的字元,輸入完畢請按Enter鍵\n");
 //scanf("%c",&inChar);
 inChar = getchar();
 printf("更新後的inChar的內容值為: %c \n", inChar);
}

程式解說:

  • getchar()函數可讓玩家從主控台輸入一個字元,並將輸入的字元返還(return)回來。
  • 使用inChar = getchar(),即可使用inChar承接前述返還回來的字元。注意這裡不需要再加&符號了。

運行一下,確認功能與前面的做法相同。完工!

===================

這節課我們學會了字元的輸入,在下一節課中,我們會使用你會的東西來製作<文字冒險AVG>遊戲,敬請期待!