C++基于easyx实现迷宫游戏

本文实例为大家分享了C++基于easyx实现迷宫游戏的具体代码,供大家参考,具体内容如下

/*走迷宫*/
#define _CRT_SECURE_NO_DEPRECATEd
#define _CRT_SECURE_NO_WARNINGS

#include<graphics.h>
#include<conio.h>
#include<Windows.h>
#include<stdio.h>
#define LEFT            0//方向
#define RIGHT            1
#define UP            0//由于当前素材只有左右二个方向,所以上下共用了左右方向
#define DOWN            1

#define ROAD 0//地图元素类型
#define WALL 1

#define ENTERX 1//入口  x列,y行
#define ENTERY 0

#define OUTX 11 //出口 x列,y行
#define OUTY 8

#define HUMANWIDTH        75
#define HUMANHEIGHT        130

#define WIDTH            12//地图大小
#define HEIGHT            10

IMAGE img_human;
IMAGE img_human_mask;
IMAGE img_wall;
IMAGE img_road;

int moveNum[2] = { 0 };//当前动作序号
int direction;//上下左右四个方向
int human_witdh;
int human_height;
int x, y;//x列数,y行数

int map[HEIGHT][WIDTH] = {//地图
    { 1,1,1,1,1,1,1,1,1,1,1,1 },
    { 0,0,0,1,1,1,1,1,1,1,1,1 },
    { 1,1,0,1,1,1,1,0,1,1,1,1 },
    { 1,1,0,0,1,1,1,0,1,1,1,1 },
    { 1,1,1,0,1,1,1,0,1,1,1,1 },
    { 1,1,1,0,1,1,1,0,1,1,1,1 },
    { 1,1,1,0,1,1,1,0,1,1,1,1 },
    { 1,1,1,0,0,0,0,0,0,0,1,1 },
    { 1,1,1,1,1,1,1,1,1,0,0,0 },
    { 1,1,1,1,1,1,1,1,1,1,1,1 },
};

void showbk() {//绘制背景
    for (int j = 0; j < WIDTH; j++)
        for (int i = 0; i < HEIGHT; i++)
            if (map[i][j] == WALL)
                putimage(j * img_wall.getwidth(), i * img_wall.getheight(), img_wall.getwidth(), img_wall.getheight(), &img_wall, 0, 0, SRCCOPY);
            else putimage(j * img_wall.getwidth(), i * img_wall.getheight(), img_wall.getwidth(), img_wall.getheight(), &img_road, 0, 0, SRCCOPY);

}
void start()//初始化
{
    loadimage(&img_wall, _T(".\\walls.gif"));
    initgraph(img_wall.getwidth() * WIDTH, img_wall.getheight() * HEIGHT);
    loadimage(&img_human, _T(".\\行走素材图.jpg"));
    loadimage(&img_human_mask,_T( ".\\行走素材图mask.jpg"));

    human_witdh = 75;//img_human.getwidth()/4;
    human_height = 130;//img_human.getheight()/2;
                       //putimage(x,y,HUMANWIDTH,HUMANHEIGHT,&img_human,0,0);
    loadimage(&img_road, _T(".\\road.gif"));
    x = 0;
    y = 1;

}

