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. 打 彈 珠
....
C++黑框小遊戲
By lee-yi-xing
C++黑框小遊戲
- 1,887