C++学习(九)之 项目 推箱子游戏
程序员文章站
2022-04-14 23:05:26
游戏制作 推箱子 步骤分析 1、模板 2、模板分析 组成元素: 空地 墙 人 目的地 箱子 背景 3、如何操作 通过WASD键盘操作人,推着箱子,到达目的地,游戏结束,如果箱子卡在死角则游戏失败 4、如何绘制地图 通过数组来存储绘制 数组中 0表示空地 1表示墙 2表示人 3表示箱子 4表示目的地 ......
游戏制作 推箱子
步骤分析
1、模板
2、模板分析
组成元素:
空地 墙 人 目的地 箱子 背景
3、如何操作
通过WASD键盘操作人,推着箱子,到达目的地,游戏结束,如果箱子卡在死角则游戏失败
4、如何绘制地图
通过数组来存储绘制
数组中 0表示空地
1表示墙
2表示人
3表示箱子
4表示目的地
移动时
人在目的地上:人+目的地=2+4=6
箱子在目的地上:箱子+目的地=3+4+7
(⊙o⊙)…额 大概就这样吧 (其实就是自己做的时候的一些笔记,以后用的时候再看吧)
1 //事先先改多字节 2 #include<stdio.h>//预处理头文件 3 #include<conio.h>//控制台输入输出,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作 4 #include<graphics.h>//图形库 头文件 5 #include<mmsystem.h>//多媒体库头文件 6 #pragma comment(lib,"winmm.lib")//多媒体库 7 8 /* 9 1.音乐播放 10 mciSendString mp3 wav格式音乐 音乐不要用网易云下载 11 #include<mmsystem.h>//多媒体库头文件 12 #pragma comment(lib,"winmm.lib")//多媒体库 13 PlaySound 只能播放WAV格式音乐 14 2.推箱子 素材:照片-->jpg或者bmp格式 音乐 15 图形库 16 17 18 推箱子的流程-->地图-->推动箱子-->箱子到目的地的时候 游戏结束 19 20 操作 每一个操作对应一个函数 21 1、准备工作 地图 素材 22 2、推箱子 23 3、判断游戏是否结束 24 数据存放部分 25 推箱子 26 空地0 墙1 人2 箱子3 目的地4 (用数组存储) 27 人在目的地上:人+目的地=2+4=6 28 箱子在目的地上:箱子+目的地=3+4+7 29 30 31 32 */ 33 34 int map[8][8] = { 35 0, 0, 1, 1, 1, 0, 0, 0, 36 0, 0, 1, 4, 1, 0, 0, 0, 37 0, 0, 1, 0, 1, 1, 1, 1, 38 1, 1, 1, 3, 0, 3, 4, 1, 39 1, 4, 0, 3, 2, 1, 1, 1, 40 1, 1, 1, 1, 3, 1, 0, 0, 41 0, 0, 0, 1, 4, 1, 0, 0, 42 0, 0, 0, 1, 1, 1, 0, 0 43 };//8行8列的地图 0空地 1墙 2人 3箱子 4目的地 44 //8*8的地图-->每张图片大小80*80 地图总大小640*640 45 IMAGE img[6];//总共6张素材 用数组存放 46 47 void init()//自定义的函数 用来加载素材 全局 所有人都可以用 48 { 49 //加载图片 窗口大小640*640 小格子的大小80*80 50 loadimage(&img[0], "背景.jpg"); 51 loadimage(&img[1], "目的地.jpg",80,80);//箱子推到目的地上 52 loadimage(&img[2], "墙.jpg",80,80); 53 loadimage(&img[3], "人物.jpg",80,80); 54 loadimage(&img[4], "箱子.jpg",80,80); 55 loadimage(&img[5], "源氏.jpg",80,80);//空的目的地 56 57 } 58 void drawMap()//画地图 59 { 60 putimage(0,0,&img[0]); 61 for (int i = 0; i < 8; ++i)//数组大小是8 62 { 63 for (int j = 0; j < 8; ++j) 64 { 65 switch (map[i][j])//循环遍历数组 66 { 67 case 0://空地 不贴图 68 break; 69 case 1://墙 70 putimage(i * 80, j * 80, &img[2]);//用来贴图的 前面两个是坐标(图形库的坐标) 71 break; 72 case 2://人 73 putimage(i * 80, j * 80, & img[3]); 74 break; 75 case 3://箱子 76 putimage(i * 80, j * 80, &img[4]); 77 break; 78 case 4://目的地 79 putimage(i * 80, j * 80, &img[5]); 80 break; 81 case 6://人+目的地 82 putimage(i * 80, j * 80, &img[3]); 83 break; 84 case 7://箱子+目的地 85 putimage(i * 80, j * 80, &img[1]); 86 break; 87 } 88 } 89 } 90 } 91 void play()//操作部分 92 { 93 int x, y;//找人物位置 94 for (int i = 0; i < 8; ++i) 95 { 96 for (int j = 0; j < 8; ++j) 97 { 98 if (map[i][j] == 2||map[i][j]==6)//等于2或6 找到人 99 { 100 x = i; 101 y = j;//保存了人的位置 102 } 103 } 104 } 105 //然后判断用户输入 106 //getch-->获取用户按键 conion.h 107 switch (getch())//人移动时遇到墙不能动 108 { 109 case 'w'://往上 可能是空地可能是墙 可能是箱子 //可能是目的地 可能是箱子加目的地 110 case 'W': 111 if (map[x][y - 1] == 0 || map[x][y - 1] == 4) 112 { 113 map[x][y] -= 2; 114 map[x][y - 1] += 2; 115 } 116 else if (map[x][y - 1] == 3 || map[x][y - 1] == 7) 117 { 118 if (map[x][y - 2] == 0 || map[x][y - 2] == 4) 119 { 120 map[x][y] -= 2; 121 map[x][y - 1] -= 1; 122 map[x][y - 2] += 3; 123 } 124 } 125 break; 126 127 128 case 's'://往下 129 case 'S': 130 if (map[x][y + 1] == 0 || map[x][y + 1] == 4) 131 { 132 map[x][y] -= 2; 133 map[x][y + 1] += 2; 134 } 135 else if (map[x][y + 1] == 3 || map[x][y + 1] == 7) 136 { 137 if (map[x][y + 2] == 0 || map[x][y + 2] == 4) 138 { 139 map[x][y] -= 2; 140 map[x][y + 1] -= 1; 141 map[x][y + 2] += 3; 142 } 143 } 144 break; 145 146 case 'a'://往左 147 case 'A': 148 if (map[x - 1][y] == 0 || map[x - 1][y] == 4)//上方是空地或者是目的地 149 { 150 map[x][y] -= 2;//相当于map[x][y]=map[x][y]-2; 151 map[x - 1][y] += 2;//人往上走 152 } 153 else if (map[x - 1][y] == 3 || map[x - 1][y] == 7)//人的上方是箱子或是箱子加目的地 154 { 155 if (map[x - 2][y] == 0 || map[x - 2][y] == 4)//箱子上方是空地 可以推动 156 { 157 map[x][y] -= 2;//人往上走 158 map[x - 1][y] -= 1;//人来了+2 箱子上去了-3 所以就是 -3+2=-1 159 map[x - 2][y] += 3;//箱子往上走 160 } 161 } 162 break; 163 164 case 'd'://往右 165 case 'D': 166 if (map[x + 1][y] == 0 || map[x + 1][y] == 4) 167 { 168 map[x][y] -= 2; 169 map[x + 1][y] += 2; 170 } 171 else if (map[x + 1][y] == 3 || map[x + 1][y] == 7) 172 { 173 if (map[x + 2][y] == 0 || map[x + 2][y] == 4) 174 { 175 map[x][y] -= 2; 176 map[x + 1][y] -= 1; 177 map[x + 2][y] += 3; 178 } 179 } 180 break; 181 182 } 183 184 185 } 186 void gameOver() 187 { 188 //什么时候游戏结束 189 //1、赢 所有的箱子全部推到目的地上-->外面没有箱子 190 //2、输 有箱子没有推到目的地上 或者游戏超时 191 int flag = 0; 192 for (int i = 0; i < 8; ++i) 193 { 194 for (int j = 0; j < 8; ++j) 195 { 196 if (map[i][j] == 3)//找到了箱子 游戏还没有赢 197 { 198 ++flag; 199 if (map[i - 1][j] == 1 || map[i + 1][j] == 1)//上方或者下方有一个 200 { 201 if (map[i][j - 1] == 1 || map[i][j + 1] == 1)//左右有一个 202 { 203 //游戏结束 输 204 MessageBox(GetHWnd(),"输","sad",MB_OK); 205 closegraph(); 206 exit(0); 207 } 208 } 209 } 210 } 211 } 212 if (flag == 0) 213 { 214 //没有箱子 游戏结束 215 //return 216 MessageBox(GetHWnd(), "赢", "GOOD", MB_OK); 217 //第一个参数 句柄(可以理解为指向窗口的指针) 作用让窗口置前 可以为空写NULL或0 218 //第二个是文本 第三个是标题 第四个是按钮 219 closegraph(); 220 exit(0);//表示退出程序 221 } 222 223 } 224 225 226 int main() 227 { 228 //音乐播放示例1 229 //mciSendString("open bgm.mp3",0,0,0);//打开音乐 230 //mciSendString("play bgm.mp3 repeat",0,0,0);//先打开 然后播放 repeat 循环播放 231 //关闭音乐 stop 暂停音乐 pause 232 //音乐播放示例2 233 mciSendString("open bgm.mp3 alias bgm", 0, 0, 0);//打开音乐 alias bgm取一个名字 234 mciSendString("play bgm repeat", 0, 0, 0);//先打开 然后播放 repeat 循环播放 235 236 initgraph(640,640);//创建窗口 237 init();//加载图片 238 239 //开始界面================================ 240 putimage(0,0,&img[0]);//背景图 241 settextstyle(40, 0, "宋体"); 242 settextcolor(BLACK); 243 setbkmode(TRANSPARENT);//字体背景透明 244 //或者 setbkmode(1);设置背景模式 set background mode 245 246 rectangle(200,200,400,400); 247 outtextxy(200, 200, "开始游戏"); 248 MOUSEMSG msg; 249 int flag = 1; 250 while (flag) 251 { 252 msg = GetMouseMsg();//获取鼠标消息 253 switch ((msg.uMsg))//判断鼠标消息 254 { 255 case WM_LBUTTONDOWN://左键按下 256 if (msg.x > 200 && msg.x<400 && msg.y>200 && msg.y < 400) 257 { 258 //点击的区域在方框之内 可以退出循环 259 flag = 0; 260 } 261 262 default: 263 break; 264 } 265 } 266 //outtextxy(400,400,"按任意键开始游戏"); 267 //getch(); 268 269 270 /* 271 鼠标操作 272 MouseHit() 判断是否存在鼠标消息 273 MOUSEMSG 类型 存放鼠标信息 274 GetMouseMsg() 获取鼠标信息的函数 275 */ 276 //========================================= 277 278 drawMap(); 279 while (1)//循环 函数调用 280 { 281 play(); 282 drawMap(); 283 gameOver(); 284 } 285 getchar(); 286 closegraph(); 287 return 0; 288 } 289 290
运行结果
2018.05.23 12:26:26
上一篇: Spring -- AOP
下一篇: 函数定义、返回值、函数参数