void updateWithoutInput()
{

}
void drawRole(int x0, int y0)//绘制前景
{
    putimage((x - x0 / 4.0) * img_wall.getwidth() - 7,
        (y - y0 / 4.0) * img_wall.getheight() - 70,
        human_witdh, human_height, &img_human_mask, moveNum[direction] * human_witdh, direction * (human_height - 10), NOTSRCERASE);
    putimage((x - x0 / 4.0) * img_wall.getwidth() - 7,
        (y - y0 / 4.0) * img_wall.getheight() - 70,
        human_witdh, human_height, &img_human, moveNum[direction] * human_witdh, direction * (human_height - 10), SRCINVERT);
}
void show(int x0, int y0)
{

    showbk();
    //clearrectangle(x,y,x+human_witdh,y+human_height);    
    //先显示背景
    //准备好遮罩MASK图和源图,三元光栅操作
    drawRole(x0, y0);
    FlushBatchDraw();
    Sleep(50);
}
void readRecordFile()
{//读取存档
    FILE* fp;
    int temp;
    fp = fopen(".\\record.dat", "r");
    fscanf(fp, "%d %d", &x, &y);
    fclose(fp);

}
void WriteRecordFile()
{//保存存档
    FILE* fp;
    int temp;
    fp = fopen(".\\record.dat", "w");
    fprintf(fp, "%d %d ", x, y);
    fclose(fp);
}
void updateWithInput()
{//增加过度
    char input;
    int olddirection = direction;
    int oldx = x;
    int oldy = y;
    /******异步输入检测方向键状态
    if(GetAsyncKeyState(VK_LEFT)&0x8000)  向左
    if(GetAsyncKeyState(VK_RIGHT)&0x8000)  向右
    if(GetAsyncKeyState(VK_UP)&0x8000)  向上
    if(GetAsyncKeyState(VK_DOWN)&0x8000)  向下
    ********/
    if (_kbhit())
    {

        input = _getch();
        switch (input)
        {
        case 'a':direction = LEFT;        if (map[y][x - 1] == ROAD) x--; moveNum[direction] = 0; break;
        case 'd':direction = RIGHT;        if (map[y][x + 1] == ROAD) x++; moveNum[direction] = 0; break;
        case 'w':direction = UP;        if (map[y - 1][x] == ROAD) y--; moveNum[direction] = 0; break;
        case 's':direction = DOWN;        if (map[y + 1][x] == ROAD) y++; moveNum[direction] = 0; break;
        case 'W':WriteRecordFile(); break;
        case 'R':readRecordFile(); break;
        }
        if (x != oldx || y != oldy)
            for (int i = 4; i > 0; i--)
            {//过渡动画
                show((x - oldx) * i, (y - oldy) * i);
                moveNum[direction]++;//动作序号,一个完整动作分解为四个姿势
                moveNum[direction] %= 4;
            }
    }
}

