

初级守护
注:本教程会教你开发一个简单的C++小游戏《走迷宫》(原作在酷丁平台)
同时它也可以帮助你开发其他的C++游戏
建议在学完酷丁堂语法之后再阅读
一.游戏中可能用到的头文件和函数
详见《新手的福利》一贴
代码如下:
//头文件
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include <unistd.h>
#include <windows.h>
//函数
int random(int min, int max) {//随机函数
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
srand((time_t)ts.tv_nsec);
return min + rand() % (max - min + 1);
}
char key1(){//键盘检测函数
return getch();
}
二.游戏的基本逻辑:
1.定义
定义玩家结构体,玩家饥饿,地图
示例代码:
struct pla{
int x,y;//map[x][y]
}pl;
int ge=100; //饥饿
string map[25][25];//地图
2.地图生成
我们一般直接使用random()函数来生成地图,具体方式如下
遍历地图
对于每个格子:有1/4机率为障碍
示例代码:
for(int i=1;i<=20;i++){
for(int j=1;j<=20;j++){
if(random(1,100)%4==0)map[i][j]="##";
else map[i][j]=" ";
}
}
map[20][20]=" M";//终点
pl.x=1,pl.y=1; //玩家位置
3.游戏主循环
在主循环中,玩家将在饥饿耗尽前到达终点,否则失败。
首先是输出地图与玩家:
我们使用双for循环:
system("cls");
cout<<"体力:"<<tl<<endl;
for(int i=1;i<=20;i++){
for(int j=1;j<=20;j++){
if(pl.x==i&&pl.y==j)cout<<"Yo";//玩家
else cout<<map[i][j];
}
cout<<endl;
}
我们需要先编写玩家的移动模块//移动模块在许多游戏中都会被用到
首先探测键盘输入:char cho=key1();
然后就是判断玩家是否在地图内(pl.x>1),他的下一步是否没有障碍(map[pl.x-1][pl.y]!="##")
if(cho=='w'&&map[pl.x-1][pl.y]!="##"&&pl.x>1) pl.x--;
完整代码如下:
char cho=key1();
if(cho=='w'&&map[pl.x-1][pl.y]!="##"&&pl.x>1) pl.x--;
if(cho=='s'&&map[pl.x+1][pl.y]!="##"&&pl.x<20)pl.x++;
if(cho=='a'&&map[pl.x][pl.y-1]!="##"&&pl.y>1) pl.y--;
if(cho=='d'&&map[pl.x][pl.y+1]!="##"&&pl.y<20)pl.y++;
然后是胜利/失败判断
首先更新体力:ge--;
然后判断体力==0:
if(ge==0){
cout<<"You lose!";
return 0;
}
然后判断玩家是否到达终点:
if(pl.x==20&&pl.y==20){
cout<<"You win!";
return 0;
}
4.组合代码
整合我们写过的代码,我们可以得到完整的游戏
//头文件
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include <unistd.h>
#include <windows.h>
using namespace std;
//函数
int random(int min, int max) {//随机函数
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
srand((time_t)ts.tv_nsec);
return min + rand() % (max - min + 1);
}
char key1(){//键盘检测函数
return getch();
}
struct pla{
int x,y;//map[x][y]
}pl;
int ge=100; //饥饿
string map[25][25];//地图
int main(){
for(int i=1;i<=20;i++){
for(int j=1;j<=20;j++){
if(random(1,100)%4==0)map[i][j]="##";
else map[i][j]=" ";
}
}
map[20][20]=" M";//终点
pl.x=1,pl.y=1; //玩家位置
while(true){
system("cls");
cout<<"体力:"<<tl<<endl;
for(int i=1;i<=20;i++){
for(int j=1;j<=20;j++){
if(pl.x==i&&pl.y==j)cout<<"Yo";//玩家
else cout<<map[i][j];
}
cout<<endl;
}
char cho=key1();
if(cho=='w'&&map[pl.x-1][pl.y]!="##"&&pl.x>1) pl.x--;
if(cho=='s'&&map[pl.x+1][pl.y]!="##"&&pl.x<20)pl.x++;
if(cho=='a'&&map[pl.x][pl.y-1]!="##"&&pl.y>1) pl.y--;
if(cho=='d'&&map[pl.x][pl.y+1]!="##"&&pl.y<20)pl.y++;
if(ge==0){
cout<<"You lose!";
return 0;
}
if(pl.x==20&&pl.y==20){
cout<<"You win!";
return 0;
}
}
return 0;
}
三.优化:
你会发现在极少数地图下玩家不可能到达终点(体力不够或地图被堵住),
我们可以使用更先进的地图生成策略
同时代码还有许多可以优化升级的地方,比如:
1.添加地图的颜色
2.为游戏添加一个大厅
3.添加一个“存档”功能,记录玩家的胜利/失败数
4.可以调整的地图大小
5. .....