自己用C語言實現的推箱子的游戲,在寫這個的期間瀏覽,查看了許多的博客和論壇。(寫於大一下學期) 這個游戲我用的是VS2010和EasyX圖形庫寫的。 如有錯誤,望指正。 代碼在最後。 游戲的效果圖 游戲界面 通關界面 這個3.0是因為,有過2次大的修改。 還有這個時間的數字是不動的,這裡不太懂怎麼弄 ...
自己用C語言實現的推箱子的游戲,在寫這個的期間瀏覽,查看了許多的博客和論壇。(寫於大一下學期)
這個游戲我用的是VS2010和EasyX圖形庫寫的。
如有錯誤,望指正。
代碼在最後。
游戲的效果圖
游戲界面
通關界面
這個3.0是因為,有過2次大的修改。
還有這個時間的數字是不動的,這裡不太懂怎麼弄倒計時數。
源碼
// 推箱子3.0.cpp : 定義控制台應用程式的入口點。 /** *共有 空心的 實心的 箱子 到目的地的箱子 人 在目的地上的人 目的地 7種區域 * * */ #include "stdafx.h" #include <Windows.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <graphics.h>//圖形庫頭文件 EasyX庫 int map[9][11]={ {1,1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,1,3,0,0,0,0,1}, {1,0,0,0,1,0,0,0,0,0,1}, {1,0,0,0,4,0,4,0,1,1,1}, {1,3,0,0,0,5,0,0,0,3,1}, {1,1,1,0,4,0,4,0,0,0,1}, {1,0,0,0,0,0,1,0,0,0,1}, {1,0,0,0,0,3,1,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1,1} }; struct Imgposition{//定義貼圖坐標的結構體 int x; int y; }; struct Imgposition abc[9][11]={//定義並賦值貼圖坐標的結構體類型數組 {{0,0},{32,0},{64,0},{96,0},{128,0},{160,0},{192,0},{224,0},{256,0},{288,0},{320,0}}, {{0,32},{32,32},{64,32},{96,32},{128,32},{160,32},{192,32},{224,32},{256,32},{288,32},{320,32}}, {{0,64},{32,64},{64,64},{96,64},{128,64},{160,64},{192,64},{224,64},{256,64},{288,64},{320,64}}, {{0,96},{32,96},{64,96},{96,96},{128,96},{160,96},{192,96},{224,96},{256,96},{288,96},{320,96}}, {{0,128},{32,128},{64,128},{96,128},{128,128},{160,128},{192,128},{224,128},{256,128},{288,128},{320,128}}, {{0,160},{32,160},{64,160},{96,160},{128,160},{160,160},{192,160},{224,160},{256,160},{288,160},{320,160}}, {{0,192},{32,192},{64,192},{96,192},{128,192},{160,192},{192,192},{224,192},{256,192},{288,192},{320,192}}, {{0,224},{32,224},{64,224},{96,224},{128,224},{160,224},{192,224},{224,224},{256,224},{288,224},{320,224}}, {{0,256},{32,256},{64,256},{96,256},{128,256},{160,256},{192,256},{224,256},{256,256},{288,256},{320,256}} }; int i=4;int j=5; int *pi=&i;int *pj=&j; int playerposition=map[4][5]; //定義玩家的初始位置??? IMAGE A,B,C,D,E,F,G,H,I,J,K,L;//存儲貼圖的指針 void showcover(){//顯示游戲封面 putimage(96,18,&H); putimage(128,18,&I); putimage(160,18,&J); putimage(192,18,&K); putimage(60,70,&L); //outtextxy(240,295,_T("BY第企鵝")); outtextxy(15,295,_T("版本:3.0")); settextcolor(LIGHTRED);//更換文本顏色 outtextxy(100,250,_T("按任意鍵進入游戲")); settextcolor(WHITE);//換回白色 system("pause"); } void showUI(){ putimage(388,18,&H);//推 putimage(420,18,&I);//箱 putimage(452,18,&J);//子 putimage(484,18,&K);//3.0 } void showmessage(){ {//顯示玩家坐標 LPCTSTR str; TCHAR str1[127]=_T("玩家坐標("); TCHAR str2[20]; TCHAR str3[20]; _stprintf(str2,_T("%d"),i+1); _stprintf(str3,_T("%d"),j+1); lstrcat(str1,str2);lstrcat(str1,_T(",")); lstrcat(str1,str3);lstrcat(str1,_T(")")); //玩家坐標(x,y)x為行數 y為列數。 outtextxy(388,82,str1); } {//顯示玩家狀態 if(map[i][j]==5){outtextxy(388,114,_T("玩家狀態:False"));} else{outtextxy(388,114,_T("玩家狀態:True "));} } {//顯示剩餘數量 int count=0; //檢查四個箱子是否歸位 if(map[4][1]!=7){count++;} if(map[7][5]!=7){count++;} if(map[4][9]!=7){count++;} if(map[1][5]!=7){count++;} TCHAR str[20]=_T("剩餘箱子:"); TCHAR str1[20]; _stprintf(str1,_T("%d"),count); //lstrcat(str,str1); outtextxy(388,146,str); settextcolor(RED);//更換文本顏色 outtextxy(468,146,str1); settextcolor(WHITE);//換回白色 } {//顯示所用時間 TCHAR str[20]=_T("時間:99 s"); outtextxy(388,178,str); } {//顯示操作說明 TCHAR str1[50]=_T("操作:w,s,a,d,"); TCHAR str2[50]=_T("r 重新游戲,h 幫助"); outtextxy(388,235,str1); outtextxy(388,260,str2); } } void loadImage(){ loadimage(&A,_T("素材//推箱子貼圖//空白_推箱子貼圖.png"),0,0,false); loadimage(&B,_T("素材//推箱子貼圖//牆壁_推箱子貼圖.png"),0,0,false); loadimage(&C,_T("素材//推箱子貼圖//目的地_推箱子貼圖.png"),0,0,false); loadimage(&D,_T("素材//推箱子貼圖//箱子2_推箱子貼圖.png"),0,0,false); loadimage(&E,_T("素材//推箱子貼圖//玩家_推箱子貼圖.png"),0,0,false); loadimage(&F,_T("素材//推箱子貼圖//到達目的地的箱子_推箱子貼圖.png"),0,0,false); loadimage(&G,_T("素材//推箱子貼圖//玩家站在目的地上_推箱子貼圖.png"),0,0,false); loadimage(&H,_T("素材//推箱子貼圖//推_推箱子貼圖.png"),0,0,false); loadimage(&I,_T("素材//推箱子貼圖//箱_推箱子貼圖.png"),0,0,false); loadimage(&J,_T("素材//推箱子貼圖//子_推箱子貼圖.png"),0,0,false); loadimage(&K,_T("素材//推箱子貼圖//3.0_推箱子貼圖.png"),0,0,false); loadimage(&L,_T("素材//推箱子貼圖//封面.png"),0,0,false); } void showmap(){ //列印地圖的函數 for(int i=0;i<9;i++){ for(int j=0;j<11;j++){ switch (map[i][j]){ case 0://printf(" "); putimage(abc[i][j].x,abc[i][j].y,&A); break; case 1://printf("■"); putimage(abc[i][j].x,abc[i][j].y,&B); break; case 3://printf("☆"); putimage(abc[i][j].x,abc[i][j].y,&C); break; case 4://printf("□"); putimage(abc[i][j].x,abc[i][j].y,&D); break; case 5://printf("♀"); putimage(abc[i][j].x,abc[i][j].y,&E); break; case 7://printf("★"); putimage(abc[i][j].x,abc[i][j].y,&F); break; case 8://printf("♀"); putimage(abc[i][j].x,abc[i][j].y,&G); break; } }//printf("\n"); } } void showmap_again(char ch,int *i,int *j){//修改地圖元素的值 修改玩家的坐標 void whoisyourdaddy(); switch(ch){ case 'w': case 'W':printf("%d",map[*i-1][*j]); if(map[*i-1][*j]==0||map[*i-1][*j]==3){ map[*i-1][*j]+=5; map[*i][*j]-=5; *i-=1;//修改玩家的坐標 } else if(map[*i-1][*j]==4||map[*i-1][*j]==7){ if(map[*i-2][*j]==0||map[*i-2][*j]==3){ map[*i][*j]-=5; if(map[*i-1][*j]!=7){map[*i-1][*j]=5;}else{map[*i-1][*j]=8;} map[*i-2][*j]+=4; *i-=1;//修改玩家的坐標 } }break; case 's': case 'S': if(map[*i+1][*j]==0||map[*i+1][*j]==3){ map[*i][*j]-=5; map[*i+1][*j]+=5; *i+=1;//修改玩家的坐標 } else if(map[*i+1][*j]==4||map[*i+1][*j]==7){ if(map[*i+2][*j]==0||map[*i+2][*j]==3){ map[*i][*j]-=5; if(map[*i+1][*j]!=7){map[*i+1][*j]=5;}else{map[*i+1][*j]=8;} map[*i+2][*j]+=4; *i+=1;//修改玩家的坐標 } }break; case 'a': case 'A': if(map[*i][*j-1]==0||map[*i][*j-1]==3){ map[*i][*j]-=5; map[*i][*j-1]+=5; *j-=1;//修改玩家的坐標 } else if(map[*i][*j-1]==4||map[*i][*j-1]==7){ if(map[*i][*j-2]==0||map[*i][*j-2]==3){ map[*i][*j]-=5; if(map[*i][*j-1]!=7){map[*i][*j-1]=5;}else{map[*i][*j-1]=8;} map[*i][*j-2]+=4; *j-=1;//修改玩家的坐標 } }break; case 'd': case 'D': if(map[*i][*j+1]==0||map[*i][*j+1]==3){ map[*i][*j]-=5; map[*i][*j+1]+=5; *j+=1;//修改玩家的坐標 } else if(map[*i][*j+1]==4||map[*i][*j+1]==7){ if(map[*i][*j+2]==0||map[*i][*j+2]==3){ map[*i][*j]-=5; if(map[*i][*j+1]!=7){map[*i][*j+1]=5;}else{map[*i][*j+1]=8;} map[*i][*j+2]+=4; *j+=1;//修改玩家的坐標 } }break; case 'H': case 'h': whoisyourdaddy(); break; case 'R': case 'r': int map2[9][11]={ {1,1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,1,3,0,0,0,0,1}, {1,0,0,0,1,0,0,0,0,0,1}, {1,0,0,0,4,0,4,0,1,1,1}, {1,3,0,0,0,5,0,0,0,3,1}, {1,1,1,0,4,0,4,0,0,0,1}, {1,0,0,0,0,0,1,0,0,0,1}, {1,0,0,0,0,3,1,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1,1}}; for(int i=0;i<9;i++){//地圖複原 for(int j=0;j<11;j++){ map[i][j]=map2[i][j]; } } *i=4,*j=5;//玩家位置複原 //map[9][11]=map2[9][11]; break; } } int checkgame(){ //void gamehelp(); if(map[4][1]==7&&map[7][5]==7&&map[4][9]==7&&map[1][5]==7){ //獲勝時刷新界面 showUI(); showmessage(); showmap(); settextcolor(LIGHTGREEN);//更改文本顏色 settextstyle(12,0,_T("宋體"));//更改文本字體 outtextxy(388,210,_T("您獲勝了!!!")); settextcolor(WHITE); Sleep(3000); system("cls"); printf("您獲勝了!!!\n"); system("pause"); return 0;} else{return 1;} } void whoisyourdaddy(){//游戲一鍵完成 map[4][1]=7,map[7][5]=7,map[4][9]=7,map[1][5]=7;//目的地置為7; map[3][4]=0,map[5][4]=0,map[5][6]=0,map[3][6]=0;//箱子置為0 } int _tmain(int argc, _TCHAR* argv[]) { initgraph(320, 320);//封面初始界面 loadImage();//載入圖片(自定義函數) showcover();//顯示游戲封面 //SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),12);//更改界面文本顏色 int check=1; initgraph(552, 288);//游戲初始界面 //initgraph(352, 288);//游戲界面大小 while(check){ //system("mode con cols=90 lines=30"); //視窗寬度高度 //system("cls"); char contrue;//玩家的按鍵 showUI(); showmessage(); ///*顯示玩家位置的狀態*/changetextcolor(FOREGROUND_BLUE);printf("玩家坐標(%d,%d)\t ",i+1,j+1);printf("♀的狀態為%d\n",map[i][j]); ///*游戲提示*/gamehelp();(自定義函數) showmap();//(自定義函數) //printf("您的操作(w,s,a,d):"); contrue=getchar(); showmap_again(contrue,pi,pj);//(自定義函數) ////printf("\n玩家坐標(%d,",i+1); ////printf("%d)\n",j+1); check=checkgame();//檢查游戲是否退出 (自定義函數) ///*內置外掛-一鍵完成*///whoisyourdaddy(); } return 0; }
代碼看起來有點亂,因為不是同一個時間段寫的。
不知道多年以後看到這些,會有什麼感想。