




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、迷宮程序。執(zhí)行效果如下:程序間有足夠多的注釋,就不多作介紹了。代碼如下:/ 程序名稱:迷宮 游戲/ 編譯環(huán)境:Visual C+ 6.0 / 2010,EasyX 2011驚蟄版/ 作者:krissi <zhaoh1987>/ 最后修改:2011-3-12/#include <graphics.h>#include <conio.h>#include <time.h>/ 定義全局變量/BYTE*g_imgMap = NULL;/ 迷宮地圖SIZEg_szMap;/ 迷宮地圖的尺寸IMAGEg_imgSight(360, 280);/ 游戲的視野R
2、ECTg_rtSight;/ 游戲的視野的范圍IMAGEg_imgItem(180, 20);/ 地圖元素IMAGEg_imgGPS;/ 迷你地圖,用于顯示游戲者在地圖中的位置POINTg_ptGPS;/ 迷你地圖的顯示位置SIZEg_szGPS;/ 迷你地圖的尺寸POINTg_ptPlayer;/ 游戲者的位置/ 枚舉地圖元素,兼做元素位置的 x 坐標(biāo)enum MAPITEM MAP_WALL = 0, MAP_PLAYER = 20, MAP_GROUND = 40, MAP_MARKRED = 60, MAP_MARKGREEN = 80, MAP_MARKYELLOW = 100, M
3、AP_ENTRANCE = 120, MAP_EXIT = 140, MAP_OUTSIDE = 160 ;/ 枚舉用戶的控制命令enum CMD CMD_QUIT = 1, CMD_UP = 2, CMD_DOWN = 4, CMD_LEFT = 8, CMD_RIGHT = 16, CMD_MARKRED = 32, CMD_MARKGREEN = 64, CMD_MARKYELLOW = 128, CMD_CLEARMARK = 256 ;/ 函數(shù)聲明/voidWelcome();/ 繪制游戲界面voidInitImage();/ 初始化游戲圖片voidInitGame();/ 初始化游
4、戲數(shù)據(jù)voidGetMazeSize();/ 提示用戶輸入迷宮大小voidMakeMaze(int width, int height);/ 生成迷宮:初始化(注:寬高必須是奇數(shù))voidTravelMaze(int x, int y);/ 生成迷宮:遍歷 (x, y) 四周MAPITEMGetMazeItem(int x, int y);/ 獲取指定坐標(biāo)的迷宮元素voidPaint();/ 繪制視野范圍內(nèi)的迷宮intGetCmd(int* c);/ 獲取用戶輸入的命令voidDispatchCmd(int cmd);/ 處理用戶輸入的命令voidOnUp();/ 向上移動(dòng)voidOnLeft
5、();/ 向左移動(dòng)voidOnRight();/ 向右移動(dòng)voidOnDown();/ 向下移動(dòng)voidOnMark(MAPITEM value);/ 在地圖中做標(biāo)記boolCheckWin();/ 檢查是否到出口boolQuit();/ 詢問(wèn)用戶是否退出游戲/ 函數(shù)定義/ 主程序void main()/ 初始化initgraph(640, 480);/ 創(chuàng)建繪圖窗口srand(unsigned)time(NULL);/ 設(shè)置隨機(jī)種子/ 顯示主界面Welcome();/ 初始化InitImage();InitGame();/ 游戲過(guò)程int c;while( !(GetCmd(&c)
6、= CMD_QUIT) && Quit() )DispatchCmd(c);Paint();if (CheckWin()break;/ 延時(shí)Sleep(100);/ 清理迷宮地圖占用的內(nèi)存for(int x = 0; x < g_szMap.cx + 2; x+)delete g_imgMapx;delete g_imgMap;/ 關(guān)閉圖形模式closegraph();/ 繪制游戲界面void Welcome()/ 繪制漸變色外框for(int i=0; i<128; i+)setcolor(RGB(0, 0, (127 - i) << 1);recta
7、ngle(149 - i, 109 - (i >> 1), 490 + i, 370 + (i >> 1);/ 設(shè)置字體樣式setcolor(WHITE);setbkmode(TRANSPARENT);/ 繪制標(biāo)題setfont(36, 0, _T("宋體");outtextxy(248, 40, _T("迷宮");/ 繪制操作說(shuō)明setfont(12, 0, _T("宋體");outtextxy(50, 382, _T("控制說(shuō)明:");outtextxy(74, 400, _T(&quo
8、t;方向鍵或 A/S/D/W:移動(dòng)");outtextxy(74, 418, _T("空格、Y、G:在地圖上做紅、黃、綠色 M 標(biāo)記");outtextxy(74, 436, _T("C:清除地圖上的標(biāo)記");outtextxy(74, 454, _T("ESC:退出程序");/ 初始化游戲圖片void InitImage()/ 預(yù)繪制游戲圖片到 IMAGE 緩存(可以修改為加載圖片以獲得更好效果)SetWorkingImage(&g_imgItem);cleardevice();/ 繪制 PLAYERsetorig
9、in(MAP_PLAYER, 0);setfillstyle(YELLOW);setcolor(YELLOW);fillellipse(2, 2, 17, 17);setcolor(BLACK);line(7, 7, 7, 8);line(12, 7, 12, 8);arc(5, 6, 14, 14, 3.34, 6.08);/ 繪制墻壁setorigin(MAP_WALL, 0);setfillstyle(BROWN, PATTERN_FILL, "x20x20x20xffx04x04x04xff");setcolor(BROWN);bar(1, 1, 18, 18);r
10、ectangle(0, 0, 19, 19);/ 繪制紅色標(biāo)記setorigin(MAP_MARKRED, 0);setcolor(RED);moveto(5, 15);linerel(0, -10);linerel(5, 5);linerel(5, -5);linerel(0, 10);/ 繪制綠色標(biāo)記setorigin(MAP_MARKGREEN, 0);setcolor(GREEN);moveto(5, 15);linerel(0, -10);linerel(5, 5);linerel(5, -5);linerel(0, 10);/ 繪制黃色標(biāo)記setorigin(MAP_MARKYEL
11、LOW, 0);setcolor(YELLOW);moveto(5, 15);linerel(0, -10);linerel(5, 5);linerel(5, -5);linerel(0, 10);/ 繪制入口setorigin(MAP_ENTRANCE, 0);setcolor(GREEN);setfont(12, 0, _T("宋體");outtextxy(4, 4, _T("入");/ 繪制出口setorigin(MAP_EXIT, 0);outtextxy(4, 4, _T("出");/ 繪制迷宮外面的空地setorigin(
12、MAP_OUTSIDE, 0);setfillstyle(GREEN, PATTERN_FILL, "x50x55x22x20x05x55x22x02");bar(0, 0, 19, 19);/ 恢復(fù)坐標(biāo)系setorigin(0, 0);/ 顯示作者SetWorkingImage();setcolor(BLUE);TCHAR author = _T("Powered by zhaoh1987");outtextxy(471, 4, author);setcolor(LIGHTBLUE);outtextxy(470, 3, author);/ 初始化游戲數(shù)
13、據(jù)void InitGame()/ 提示用戶輸入迷宮大小GetMazeSize();/ 初始化參數(shù)if (g_imgMap != NULL)/ 清理迷宮地圖占用的內(nèi)存for(int x = 0; x < g_szMap.cx + 2; x+)delete g_imgMapx;delete g_imgMap;MakeMaze(g_szMap.cx, g_szMap.cy);/ 創(chuàng)建迷宮g_ptPlayer.x= 2;/ 設(shè)置游戲者的位置g_ptPlayer.y= 2;g_rtSight.left= 0;/ 設(shè)置視野范圍g_rtSight.top= 0;g_rtSight.right= 17
14、;g_rtSight.bottom= 13;/ 設(shè)置 GPS 顯示區(qū)setfillstyle(BLUE);bar(522, 368, 637, 471);if (g_szMap.cx > g_szMap.cy)g_szGPS.cx = 100; g_szGPS.cy = (int)(100.0 * g_szMap.cy / g_szMap.cx + 0.5);elseg_szGPS.cy = 100; g_szGPS.cx = (int)(100.0 * g_szMap.cx / g_szMap.cy + 0.5);Resize(&g_imgGPS, g_szGPS.cx, g_
15、szGPS.cy);g_ptGPS.x = 530 + 50 - g_szGPS.cx / 2;g_ptGPS.y = 370 + 50 - g_szGPS.cy / 2;/ 畫迷你地圖外框setcolor(RED);rectangle(g_ptGPS.x - 1, g_ptGPS.y - 1, g_ptGPS.x + g_szGPS.cx, g_ptGPS.y + g_szGPS.cy);/ 畫迷你地圖入口和出口setcolor(YELLOW);moveto(g_ptGPS.x - 8, g_ptGPS.y + g_szGPS.cy / g_szMap.cy);linerel(7, 0);l
16、inerel(-3, -3);moverel(3, 3);linerel(-3, 3);moveto(g_ptGPS.x + g_szGPS.cx, g_ptGPS.y + g_szGPS.cy - g_szGPS.cy / g_szMap.cy);linerel(7, 0);linerel(-3, -3);moverel(3, 3);linerel(-3, 3);/ 繪制游戲區(qū)Paint();/ 提示用戶輸入迷宮大小void GetMazeSize()g_szMap.cx = g_szMap.cy = 0;/ 獲取用戶輸入的寬高TCHAR s4;while(g_szMap.cx < 2
17、0 | g_szMap.cx > 200)InputBox(s, 4, _T("請(qǐng)輸入迷宮的寬度n范圍:20200"), _T("輸入"), _T("25");g_szMap.cx = _ttoi(s);while(g_szMap.cy < 20 | g_szMap.cx > 200)InputBox(s, 4, _T("請(qǐng)輸入迷宮的高度n范圍:20200"), _T("輸入"), _T("25");g_szMap.cy = _ttoi(s);/ 確保寬高為
18、奇數(shù)if (g_szMap.cx % 2 != 1) g_szMap.cx+;if (g_szMap.cy % 2 != 1) g_szMap.cy+;/ 生成迷宮:初始化(注:寬高必須是奇數(shù))void MakeMaze(int width, int height)if (width % 2 != 1 | height % 2 != 1)return;int x, y;/ 定義迷宮尺寸,并分配迷宮內(nèi)存g_imgMap = new BYTE*width + 2;for(x = 0; x < width + 2; x+)g_imgMapx = new BYTEheight + 2;memse
19、t(g_imgMapx, MAP_WALL, height + 2);/ 定義邊界for (x = 0; x <= width + 1; x+)g_imgMapx0 = g_imgMapxheight + 1 = MAP_GROUND;for (y = 1; y <= height; y+)g_imgMap0y = g_imgMapwidth + 1y = MAP_GROUND;/ 定義入口和出口g_imgMap12 = MAP_ENTRANCE;g_imgMapwidthheight - 1 = MAP_EXIT;/ 從任意點(diǎn)開(kāi)始遍歷生成迷宮TravelMaze(rand() %
20、 (width - 1) & 0xfffe) + 2, (rand() % (height - 1) & 0xfffe) + 2);/ 將邊界標(biāo)記為迷宮外for (x = 0; x <= width + 1; x+)g_imgMapx0 = g_imgMapxheight + 1 = MAP_OUTSIDE;for (y = 1; y <= height; y+)g_imgMap0y = g_imgMapwidth + 1y = MAP_OUTSIDE;/ 生成迷宮:遍歷 (x, y) 四周void TravelMaze(int x, int y)/ 定義遍歷方向i
21、nt d42 = 0, 1, 1, 0, 0, -1, -1, 0;/ 將遍歷方向亂序int n, t, i;for(i = 0; i < 4; i+)n = rand() % 4;t = di0, di0 = dn0, dn0 = t;t = di1, di1 = dn1, dn1 = t;/ 嘗試周圍四個(gè)方向g_imgMapxy = MAP_GROUND;for(i = 0; i < 4; i+)if (g_imgMapx + 2 * di0y + 2 * di1 = 0)g_imgMapx + di0y + di1 = MAP_GROUND;TravelMaze(x + di
22、0 * 2, y + di1 * 2);/ 遞歸/ 獲取指定坐標(biāo)的迷宮元素MAPITEM GetMazeItem(int x, int y)return (MAPITEM)g_imgMapxy;/ 繪制視野范圍內(nèi)的迷宮void Paint()int x1, y1;/ 繪制視野內(nèi)的迷宮SetWorkingImage(&g_imgSight);for(int x = g_rtSight.left; x <= g_rtSight.right; x+)for(int y = g_rtSight.top; y <= g_rtSight.bottom; y+)x1 = (x - g_r
23、tSight.left) * 20;y1 = (y - g_rtSight.top) * 20;putimage(x1, y1, 20, 20, &g_imgItem, GetMazeItem(x, y), 0);/ 繪制游戲者x1 = (g_ptPlayer.x - g_rtSight.left) * 20;y1 = (g_ptPlayer.y - g_rtSight.top) * 20;putimage(x1, y1, 20, 20, &g_imgItem, MAP_PLAYER, 0);/ 繪制迷你地圖SetWorkingImage(&g_imgGPS);clea
24、rdevice();int tx = (int)(g_ptPlayer.x - 1) * g_szGPS.cx / (double)(g_szMap.cx - 1) + 0.5);int ty = (int)(g_ptPlayer.y - 1) * g_szGPS.cy / (double)(g_szMap.cy - 1) + 0.5);setcolor(YELLOW);circle(tx, ty, 1);/ 更新到繪圖窗口SetWorkingImage();putimage(150, 110, 340, 260, &g_imgSight, 10, 10);putimage(g_ptG
25、PS.x, g_ptGPS.y, &g_imgGPS);/ 獲取用戶輸入的命令int GetCmd(int *c)*c = 0;if (GetAsyncKeyState(VK_LEFT)& 0x8000)*c |= CMD_LEFT;if (GetAsyncKeyState(VK_RIGHT)& 0x8000)*c |= CMD_RIGHT;if (GetAsyncKeyState(VK_UP)& 0x8000)*c |= CMD_UP;if (GetAsyncKeyState(VK_DOWN)& 0x8000)*c |= CMD_DOWN;if (Ge
26、tAsyncKeyState('A')& 0x8000)*c |= CMD_LEFT;if (GetAsyncKeyState('D')& 0x8000)*c |= CMD_RIGHT;if (GetAsyncKeyState('W')& 0x8000)*c |= CMD_UP;if (GetAsyncKeyState('S')& 0x8000)*c |= CMD_DOWN;if (GetAsyncKeyState(' ')& 0x8000)*c |= CMD_MARKRED
27、;if (GetAsyncKeyState('G')& 0x8000)*c |= CMD_MARKGREEN;if (GetAsyncKeyState('Y')& 0x8000)*c |= CMD_MARKYELLOW;if (GetAsyncKeyState('C')& 0x8000)*c |= CMD_CLEARMARK;if (GetAsyncKeyState(VK_ESCAPE)& 0x8000)*c |= CMD_QUIT;return *c;/ 處理用戶輸入的命令void DispatchCmd(int
28、 cmd)if (cmd & CMD_UP)OnUp();if (cmd & CMD_DOWN)OnDown();if (cmd & CMD_LEFT)OnLeft();if (cmd & CMD_RIGHT)OnRight();if (cmd & CMD_MARKRED)OnMark(MAP_MARKRED);if (cmd & CMD_MARKGREEN)OnMark(MAP_MARKGREEN);if (cmd & CMD_MARKYELLOW)OnMark(MAP_MARKYELLOW);if (cmd & CMD_CLE
29、ARMARK)OnMark(MAP_GROUND);/ 向上移動(dòng)void OnUp()if (g_ptPlayer.y > 1 && GetMazeItem(g_ptPlayer.x, g_ptPlayer.y - 1) != MAP_WALL)g_ptPlayer.y-;if (g_ptPlayer.y - g_rtSight.top < 4 && g_rtSight.top > 0)g_rtSight.top-;g_rtSight.bottom-;/ 向左移動(dòng)void OnLeft()if (g_ptPlayer.x > 1 && GetMazeItem(g_ptPlayer.x - 1, g_ptPlayer.y) != MAP_WALL && GetMazeItem(g_ptPlayer.x - 1, g_ptPlayer.y) != MAP_ENTRANCE)g_ptPlayer.x-;if (g_ptPlayer.x - g_rtSight.left < 5 && g_rtSight.left > 0)g_rtSight.left-;g_rtSight.right-;/ 向右移動(dòng)void OnRight()if (g
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電力干線遷移施工方案
- 新中式瓦工施工方案
- 文官街地鐵施工方案
- TSHPA 0006-2024 學(xué)校有害生物綜合管理指南
- 2025年度跨境電商貸款擔(dān)保合同
- 二零二五年度餐飲管理輔導(dǎo)合同
- 二零二五年度柜臺(tái)品牌授權(quán)與推廣合同
- 茶樓茶藝師勞動(dòng)合同2025年度與勞動(dòng)合同簽訂流程
- 二零二五年度影視演員網(wǎng)絡(luò)直播聘用協(xié)議
- 二零二五年度個(gè)體店面轉(zhuǎn)讓與市場(chǎng)準(zhǔn)入條件協(xié)議
- 施工鋼板樁監(jiān)理細(xì)則
- 微電網(wǎng)-儲(chǔ)能電池catl pet80ah電芯規(guī)格書
- GB/T 4209-2022工業(yè)硅酸鈉
- 2023年江蘇農(nóng)林職業(yè)技術(shù)學(xué)院高職單招(數(shù)學(xué))試題庫(kù)含答案解析
- GB/T 39242-2020無(wú)損檢測(cè)超聲檢測(cè)靈敏度和范圍設(shè)定
- GB/T 32271-2015電梯能量回饋裝置
- GB/T 18775-2009電梯、自動(dòng)扶梯和自動(dòng)人行道維修規(guī)范
- GB/T 1.2-2020標(biāo)準(zhǔn)化工作導(dǎo)則第2部分:以ISO/IEC標(biāo)準(zhǔn)化文件為基礎(chǔ)的標(biāo)準(zhǔn)化文件起草規(guī)則
- 皮膚性病學(xué)-皮膚性病的治療
- 《社會(huì)歷史的決定性基礎(chǔ)》課件2 【知識(shí)建構(gòu)+備課精研】統(tǒng)編版高中語(yǔ)文選擇性必修中冊(cè)
- 消毒供應(yīng)中心火災(zāi)應(yīng)急預(yù)案演練記錄
評(píng)論
0/150
提交評(píng)論