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

  • 相关阅读:
    真正的e时代
    在线手册
    UVA 10616 Divisible Group Sums
    UVA 10721 Bar Codes
    UVA 10205 Stack 'em Up
    UVA 10247 Complete Tree Labeling
    UVA 10081 Tight Words
    UVA 11125 Arrange Some Marbles
    UVA 10128 Queue
    UVA 10912 Simple Minded Hashing
  • 原文地址:https://www.cnblogs.com/Yuuki-/p/9076306.html
Copyright © 2011-2022 走看看