zoukankan      html  css  js  c++  java
  • C++学习(九)(C语言部分)之 项目 推箱子游戏

     游戏制作 推箱子

    步骤分析

    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

  • 相关阅读:
    23种设计模式之过滤模式
    23种设计模式之建造者模式
    23种设计模式之桥接模式
    23种设计模式之策略模式
    Redis缓存相关问题
    docker命令大全
    过滤器filter和springmvc拦截器的区别及实现
    23种设计模式之装饰器模式
    Model ModelMap ModelView三者的区别你造吗
    解决并发问题的一般思路及使用redis实现秒杀
  • 原文地址:https://www.cnblogs.com/Yuuki-/p/9076306.html
Copyright © 2011-2022 走看看