C++ 小遊戲

自我介紹

  • 李易馨
  • 景資28程式教學
  • 別人的學術力都是C++,我不一樣
    我是低音銅管吐巴 && 八里東

C++ 小遊戲

課程目的

利用小黑框寫簡單小遊戲【黑框遊戲】

提升成就感 + 實用性

進入遊戲世界的初步入門

C++ 小遊戲

1.  簡單複習C++基本語法

2. 自定義函式 + struct

3. 黑框遊戲常用的指令

4. 實作兩款黑框遊戲

5. 延伸學習與思考

C++ 小遊戲

簡單複習

C++基本語法

C++ 小遊戲

引入函式庫

#include<iostream>

注釋

// 這是一行不會被編譯的注釋

C++ 小遊戲

變數

int 

char

整數

字元

C++ 小遊戲

if-else

if(條件句){

	//執行的程式碼
    
}else if(條件句){

	//執行的程式碼
    
}else{

	//執行的程式碼
    
}

C++ 小遊戲

for迴圈

for ( int i = 0 ; i < n ; i++){

	//執行的程式碼

}

執行 n 次

C++ 小遊戲

while

 

while(條件句){

	//執行的程式碼

}
while(1){

	//執行的程式碼

}

無窮迴圈

while迴圈

記得設置出口

C++ 小遊戲

一維陣列


int game_map[4] = {0,1,2,3};

二維陣列


char game_map[2][4] = {{'a','b','c'},{'d','e','f'}};

C++ 小遊戲


char maze[2][4] = { 'A','b','c',
                    'D','e','f',
                  };
                   

一串有幾個

一共有幾串

C++ 小遊戲

如果還是聽不懂的話....

就直接把二維陣列開超大就好

C++ 小遊戲

自定義函式

struct

switch-cass

自定義函式

1. 把功能分開寫,比較不容易搞混,除錯也方便

2. 可以用簡單的一行程式重複執行多行程式碼

把功能獨立開來寫

回傳值型態 函數名稱(參數型態_1 參數名稱_1 , 參數型態_2 參數名稱_2 ...){
    函數功能程式碼
    return 回傳值
}
void player_act(char a){
    if(a=='w') cout << "It is a W " ;
    else if(a=='a') cout << "It is a A " ;
    else if(a=='s') cout << "It is a S " ;
    else if(a=='d') cout << "It is a D " ;
    else cout << "I don't know. ";
}

void:不回傳值

自定義函式使用

自定義函式使用

#include<iostream>
using namespace std;

void player_act(char a){
    if(a=='w') cout << "It is a W " ;
    else if(a=='a') cout << "It is a A " ;
    else if(a=='s') cout << "It is a S " ;
    else if(a=='d') cout << "It is a D " ;
    else cout << "I don't know. ";
}

int main(){
    char a;
    cin >> a ;
    player_act(a);
}

struct【結構】

1. 結構是宣告一個新的資料型態(變數)喔喔

2. 使變數之間的關聯變得更直接

宣告一個新的變數型態

把變數們綁在一起使用

struct【結構】

#include<iostream>
using namespace std;

struct fron{
	int x ;
	int y ;
};

/* 要使用時:

    player.x;
    player.y;
    
*/

創造一個新的變數型態 叫 fron

這個新的變數型態裡面所含有的值

分號

分號

分號

#include<iostream>
using namespace std;

struct fron{
	int x ;
	int y ;
};

int main(){
    fron player ;
    player.x = 1;
    player.y = 1;
    cout << player.x;
}

宣告 fron 型態的變數 player

使用 player 的值

struct【結構】

#include<iostream>
using namespace std;

struct fron{
	int x ;
	int y ;
};

int main(){
    fron player ;
    player.x = 1;
    player.y = 1;
    cout << player.x;
}

----------中規中矩版----------

struct【結構】

#include<iostream>
using namespace std;

struct fron{
	int x = 1;
	int y = 1;
}player;

int main(){
    cout << player.x;
}

----------修簡奢華壽司版---------

宣告 fron 型態的變數 player

struct【結構】

switch-case

【條件判斷】

更為雅潔的 if - else 

1. 更簡潔明瞭、值觀

2. 有時候狀況會比較多,如果用case可以更好的比較

switch-case