int main()
{
    start();
    BeginBatchDraw();
    while (1) {
        show(0, 0);
        Sleep(50);
        if (x == OUTX && y == OUTY)//到达了出口
        {
            outtextxy(0, 0, _T("reach target!"));
            Sleep(50);
            break;
        }
        updateWithoutInput();
        updateWithInput();
    }
    EndBatchDraw();
    _getch();
    closegraph();
    return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 使用C++实现迷宫游戏

    迷宫游戏就是玩家在地图中移动,移动至终点则游戏结束. 自己用文本文档手打了个小地图,0表示空白,1表示墙,文件名随意,我改成了map.MapData.然后程序里定义一个全局变量char Map[MapLenX][MapLenY];(长宽自定义)行为X,列为Y.定义char型常量RoadSymbol = '0', WallSymbol = '1', PlayerSymbol = '+'. 本游戏为面向对象编写的,所以就要设计一个类.数据需要一个坐标和一个bool型储存是否到达终点.所以自定义了个结

  • C++基于prim实现迷宫生成

    本文实例为大家分享了C++实现迷宫生成的具体代码,供大家参考,具体内容如下 只用到了c++中的vector,其余的和纯C差别不大,纯C可能需要手动弄一个vector太繁琐了不太想弄. 看了迷宫的一些算法,prim还是比较好看的,网上的代码python c#居多,而且不太容易搞懂,那我在这里用C++(大部分C)实现了这个目的 prim算法:随机Prim算法生成的迷宫岔路较多,整体上较为自然而又复杂,算法核心为(根据维基百科). 1.让迷宫全是墙. 2.选一个单元格作为迷宫的通路(我一般选择起点),

  • C++实现迷宫算法实例解析

    本文以实例形式描述了C++实现迷宫算法.本例中的迷宫是一个矩形区域,它有一个入口和一个出口.在迷宫的内部包含不能穿越的墙或障碍.障碍物沿着行和列放置,它们与迷宫的矩形边界平行.迷宫的入口在左上角,出口在右下角 本实例迷宫算法的功能主要有: 1.自动生成10*10迷宫图 2.判断是否有迷宫出口,并且画出路线图 具体实现代码如下: # include <iostream> # include <list> # include <sys/timeb.h> # include

  • C++控制台实现随机生成路径迷宫游戏

    本程序是在控制台下随机生成迷宫路径的一个C++程序,可以通过修改宏定义 M 和 N 的值来修改迷宫的长度和宽度,运行程序后 按1开始游戏 按2退出游戏,游戏入口在左上角,出口在右下角,人物(星星)到达右下角出口提示成功闯关. #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #include<iostream.h> #include<ctime

  • 使用C/C++语言生成一个随机迷宫游戏

    迷宫相信大家都走过,毕竟书本啊啥啥啥的上面都会有迷宫,主要就是考验你的逻辑思维.那么我们学习C/C++也是需要学习到逻辑思维方式的,那今天我就来分享一下,如何用C/C++打造一个简单的随机迷宫游戏.(代码的话我只截取了如何创建迷宫的代码,如果想要全套代码的话可以加群:558502932,群内有很多C/C++学习资料提供学习,大家一起交流进步) 完整版的迷宫游戏效果如下: 代码如下: //创建迷宫 void CreateMaze(int x,int y) { //定义4个方向 int dir[4]

  • C++实现随机生成迷宫地牢

    可以用这个地图核心做成一个无限迷宫类的游戏 main.cpp // Author: FreeKnight 2014-09-02 #include "stdafx.h" #include <iostream> #include <string> #include <random> #include <cassert> /* 简单逻辑流程描述: 将整个地图填满土 在地图中间挖一个房间出来 选中某一房间(如果有多个的话)的墙壁 确定要修建某种新

  • C++实现迷宫小游戏

    介绍 本程序是根据广度优先遍历算法的思想设计的一款迷宫游戏,游戏设计了两种模式一种自动游戏模式,一种手动模式.因为项目在 Linux 开发,需要在 Windows 开发的,请查看源代码中需要修改地方的备注. 截图 代码 #include <iostream> #include <cstdlib> //标准库 #include <unistd.h> //延时函数 #include <stdio.h> //getchar #include <ctime&g

  • C++ 迷宫游戏实现代码

    C++ 迷宫游戏实现代码 题目 通过让游戏角色自动寻找迷宫出口,走出迷宫,来练习C++面向对象之封装的基础知识.迷宫图如下所示,其中X表示墙. 1.程序分析 走出去的原理:遵循右手规则或左手规则.右手扶墙走,就会走出迷宫,反之,亦然. step1 创建迷宫类,打印出迷宫地图. step2 创建走迷宫的人的类. 2.程序实现 MazeMap.h #ifndef MAZEMAP_H #define MAZEMAP_H #include <iostream> #include <Windows

  • C++实现简单走迷宫的代码

    本文实例为大家分享了C++实现走迷宫的具体代码,供大家参考,具体内容如下 用n*n个小方格代表迷宫,每个方格上有一个字符0或1,0代表这个格子不能走,1代表这个格子可以走.只能一个格子一个走,而且只能从一个格子向它的上.下.左.右四个方向走,且不能重复.迷宫的入口和出口分别位于左上角和右下角,存在唯一的一条路径能够从入口到达出口,试着找出这条路径. 例如,下图是一个迷宫,红色表示走出迷宫的一条路径 输入:入口坐标(startX,startY),出口坐标(endX,endY) 输出:如果存在这样一

  • C++自动生成迷宫游戏

    本文实例为大家分享了C++实现迷宫游戏的具体代码,供大家参考,具体内容如下 运用并查集自动生成迷宫地图,并运用队列和栈寻找迷宫通路并打印出来 #include<stdlib.h> #include<iostream> #include<time.h> #include<queue> #include<stack> using namespace std; using std::queue; using std::stack; typedef st

随机推荐