推箱子

两关的推箱子用到一个三维数组

用到的图片数据如下

https://pan.baidu.com/s/1IDE4GQLo46cxNywDqwxmlQ

密码:jdel

代码如下:

c语言推箱子 扫雷项目-LMLPHPc语言推箱子 扫雷项目-LMLPHP
#include<stdio.h>#include<easyx.h>#include<conio.h>//getch不显示字母#include<mmsystem.h>#pragmacomment(lib,"winmm.lib")//PlaySound播放wav//mciSendString放mp3intmyMap[2][8][10]={{//8行9列-->8行10列0,1,1,1,1,1,1,1,0,0,0,1,0,2,4,4,4,1,0,0,0,1,0,0,0,1,1,1,1,0,1,1,1,3,0,0,0,0,1,0,1,0,0,0,1,3,1,0,1,0,1,0,3,0,1,0,0,0,1,0,1,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0},{//7行10列-->8行100,0,0,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,1,0,1,1,4,0,3,1,1,0,1,1,1,4,4,3,0,3,0,0,2,1,1,4,4,0,3,0,3,0,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0}};//初始地图intmap[8][10];//正在使用地图IMAGEimg[6];intlevel=0;intflag;//当前关卡是否结束intop[100];//保存最近100次的操作inttimes=0;//保存的操作次数现在可以回撤次数voidrecord(intre)//记录每次的操作用于每部操作之后放到数组中{op[times++]=re;}voidrecall(){if(times==0)return;//无法撤回times--;intx,y;for(inti=0;i<8;i++){for(intj=0;j<10;j++){if(map[i][j]==2||map[i][j]==6)//人或者人在目的地上{x=i;y=j;}}}//用x,y来表示人的位置switch(op[times]){case0://直接往下走map[x][y]-=2;map[x+1][y]+=2;break;case1://带箱子往下走map[x][y]+=1;map[x+1][y]+=2;//箱子下去了map[x-1][y]-=3;break;case2://直接往上走map[x][y]-=2;map[x-1][y]+=2;break;case3://带着箱子往上走map[x][y]+=1;map[x+1][y]-=3;map[x-1][y]+=2;break;case4://直接往右走map[x][y]-=2;map[x][y+1]+=2;break;case5:map[x][y]+=1;map[x][y+1]+=2;map[x][y-1]-=3;break;case6://直接往左走map[x][y]-=2;map[x][y-1]+=2;break;case7:map[x][y]+=1;map[x][y-1]+=2;map[x][y+1]-=3;break;}}voidloadMap()//加载地图{for(inti=0;i<8;++i){for(intj=0;j<10;j++){map[i][j]=myMap[level][i][j];//把第几关的地图放进map}}}voiddrawMap()//利用数字进行贴图{BeginBatchDraw();//双缓冲贴图优化贴图效果putimage(0,0,&img[0]);for(inti=0;i<8;++i){for(intj=0;j<10;++j){switch(map[i][j]){case0://空地break;case1://墙壁putimage(j*50,i*50,&img[1]);break;case2://putimage(j*50,i*50,&img[2]);break;case3:putimage(j*50,i*50,&img[3]);break;case4:putimage(j*50,i*50,&img[4]);break;case6:putimage(j*50,i*50,&img[2]);break;case7:putimage(j*50,i*50,&img[5]);break;}}}EndBatchDraw();}voidplay(){intx,y;//保存人的位置for(inti=0;i<8;i++){for(intj=0;j<10;j++){if(map[i][j]==2||map[i][j]==6)//人或者人在目的地上{x=i;y=j;}}}//找到人开始操作getch直接读取键盘的一个字符头文件conio.h//getch直接按就有反应getchar按完需要回车才有反应switch(getch()){case'w':case'W':if(map[x-1][y]==0||map[x-1][y]==4)//上方可以走或者上面是目的地或者空地{map[x][y]-=2;map[x-1][y]+=2;record(0);}elseif(map[x-1][y]==3||map[x-1][y]==7)//上方是箱子或者目的地箱子{if(map[x-2][y]==0||map[x-2][y]==4){map[x][y]-=2;map[x-1][y]-=1;map[x-2][y]+=3;record(1);}}break;case'a':case'A':if(map[x][y-1]==0||map[x][y-1]==4){map[x][y]-=2;map[x][y-1]+=2;record(4);}elseif(map[x][y-1]==3||map[x][y-1]==7){if(map[x][y-2]==0||map[x][y-2]==4){map[x][y]-=2;map[x][y-1]-=1;map[x][y-2]+=3;record(5);}}break;case's':case'S':if(map[x+1][y]==0||map[x+1][y]==4){map[x][y]-=2;map[x+1][y]+=2;record(2);}elseif(map[x+1][y]==3||map[x+1][y]==7){if(map[x+2][y]==0||map[x+2][y]==4){map[x][y]-=2;map[x+1][y]-=1;map[x+2][y]+=3;record(3);}}break;case'd':case'D':if(map[x][y+1]==0||map[x][y+1]==4){map[x][y]-=2;map[x][y+1]+=2;record(6);}elseif(map[x][y+1]==3||map[x][y+1]==7){if(map[x][y+2]==0||map[x][y+2]==4){map[x][y]-=2;map[x][y+1]-=1;map[x][y+2]+=3;record(7);}}break;//如果方向键盘上下左右72807577case'r':case'R':recall();break;default:break;}}voidwin(){intboxNum=0;for(inti=0;i<8;i++){for(intj=0;j<10;j++){if(map[i][j]==3){boxNum++;if(map[i-1][j]==1||map[i+1][j]==1)//上下至少一睹墙{if(map[i][j-1]==1||map[i][j+1]==1){flag=-1;return;}}}}}if(boxNum==0){flag=1;//所有的箱子都推到目的地上游戏赢return;}flag=0;}intmain(){mciSendString(L"open遥远的你.mp3",0,0,0);mciSendString(L"play遥远的你.mp3",0,0,0);initgraph(500,400);loadimage(&img[0],L"素材/背景.jpg",500,400);loadimage(&img[1],L"素材/墙.jpg",50,50);loadimage(&img[2],L"素材/人物.jpg",50,50);loadimage(&img[3],L"素材/箱子.jpg",50,50);loadimage(&img[4],L"素材/目的地.jpg",50,50);loadimage(&img[5],L"素材/源氏.jpg",50,50);loadMap();//加载第一关while(1){drawMap();//画图play();win();if(flag==0)//没输没赢继续{}elseif(flag==1)//{level++;//关卡加1下一关times=0;//清空回撤记录drawMap();if(level==2){MessageBox(GetHWnd(),L"游戏结束",L"恭喜",MB_OK);break;//结束}else{if(MessageBox(GetHWnd(),L"是否进入下一关?",L"恭喜",MB_OKCANCEL)==IDOK)//IDCANCEL要么好要么不好{loadMap();flag=0;}elsebreak;}}else{drawMap();if(MessageBox(GetHWnd(),L"是否重新玩?",L"抱歉",MB_OKCANCEL)==IDOK){//level=0;//从最初的那关开始玩times=0;loadMap();//重新加载新地图}elsebreak;}}//getchar();closegraph();return0;}
推箱子代码