switch(變數名稱或運算式) {
    case 條件一:
        陳述句一;
        break;
    case 條件二:
        陳述句二;
        break;
    default:
        陳述三;
        break;
}
if(條件__1) {
	執行程式
}
else if(條件__2){
	執行程式
}
else{

}

一定要有break!!!

沒有break 他會無視條件(case)一路執行下去

switch-case

有break 沒break的比較例子

#include<iostream>
using namespace std;

int main(){
    int a ;
    cin >> a;
    switch(a){
        case 1 : 
            cout << "It is a 1" << endl; 
            break;
            
        case 2 : 
            cout << "It is a 2" << endl; 
            break;
            
        default : 
            cout << "It is not 1 or 2" << endl; 
            break;
    }
}

自定義函式

struct

switch-case

練習時間

練習時間

自己去摸索玩

試著做出以下功能

主角定位(1,1)

每按一次'w', 'a', 's', 'd'就輸出一次新的座標位置

小測驗

1. 宣告一個 struct 儲存主角的 x, y

主角定位(1,1)

每按一次'w', 'a', 's', 'd'就輸出一次新的座標位置

2. 利用while的無窮迴圈讓玩家可以一直輸入

3. 利用 switch - case 弄出玩家的x, y變化

4. 用自定義函式包起來

5. 輸出

 player 的 x , y 移動示意圖

#include<bits/stdc++.h>
using namespace std;

struct play{
    int x = 1;
    int y = 1;
}player;

void move_act(char a){
    switch(a){
        case 'w' :
            player.y--;
            break;
        case 'a' :
            player.x--;
            break;
        case 's' :
            player.y++;
            break;
        case 'd' :
            player.x++;
            break;
    }
}

int main(){
    cout << "(" << player.x << " , " << player.y << ")" << endl;
    char a;
    while(cin >> a){
        move_act(a);
        cout << "(" << player.x << " , " << player.y << ")" << endl;
    }
}

C++ 小遊戲

黑框遊戲常用的指令

黑框遊戲常用指令

讀取任意鍵

按下任意鍵以開始遊戲

getch();

---------------函式庫--------------

#include<conio.h>

(不用按下enter就可以直接讀取)

清空螢幕

開始畫面 --> 遊戲地圖

system("cls");

---------------函式庫--------------

#include<stdlib.h>

黑框遊戲常用指令

system( )

system("cls");
system("pause");
system("start");

清空小黑框

暫停

開啟/執行檔案

黑框遊戲常用指令

輸出字串

一行一行輸出地圖

puts();

---------------函式庫--------------

#include<stdio.h>

黑框遊戲常用指令

暫停執行

逐格動畫的效果

Sleep(毫秒);

---------------函式庫--------------

#include<unistd.h>

黑框遊戲常用指令

暫停執行

逐格動畫的效果

Sleep(毫秒);

---------------函式庫--------------

#include<unistd.h>

黑框遊戲常用指令

黑框遊戲常用指令

句柄

windows 不希望我們碰到的機密指令文件

但是我們又有需求

藉由操控句柄來整坨控制

裡面的機密程式碼

C++ 小遊戲

黑框遊戲一、走迷宮

黑框遊戲一、走迷宮

遊戲展示

第一部分

遊戲設計

# 引入該引入的函式庫
using namespacee std;

// 設計地圖
// 設定玩家
// 設定【移動】功能 ( switch - case )
    // 移動就是變更 ( x, y ) , 地圖[y][x] = 玩家; 
    // 然後清空畫布再輸出一次地圖

int main(){
    // 設定玩家初始位置
    // 輸出地圖
    while(1){
    	// 得到玩家字元
    	// 【移動】
        // 每次移動都要清空畫布重畫地圖
    	// 如果 移動到終點 則 break;
    }
    // 輸出"你贏了"  
}

走迷宮 功能提示目錄

第二部分

畫地圖

'O' 是 玩家

'#' 是 牆壁

'  ' 是 道路

char play_map[100][100]={"#####################",
                         "#o#    #######      #",
                         "# ####         ## ###",
                         "# #    ### ### ## ###",
                         "# # ###### ### ## ###",
                         "# # ###### ##########",
                         "#                    ",
                         "#################### ",};

第三部分

設定玩家

每次移動就是動 player 的 x , y

 player 的 x , y 移動示意圖

