服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++基于easyx实现迷宫游戏

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

2022-11-28 11:52Object_in_java C/C++

这篇文章主要为大家详细介绍了C++基于easyx实现迷宫游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/*走迷宫*/
#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;
}

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

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

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

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

原文链接:https://blog.csdn.net/m0_45311187/article/details/121054431

延伸 · 阅读

精彩推荐
  • C/C++C语言memset函数详解

    C语言memset函数详解

    这篇文章主要介绍了C语言中的memset()函数,包括其与memcpy()函数的区别,需要的朋友可以参考下,希望能够给你带来帮助...

    竹一笔记5392022-01-10
  • C/C++C/C++ QT实现自定义对话框的示例代码

    C/C++ QT实现自定义对话框的示例代码

    对话框分为多种,常见的有通用对话框,自定义对话框,模态对话框,非模态对话框等,本文主要介绍了QT自定义对话框,感兴趣的可以了解一下...

    lyshark9102022-03-03
  • C/C++纯C语言:折半查找源码分享

    纯C语言:折半查找源码分享

    这篇文章主要介绍了纯C语言:折半查找源码,有需要的朋友可以参考一下...

    C语言教程网5792021-01-13
  • C/C++详解C语言初阶基础(2)

    详解C语言初阶基础(2)

    这篇文章主要介绍了C语言中的初阶基础,介绍了其相关概念,具有一定参考价值。需要的朋友可以了解下,希望能够给你带来帮助...

    鲸落之·海6762022-02-22
  • C/C++C 语言编程中的五个常见错误及对应解决方案

    C 语言编程中的五个常见错误及对应解决方案

    C 语言有时名声不太好,因为它不像近期的编程语言(比如 Rust)那样具有内存安全性。但是通过额外的代码,一些最常见和严重的 C 语言错误是可以避免的。...

    Linux中国12222021-10-19
  • C/C++C++中关于互斥量的全面认知

    C++中关于互斥量的全面认知

    线程的主要优势在于,能够通过全局变量来共享信息。不过,这种便捷的共享是有代价的:必须确保多个线程不会同时修改同一变量,或者某一线程不会读...

    Gy6485582022-11-25
  • C/C++简要对比C语言中的setgid()函数和setregid()函数

    简要对比C语言中的setgid()函数和setregid()函数

    这篇文章主要介绍了C语言中的setgid()函数和setregid()函数的简要对比,是C语言入门学习中的基础知识,需要的朋友可以参考下...

    C语言教程网11742021-03-09
  • C/C++C语言实现高精度加减法

    C语言实现高精度加减法

    这篇文章主要为大家详细介绍了C语言实现高精度加减法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Grayson_Hunt11132021-11-04