问题标题: 游戏开发教程

5
0
已解决
被禁言 马博闻
马博闻
初级守护
初级守护

注:本教程会教你开发一个简单的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. ..... 


0
1
0
0
0
我要回答