第四部分

設計 行動

void movement(char move_letter){
      switch(move_letter){
          case 'w' :
          case 'a' :
          case 's' :
          case 'd' :
      }
}

判斷前方是否為路  是的話則

在地圖的[x][y]更新上玩家的符號

原本的位置清空

第四部分

設計 行動

判斷前方是否為路  是的話則

在地圖的[x][y]更新上玩家的符號

原本的位置清空

//以【玩家按下'W'】舉例
   case 'w' :
     if(play_map[player.y-1][player.x]==' '){
         play_map[player.y][player.x] = ' ';//當前位置為空
         player.y--;//向上移動
         play_map[player.y][player.x] = 'o';//當前位置為玩家
     }
//清空畫布
for(int i = 0; i<=7 ; i++){
     puts(play_map[i]) ;
}

第五部分

輸出 地圖

每次移動(更新)完地圖後

就要先把畫面清空

重新刷出一次地圖

第六部分

完整程式碼

走迷宮 遊戲優化目錄

走迷宮 遊戲優化

開始畫面

閃屏問題

為什麼會閃屏?

屏幕清空後來不及畫

閃屏問題

#include<windows.h>

補充 windows 函數

void Set()//把每次光標移動到初始位置
{
    HANDLE hOut;
    COORD pos={0,0};//設置控制台光標位置回到 ( 0, 0 )【之後才能打印地圖】
    hOut = GetStdHandle(STD_OUTPUT_HANDLE);//得到 標準輸出的句柄
    SetConsoleCursorPosition(hOut,pos);
    CONSOLE_CURSOR_INFO cursorInfo = {1, FALSE};//把光標關掉
    SetConsoleCursorInfo(hOut, &cursorInfo);
}

解決光標問題

閃屏問題

補充 windows 函數

補充:改小黑框的名字

閃屏問題

補充 windows 函數

重設遊戲

新功能:按下 " f " 鍵把遊戲重製

把 player.x 、player.y 回歸最初位

第十部分

完整程式碼

C++ 小遊戲

黑框遊戲二、推箱子

黑框遊戲二、推箱子

根據走迷宮改造的小遊戲

1.  地圖設置不一樣

'O'  '0' 是 箱子

'#' 是 牆壁

'  ' 是 道路

'S' 是 玩家

2.  動作判斷更麻煩

判斷前方是否為路  是的話則

在地圖的[x][y]更新上玩家的符號

原本的位置清空

推箱子

case w :  

if ( 前方為空 ) 則往前走

else if ( 前方有箱子 )

          if ( 箱子前方為空格 ) 角色帶著箱子往前一格

          else if ( 箱子前方為目的地 )

     箱子形象變化 + 角色位置不變

                   完成箱子數++

3.  遊戲勝利的條件

player.x 與 player.y

是否達到目的地的x , y 座標

原本

推箱子

完成箱子數是否達到箱子總數

遊戲設計

# 引入該引入的函式庫
using namespacee std;

// 設計地圖
// 設定玩家
// 設定【移動】功能 ( switch - case )
       // if ( 前方為空 ) 則走
       // else if ( 前方有箱子 )
         /*
            if ( 箱子前方為空格 ) 角色帶著箱子往前一格
            else if ( 箱子前方為目的地 )
            箱子形象變化 + 角色位置不變 + 完成箱子數++
         */
         
int main(){
    // 設定玩家初始位置
    // 輸出地圖
    while(1){
    	// 得到玩家字元
    	// 【移動】
        // 每次移動都要清空畫布重畫地圖
    	// 如果 箱子數量達標 則 break;
    }
    // 輸出"你贏了"  
}

合併

完整程式碼

C++ 小遊戲

延伸思考

回  顧

遊戲的繼續改良

1. 設置更多關卡【甚至可以選關】

2. 把兩個小遊戲合併再一起,讓人可以選擇

3. 用聰明的方法製作更大型地圖

4. 畫面美觀【把畫面置中、牆壁用不同的顏色...】

5. 聽說python可以用不到一百行就寫出差不多的效果 ( ?

黑框遊戲的繼續發展

1.  黑框RPG

2. 貪  吃  蛇

3. 射擊遊戲

4. 打  彈  珠

....

Made with Slides.com