C++基于easyx實(shí)現(xiàn)迷宮游戲
更新時間:2022年05月11日 13:01:50 作者:Object_in_java
這篇文章主要為大家詳細(xì)介紹了C++基于easyx實(shí)現(xiàn)迷宮游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實(shí)例為大家分享了C++基于easyx實(shí)現(xiàn)迷宮游戲的具體代碼,供大家參考,具體內(nèi)容如下
/*走迷宮*/ #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//由于當(dāng)前素材只有左右二個方向,所以上下共用了左右方向 #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 };//當(dāng)前動作序號 int direction;//上下左右四個方向 int human_witdh; int human_height; int x, y;//x列數(shù),y行數(shù) 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);?? ? ?? ?//先顯示背景 ?? ?//準(zhǔn)備好遮罩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; ?? ?/******異步輸入檢測方向鍵狀態(tài) ?? ?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)//到達(dá)了出口 ?? ??? ?{ ?? ??? ??? ?outtextxy(0, 0, _T("reach target!")); ?? ??? ??? ?Sleep(50); ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?updateWithoutInput(); ?? ??? ?updateWithInput(); ?? ?} ?? ?EndBatchDraw(); ?? ?_getch(); ?? ?closegraph(); ?? ?return 0; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于一個簡單定長內(nèi)存池的實(shí)現(xiàn)方法詳解
本篇文章對一個簡單定長內(nèi)存池的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05C++?獲取當(dāng)前正在運(yùn)行函數(shù)的名稱
本文主要介紹了C++獲取當(dāng)前正在運(yùn)行函數(shù)的名稱,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04探討:用兩個棧實(shí)現(xiàn)一個隊(duì)列(我作為面試官的小結(jié))
作為面試官的我,經(jīng)常拿這道用兩個棧實(shí)現(xiàn)一個隊(duì)列的面試題來考面試者,通過對面試者的表現(xiàn)和反應(yīng),有一些統(tǒng)計(jì)和感受,在此做個小結(jié)2013-05-05C++ 中pragma once 與 #ifndef _XXX_H_ #define _XXX_H_的區(qū)別
這篇文章主要介紹了C++ 中pragma once 與 #ifndef _XXX_H_ #define _XXX_H_的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-04-04