扫雷

扫雷素材:

https://pan.baidu.com/s/1oAAuPHCzfxiLggQuB7wFfw

密码:5rxd

c语言推箱子 扫雷项目-LMLPHPc语言推箱子 扫雷项目-LMLPHP
  1 #include<stdio.h>
  2 #include<graphics.h>
  3 #include<stdlib.h>
  4 #include<time.h>
  5 #include<Windows.h>
  6 #include<mmsystem.h>
  7 #pragma comment(lib,"WINMM.LIB")
  8
  9 void drawMap(int map[][15], IMAGE img[]);
 10 void init(int map[][15], IMAGE img[],int bobNum);
 11 int play(int map[][15]);
 12 int open(int map[][15], int x, int y);//打开0周围的一片
 13 int main()
 14 {
 15     mciSendString(L"open  遥远的你.mp3", 0, 0, 0);
 16     mciSendString(L"play  遥远的你.mp3", 0, 0, 0);
 17     int map[10][15] = {0};
 18     srand((unsigned)time(NULL));
 19     int bobNum = rand() % 10 + 10;
 20     IMAGE img[12];
 21     init(map, img,bobNum);
 22     initgraph(15*50, 10*50);//图形库窗口
 23
 24     int num,sum=0;
 25     while (1)
 26     {
 27         drawMap(map, img);
 28         num=play(map);
 29         sum += num;
 30         if (num == -1)
 31         {
 32             drawMap(map, img);
 33             MessageBox(GetHWnd(), L"踩到雷了", L"BOOM", MB_OK);
 34             break;
 35         }
 36         else if (sum==15*10-bobNum)//是不是踩完了 踩的总个数==地图大小-雷的个数
 37         {
 38             drawMap(map, img);
 39             MessageBox(GetHWnd(), L"恭喜", L"GOOD", MB_OK);
 40             break;
 41         }
 42     }
 43     closegraph();
 44     return 0;
 45 }
 46 //画图函数 作用画图 是否需要返回值?
 47 void drawMap(int map[][15],IMAGE img[])
 48 {
 49     for (int i = 0; i < 10; ++i)
 50     {
 51         for (int j = 0; j < 15; ++j)
 52         {
 53             if (map[i][j] >= -1 && map[i][j] <= 8)//没有分开
 54             {
 55                 putimage(j * 50, i * 50, &img[10]);
 56             }
 57             else if (map[i][j]>18)
 58             {
 59                 putimage(j * 50, i * 50, &img[11]);
 60             }
 61             else
 62             switch (map[i][j])
 63             {
 64             case 9://
 65                 putimage(j * 50, i * 50, &img[9]);break;
 66             case 10:putimage(j * 50, i * 50, &img[0]); break;
 67             case 11:putimage(j * 50, i * 50, &img[1]); break;
 68             case 12:putimage(j * 50, i * 50, &img[2]); break;
 69             case 13:putimage(j * 50, i * 50, &img[3]); break;
 70             case 14:putimage(j * 50, i * 50, &img[4]); break;
 71             case 15:putimage(j * 50, i * 50, &img[5]); break;
 72             case 16:putimage(j * 50, i * 50, &img[6]); break;
 73             case 17:putimage(j * 50, i * 50, &img[7]); break;
 74             case 18:putimage(j * 50, i * 50, &img[8]); break;
 75             default:
 76                 break;
 77             }
 78         }
 79     }
 80 }
 81 void init(int map[][15], IMAGE img[], int bobNum)
 82 {
 83
 84     int x, y;
 85     for (int i = 0; i < bobNum;)
 86     {
 87         x = rand() % 10;
 88         y = rand() % 15;
 89         if (map[x][y] == 0)//这个位置没有雷
 90         {
 91             map[x][y] = -1;//随机位置放一个雷
 92             ++i;
 93         }
 94
 95     }
 96     for (int i = 0; i < 10; ++i)
 97     {
 98         for (int j = 0; j < 15; ++j)
 99         {
100             if (map[i][j] == -1)
101             {
102                 //给上下左右加上1
103                 for (int x = i - 1; x <= i + 1; ++x)
104                 {
105                     for (int y = j - 1; y <= j + 1; ++y)
106                     {
107                         if (x >= 0 && x<10 && y >= 0 && y < 15 && map[x][y] != -1)
108                         {
109                             map[x][y]++;//不是雷的位置加1
110                         }
111                     }
112                 }
113             }
114         }
115     }
116     //for (int i = 0; i < 10; ++i)
117     //{
118     //    for (int j = 0; j < 15; ++j)
119     //    {
120     //        printf("%d\t", map[i][j]);
121     //    }
122     //    printf("\n");
123     //}
124     loadimage(&img[0], L"素材2/space.jpg", 50, 50);
125     loadimage(&img[1], L"素材2/1.jpg", 50, 50);
126     loadimage(&img[2], L"素材2/2.jpg", 50, 50);
127     loadimage(&img[3], L"素材2/3.jpg", 50, 50);
128     loadimage(&img[4], L"素材2/4.jpg", 50, 50);
129     loadimage(&img[5], L"素材2/5.jpg", 50, 50);
130     loadimage(&img[6], L"素材2/6.jpg", 50, 50);
131     loadimage(&img[7], L"素材2/7.jpg", 50, 50);
132     loadimage(&img[8], L"素材2/8.jpg", 50, 50);
133     loadimage(&img[9], L"素材2/hitmine.jpg", 50, 50);//
134     loadimage(&img[10], L"素材2/stone.jpg", 50, 50);//石头
135     loadimage(&img[11], L"素材2/flag.jpg", 50, 50);//旗帜
136
137 }
138 //play 1.有没有踩到雷 2.点开几个位置(翻开了几次)
139 int play(int map[][15])
140 {
141     MOUSEMSG msg;//保存鼠标信息
142     while (1)
143     {
144         msg = GetMouseMsg();//获取鼠标信息
145         int i, j;
146         switch (msg.uMsg)
147         {
148         case WM_LBUTTONDOWN://左键按下
149             //左键按下的位置是属于数组的哪个元素
150             i = msg.y / 50;
151             j = msg.x / 50;
152             //-1~8之间的数字 表示没有翻开
153             //9~18之间的数字 表示翻开
154             //-1+10-->9
155             //写标记 只有没有翻开的位置才可以标记 标记+20
156             //19~28 表示这个位置是标记过的
157             if (map[i][j] == 0)
158             {
159                 int num=open(map, i, j);
160                 //for (int x = i - 1; x <= i + 1; ++x)
161                 //{
162                 //    for (int y = j - 1; y <= j + 1; ++y)
163                 //    {
164                 //        if (x >= 0 && x < 10 && y >= 0 && y < 15)//判断是否越界
165                 //        {
166                 //            if (map[x][y] <= 8 && map[x][y] >= -1)//判断是否翻开
167                 //            {
168                 //                map[x][y] += 10;//翻开周围一片
169                 //            }
170                 //        }
171                 //    }
172                 //}
173                 return num;
174             }
175             if (map[i][j] <= 8 && map[i][j] >= 1)//能不能点开
176             {
177                 map[i][j] += 10;
178                 return 1;
179             }//
180             else if (map[i][j] == -1)
181             {
182                 map[i][j] += 10;
183                 return -1;
184             }
185                 break;
186         case WM_RBUTTONDOWN://鼠标右键按下
187             i = msg.y / 50;
188             j = msg.x / 50;
189             //如果已经标记了的 可以取消标记
190             //如果是没有标记过  并且没有翻开的 点开标记
191             if (map[i][j] <= 8 && map[i][j] >= -1)
192             {
193                 map[i][j] += 20;
194                 return 0;
195             }
196             else if (map[i][j] >= 18)
197             {
198                 map[i][j] -= 20;
199                 return 0;
200             }
201         default:
202             break;
203         }
204     }
205 }
206 int open(int map[][15], int x, int y)
207 {
208     int num = 1;
209     map[x][y] += 10;
210     for (int i = x - 1; i <= x + 1; ++i)
211     {
212         for (int j = y - 1; j <= y + 1; ++j)
213         {
214             if (i >= 0 && i<10 && j>=0 && j < 15)
215             {
216                 if (map[i][j] == 0)
217                 {
218                     num+=open(map, i, j);//如果周围有0那么翻开周围的0
219                 }
220                 else if (map[i][j] >= -1 && map[i][j] <= 8)
221                 {
222                     map[i][j] += 10;
223                     num++;
224                 }
225             }
226         }
227     }
228     return num;
229 }
230 //获取鼠标信息方法
231 //        WM_MOUSEMOVE        鼠标移动
232 //        WM_MOUSEWHEEL        鼠标滚轮拨动
233 //        WM_LBUTTONDOWN        左键按下
234 //        WM_LBUTTONUP        左键弹起
235 //        WM_LBUTTONDBLCLK    左键双击
236 //        WM_MBUTTONDOWN        中键按下
237 //        WM_MBUTTONUP        中键弹起
238 //        WM_MBUTTONDBLCLK    中键双击
239 //        WM_RBUTTONDOWN        右键按下
240 //        WM_RBUTTONUP        右键弹起
241 //        WM_RBUTTONDBLCLK    右键双击
View Code
03-02 06:19