推箱子
两关的推箱子用到一个三维数组
用到的图片数据如下
https://pan.baidu.com/s/1IDE4GQLo46cxNywDqwxmlQ
密码:jdel
代码如下:
#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
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 右键双击