C語言實現(xiàn)推箱子功能匯總
本文實例為大家分享了C語言實現(xiàn)推箱子功能的具體代碼,供大家參考,具體內(nèi)容如下
前言:
先說說我寫推箱子小游戲的過程。
第一版:沒有圖形化界面,不能選關(guān)。只有推箱子的最基礎(chǔ)功能。
第二版:增加圖形化界面,但是不能選擇關(guān)卡。
最終版:增加選擇關(guān)卡功能、播放/關(guān)閉音樂功能、退出游戲功能,捕獲鼠標(biāo)功能。
首先看一下最終版效果圖
功能點分析:
打開/關(guān)閉音樂和退出游戲比較簡單。
打開音樂所需調(diào)用的頭文件
#include <graphics.h> //調(diào)用easyx圖形庫時所需增加的頭文件 #include <mmsystem.h> #pragma comment(lib,"winmm.lib") //靜態(tài)庫資源
打開音樂調(diào)用的easyx內(nèi)部函數(shù)
mciSendString("open 1.mp3", 0, 0, 0);//播放存放c代碼同一路徑的1.mp3音樂 mciSendString("play 1.mp3", 0, 0, 0);//循環(huán)播放音樂資源
關(guān)閉音樂調(diào)用的easyx內(nèi)部函數(shù)
mciSendString("close 1.mp3", 0, 0, 0);
退出游戲功能:直接找一個圖片,當(dāng)鼠標(biāo)點擊退出游戲這個區(qū)域,那么就顯示該退出游戲的圖片,并退出控制臺。
選擇關(guān)卡可以用三維數(shù)組:
三維數(shù)組可以理解為多個二維數(shù)組。例如map[3][10][10]表示有三個10x10的二維數(shù)組。當(dāng)我點擊關(guān)卡1,那么就打印map[1][10][10]這個區(qū)域的地圖。關(guān)卡二和關(guān)卡三類似。
捕獲鼠標(biāo)信息:
easyx圖形庫給我們提供了鼠標(biāo)捕獲函數(shù)getmessage(EM_MOUSE)。以及保存鼠標(biāo)消息結(jié)構(gòu)體:
// 鼠標(biāo)消息的數(shù)據(jù) struct { bool ctrl :1; // Ctrl 鍵是否按下 bool shift :1; // Shift 鍵是否按下 bool lbutton :1; // 鼠標(biāo)左鍵是否按下 bool mbutton :1; // 鼠標(biāo)中鍵是否按下 bool rbutton :1; // 鼠標(biāo)右鍵 short x; // 鼠標(biāo)的 x 坐標(biāo) short y; // 鼠標(biāo)的 y 坐標(biāo) short wheel; // 鼠標(biāo)滾輪滾動值,為 120 的倍數(shù) };
整體代碼:
/* 問題:為什么通過一關(guān)后,再重新進入的話會進不去?也可以說閃退。 因為如果箱子已經(jīng)到目的地了,那么就不會進入while(!gamePass())這個while循環(huán)里面。 */ #include <stdio.h> #include <conio.h> //鍵盤輸入函數(shù)庫 #include <stdlib.h> //這個頭文件包含了清屏函數(shù)system("cls"); #include <graphics.h> //調(diào)用easyx圖形庫時所需增加的頭文件 #include <mmsystem.h> #pragma comment(lib,"winmm.lib") //靜態(tài)庫資源 int flag;//0表示關(guān)卡1,1表示關(guān)卡2,2表示關(guān)卡3 EASYXMSG m; // 定義消息變量 int map[3][10][10] = { 1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,3,0,0,1, 1,0,0,5,4,0,0,0,0,1, 1,0,0,1,1,0,0,0,0,1, 1,0,1,0,0,0,1,0,0,1, 1,0,0,4,0,0,1,0,0,1, 1,0,0,0,0,0,0,0,0,1, 1,0,0,3,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1, //關(guān)卡1 1,1,1,1,1,1,1,1,1,1, 1,0,0,1,0,0,0,0,0,1, 1,0,0,1,4,0,3,0,0,1, 1,0,0,0,0,0,0,0,0,1, 1,0,1,0,0,0,1,0,0,1, 1,0,1,4,0,0,1,0,0,1, 1,0,1,0,0,0,0,0,0,1, 1,3,0,0,0,0,5,0,0,1, 1,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,//關(guān)卡2 1,1,1,1,1,1,1,1,1,1, 1,1,0,0,1,1,0,0,0,1, 1,1,0,4,0,0,0,0,0,1, 1,1,0,1,1,0,0,0,0,1, 1,0,0,0,0,0,1,0,3,1, 1,0,0,4,0,0,1,0,0,1, 1,0,0,0,0,0,0,4,1,1, 1,0,0,3,0,5,0,0,1,1, 1,0,0,0,0,0,0,3,0,1, 1,1,1,1,1,1,1,1,1,1,//關(guān)卡3 }; IMAGE img[9]; //9張圖片,9個名字 void loadResource() { loadimage(img + 0, "0.bmp", 50, 50);//50表示圖片長寬,可以自己調(diào)的 loadimage(img + 1, "1.bmp", 50, 50); loadimage(img + 2, "3.bmp", 50, 50); loadimage(img + 3, "4.bmp", 50, 50); loadimage(img + 4, "5.bmp", 50, 50); loadimage(img + 5, "7.bmp", 50, 50); loadimage(img + 6, "8.jpeg", 500, 200); loadimage(img + 7, "9.jfif", 500, 500);//退出游戲 loadimage(img + 8, "10.jfif", 500, 500);//恭喜過關(guān) } void Printmap() { int i,j; for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { int x,y; x = j* 50; y = i* 50; switch (map[flag][i][j]) { //0:空地 1:墻 3:箱子要放的位置 4:箱子 5:人 7:箱子到達目的地 8:人到達目的地 /*case 0: printf(" "); break; case 1: printf("■"); break; case 3: printf("☆"); break; case 4: printf("□"); break; case 5: case 8: printf("♀"); break; case 7: printf("★"); break; */ case 0: putimage(x, y, img + 0); break; //把圖片打印在控制臺,從坐標(biāo)點x,y開始顯示圖片 case 1: putimage(x, y, img + 1); break; case 3: putimage(x, y, img + 2); break; case 4: putimage(x, y, img + 3); break; case 5: case 8: putimage(x, y, img + 4); break; case 7: putimage(x, y, img + 5); break; default: break; } } printf("\n"); } } void PlayGame() { char temp; //遍歷整個地圖,找到人所在的坐標(biāo),并把坐標(biāo)值賦給i,j這兩個變量。 int x,y; int i,j; for(x=0;x<10;x++) { for(y=0;y<10;y++) { if(map[flag][x][y] == 5 || map[flag][x][y] == 8) { i=x; j=y; } } } temp = _getch();//鍵盤輸入無回顯函數(shù) switch (temp) { case 'W': case 'w': if (map[flag][i - 1][j] == 0 || map[flag][i - 1][j] == 3) //如果下一步是空地 或者是 箱子要放的位置 { map[flag][i][j] -= 5; map[flag][i - 1][j] += 5; } if (map[flag][i - 1][j] == 4 || map[flag][i - 1][j] == 7)//如果下一步是箱子 或者是 箱子到達目的地 { if (map[flag][i - 2][j] == 0 || map[flag][i - 2][j] == 3)//如果繼續(xù)下一步是空地 或者是 箱子要放的位置 { map[flag][i][j] -= 5; map[flag][i - 1][j] += 1; map[flag][i - 2][j] += 4; } } break; case 'S': case 's': if (map[flag][i + 1][j] == 0 || map[flag][i + 1][j] == 3) { map[flag][i][j] -= 5; map[flag][i + 1][j] += 5; } if (map[flag][i + 1][j] == 4 || map[flag][i + 1][j] == 7) { if (map[flag][i + 2][j] == 0 || map[flag][i + 2][j] == 3) { map[flag][i][j] -= 5; map[flag][i + 1][j] += 1; map[flag][i + 2][j] += 4; } } break; case 'A': case 'a': if (map[flag][i][j - 1] == 0 || map[flag][i][j - 1] == 3) { map[flag][i][j] -= 5; map[flag][i][j - 1] += 5; } if (map[flag][i][j - 1] == 4 || map[flag][i][j - 1] == 7) { if (map[flag][i][j - 2] == 0 || map[flag][i][j - 2] == 3) { map[flag][i][j] -= 5; map[flag][i][j - 1] += 1; map[flag][i][j - 2] += 4; } } break; case 'D': case 'd': if (map[flag][i][j + 1] == 0 || map[flag][i][j + 1] == 3) { map[flag][i][j] -= 5; map[flag][i][j + 1] += 5; } if (map[flag][i][j + 1] == 4 || map[flag][i][j + 1] == 7) { if (map[flag][i][j + 2] == 0 || map[flag][i][j + 2] == 3) { map[flag][i][j] -= 5; map[flag][i][j + 1] += 1; map[flag][i][j + 2] += 4; } } break; default: break; } } int gamePass() //游戲通關(guān) { //地圖上沒有箱子就可以結(jié)束 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (map[flag][i][j] == 4) { return 0; } } } return 1; } void draw_initgraph()//游戲首頁界面 { initgraph(500, 500);//創(chuàng)建一個大小為500 x 500 的窗口 loadResource();//加載資源函數(shù) putimage(0, 0, &img[6]);//圖1的左上角的頂點為(0,0) setbkmode(TRANSPARENT); //設(shè)置填制背景為透明,這樣填充文字時背景才是圖片的顏色 //在左上角坐標(biāo)為(x,y)處輸出文字 //outtextxy(215, 50, "推箱子"); outtextxy(120, 250, "關(guān)卡1"); outtextxy(240, 250, "關(guān)卡2"); outtextxy(360, 250, "關(guān)卡3"); outtextxy(105, 300, "打開音樂"); outtextxy(105, 350, "關(guān)閉音樂"); outtextxy(345, 350, "退出游戲"); //在左上角(x1,y1)和右下角(x2,y2)范圍畫一個矩形,這個是設(shè)置的鼠標(biāo)點擊各按鍵時的范圍 rectangle(100, 245, 175, 270);//關(guān)卡1 rectangle(220, 245, 295, 270);//關(guān)卡2 rectangle(340, 245, 415, 270);//關(guān)卡3 rectangle(100, 295, 175, 320);//打開音樂 //rectangle(390, 295, 465, 320); rectangle(100, 345, 175, 370);//關(guān)閉音樂 rectangle(340, 345, 415, 370);//退出游戲 } int main() { level: draw_initgraph(); while (1) { m = getmessage(EM_MOUSE);//獲取鼠標(biāo)信息 if (m.x >= 100 && m.x <= 175 && m.y >= 295 && m.y <= 320) {//如果光標(biāo)在打開音樂 setlinecolor(RED); rectangle(95, 290, 180, 325); if (m.lbutton) { //如果按下鼠標(biāo)左鍵實現(xiàn)相應(yīng)功能. mciSendString("open 1.mp3", 0, 0, 0);//播放音樂 mciSendString("play 1.mp3", 0, 0, 0);//循環(huán)播放音樂資源 } } else if(m.x >= 100 && m.x <= 175 && m.y >= 345 && m.y <= 370) {//如果光標(biāo)在關(guān)閉音樂 setlinecolor(RED); rectangle(95, 340, 180, 375); if (m.lbutton) { //如果按下鼠標(biāo)左鍵實現(xiàn)相應(yīng)功能. mciSendString("close 1.mp3", 0, 0, 0);//關(guān)閉音樂 } } else if(m.x >= 340 && m.x <= 415 && m.y >= 345 && m.y <= 370) {//如果光標(biāo)在退出游戲 setlinecolor(RED); rectangle(335, 340, 420, 375); if (m.lbutton) { //如果按下鼠標(biāo)左鍵實現(xiàn)相應(yīng)功能. putimage(0, 0, &img[7]);//圖3的左上角的頂點為(0,0) Sleep(2000); closegraph(); break; } } else if(m.x >= 100 && m.x <= 175 && m.y >= 245 && m.y <= 270) {//如果光標(biāo)在關(guān)卡1 setlinecolor(RED); rectangle(95, 240, 180, 275); flag = 0; if (m.lbutton) { //如果按下鼠標(biāo)左鍵實現(xiàn)相應(yīng)功能. while(!gamePass()) { Printmap(); PlayGame(); system("cls"); } putimage(0, 0, &img[8]);//圖3的左上角的頂點為(0,0) Sleep(1500); goto level; } } else if(m.x >= 220 && m.x <= 295 && m.y >= 245 && m.y <= 270) {//如果光標(biāo)在關(guān)卡2 setlinecolor(RED); rectangle(215, 240, 300, 275); flag = 1; if (m.lbutton) { //如果按下鼠標(biāo)左鍵實現(xiàn)相應(yīng)功能. while(!gamePass()) { Printmap(); PlayGame(); system("cls"); } putimage(0, 0, &img[8]);//圖3的左上角的頂點為(0,0) Sleep(1500); goto level; } } else if(m.x >= 340 && m.x <= 415 && m.y >= 245 && m.y <= 270) {//如果光標(biāo)在關(guān)卡3 setlinecolor(RED); rectangle(335, 240, 420, 275); flag = 2; if (m.lbutton) { //如果按下鼠標(biāo)左鍵實現(xiàn)相應(yīng)功能. while(!gamePass()) { Printmap(); PlayGame(); system("cls"); } putimage(0, 0, &img[8]);//圖3的左上角的頂點為(0,0) Sleep(1500); goto level; } } else { //當(dāng)鼠標(biāo)不在目標(biāo)位置就用背景色覆蓋之前的藍色邊框. setlinecolor(BLACK); rectangle(95, 290, 180, 325); setlinecolor(BLACK); rectangle(95, 340, 180, 375); setlinecolor(BLACK); rectangle(335, 340, 420, 375); setlinecolor(BLACK); rectangle(95, 240, 180, 275); setlinecolor(BLACK); rectangle(215, 240, 300, 275); setlinecolor(BLACK); rectangle(335, 240, 420, 275); } } //closegraph();//關(guān)閉窗口 return 0; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實現(xiàn)企業(yè)員工管理系統(tǒng)開發(fā)
這篇文章主要為大家詳細介紹了C語言實現(xiàn)企業(yè)員工管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08教你如何使用C++ 統(tǒng)計地鐵中站名出現(xiàn)的字的個數(shù)
通過本文教大家如何使用C++ 統(tǒng)計地鐵中站名出現(xiàn)的字的個數(shù),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2022-01-01VScode + keil開發(fā)環(huán)境搭建安裝使用過程
這篇文章主要介紹了VScode + keil開發(fā)環(huán)境搭建及安裝使用過程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-07-07C語言庫函數(shù)strcpy的使用及模擬實現(xiàn)
本文主要介紹了C語言庫函數(shù)strcpy的使用及模擬實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04