找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7810|回复: 0
收起左侧

C++初学推箱子小游戏(代码有详细介绍,通俗易懂)

[复制链接]
ID:267479 发表于 2018-5-23 16:13 | 显示全部楼层 |阅读模式
C++初学者参考学习,代码有详细介绍。一般都能看懂
  1. #include<stdio.h>
  2. #include<conio.h>// getch头文件
  3. #include<graphics.h> //图形库头文件
  4. #include<mmsystem.h>
  5. #pragma comment(lib,"winmm.lib")//多媒体库
  6. /*
  7. 音乐播放 mciSendString MP3 wav 格式音乐   需要加这个头文件及库
  8. #include<mmsystem.h>
  9. #pragma comment(lib,"winmm.lib")//多媒体库
  10. */
  11. /*
  12. 鼠标操作
  13.         MouseHit()   判断是否存在鼠标消息
  14.         MOUSEMSG          类型   存放鼠标消息
  15.         GetMouseMsg() 获取鼠标信息的函数

  16. */
  17. //人2 箱子3 目的地4 空地0 墙1
  18. //人+目的地 2+4  6
  19. int map[8][8] = {
  20.         0,0,1,1,1,0,0,0,
  21.         0,0,1,4,1,0,0,0,
  22.         0,0,1,0,1,1,1,1,
  23.         1,1,1,3,0,3,4,1,
  24.         1,4,0,3,2,1,1,1,
  25.         1,1,1,1,3,1,0,0,
  26.         0,0,0,1,4,1,0,0,
  27.         0,0,0,1,1,1,0,0
  28. };
  29. //8*8地图  总大小640*640
  30. IMAGE img[6];//六张素材
  31. void init()//加载素材
  32. {
  33.         //加载图片
  34.         loadimage(&img[0], "素材/背景.jpg",640,640);
  35.         loadimage(&img[1], "素材/目的地.jpg",80,80);//箱子推到目的地上
  36.         loadimage(&img[2], "素材/墙.jpg", 80, 80);
  37.         loadimage(&img[3], "素材/人物.jpg", 80, 80);
  38.         loadimage(&img[4], "素材/箱子.jpg", 80, 80);
  39.         loadimage(&img[5], "素材/源氏.jpg", 80, 80);//空的目的地
  40. }
  41. void drawMap()        //画地图
  42. {
  43.         putimage(0, 0, &img[0]);
  44.         for (int i = 0; i < 8; ++i)
  45.         {
  46.                 for (int j = 0; j < 8; ++j)
  47.                 {
  48.                         switch (map[i][j])        //遍历数组
  49.                         {
  50.                         case 0:
  51.                                 break;
  52.                         case 1:
  53.                                 putimage(j * 80, i * 80, &img[2]);//贴图 墙
  54.                                 break;
  55.                         case 2:
  56.                                 putimage(j * 80, i * 80, &img[3]);//贴图 人物
  57.                                 break;
  58.                         case 3:
  59.                                 putimage(j * 80, i * 80, &img[4]);//贴图 箱子
  60.                                 break;
  61.                         case 4:
  62.                                 putimage(j * 80, i * 80, &img[5]);//贴图 空目的地
  63.                                 break;
  64.                         case 6:
  65.                                 putimage(j * 80, i * 80, &img[3]);//贴图 人物
  66.                                 break;
  67.                         case 7:
  68.                                 putimage(j * 80, i * 80, &img[1]);//贴图 目的地
  69.                                 break;

  70.                         }
  71.                 }
  72.         }
  73. }
  74. void play()//操作部分
  75. {
  76.         int x, y;        //找到人物的位置
  77.         for (int i = 0; i < 8; ++i)
  78.         {
  79.                 for (int j = 0; j < 8; ++j)
  80.                 {
  81.                         if (map[i][j] == 2 || map[i][j] == 6)        //循环找到人的位置
  82.                         {
  83.                                 x = i;
  84.                                 y = j;        //保存人的位置
  85.                         }
  86.                 }
  87.         }
  88.         /*//然后判断用户输入
  89.         getch获取一个字符来操作*/
  90.         switch (getch())
  91.         {
  92.         case 'W':
  93.         case 'w'://往上
  94.                 if (map[x - 1][y] == 0 || map[x - 1][y] == 4)//上方是空地或者是空的目的地
  95.                 {
  96.                         map[x][y] -= 2; //map[x][y]=map[x][y]-2
  97.                         map[x - 1][y] += 2;//人往上走
  98.                 }
  99.                 else if (map[x - 1][y] == 3 || map[x - 1][y] == 7)//人的上方是箱子或箱子+目的地
  100.                 {
  101.                         if (map[x - 2][y] == 0 || map[x - 2][y] == 4)//箱子上方是空地 推动
  102.                         {
  103.                                 map[x][y] -= 2;        //人往上走               
  104.                                 map[x - 1][y] -= 1;//人来了+2 箱子上去了-3
  105.                                 map[x - 2][y] += 3;//箱子往上推
  106.                         }
  107.                 }
  108.                 break;
  109.         case 'A':
  110.         case'a':        //往左
  111.                 if (map[x][y - 1] == 0 || map[x][y - 1] == 4)//
  112.                 {
  113.                         map[x][y] -= 2; //map[x][y]=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.         case 'D':
  127.         case 'd':        //往右
  128.                 if (map[x][y + 1] == 0 || map[x][y + 1] == 4)//
  129.                 {
  130.                         map[x][y] -= 2; //map[x][y]=map[x][y]-2
  131.                         map[x][y + 1] += 2;//
  132.                 }
  133.                 else if (map[x][y + 1] == 3 || map[x][y + 1] == 7)//
  134.                 {
  135.                         if (map[x][y + 2] == 0 || map[x][y + 2] == 4)//
  136.                         {
  137.                                 map[x][y] -= 2;        //人               
  138.                                 map[x][y + 1] -= 1;//
  139.                                 map[x][y + 2] += 3;//
  140.                         }
  141.                 }

  142.                 break;
  143.         case 'S':
  144.         case 's':        //往下
  145.                 if (map[x + 1][y] == 0 || map[x + 1][y] == 4)//
  146.                 {
  147.                         map[x][y] -= 2; //map[x][y]=map[x][y]-2
  148.                         map[x + 1][y] += 2;//
  149.                 }
  150.                 else if (map[x + 1][y] == 3 || map[x + 1][y] == 7)//
  151.                 {
  152.                         if (map[x + 2][y] == 0 || map[x + 2][y] == 4)//
  153.                         {
  154.                                 map[x][y] -= 2;        //人               
  155.                                 map[x + 1][y] -= 1;//
  156.                                 map[x + 2][y] += 3;//
  157.                         }
  158.                 }
  159.                 break;
  160.         }
  161. }
  162. void gameOver()            //通关提示
  163. {
  164.         int flag=0;
  165.         for (int i = 0; i < 8; ++i)
  166.         {
  167.                 for (int j = 0; j < 8; ++j)
  168.                 {
  169.                         if (map[i][j] == 3)//找到箱子
  170.                         {
  171.                                 ++flag;
  172.                                 if (map[i - 1][j] == 1 || map[i + 1][j] == 1)        //判断 输
  173.                                 {
  174.                                         if (map[i][j - 1] == 1 || map[i][j - 1] == 1)
  175.                                         {
  176.                                                 MessageBox(GetHWnd(), "输", "sad", MB_OK);
  177.                                                 closegraph();
  178.                                                 exit(0);
  179.                                         }
  180.                                 }
  181.                         }
  182.                 }
  183.         }
  184.         if(flag==0)
  185.         {
  186.                 MessageBox(GetHWnd(), "赢", "GOOD", MB_OK);
  187.                 //第一个参数:句柄   作用:让窗口置前,也可以写NULL
  188.                 //第四个是按钮
  189.                 closegraph();//关闭窗口
  190.                 exit(0);
  191.         }
  192. }
  193. int main()
  194. {
  195. #if 0        //音乐播放
  196.         //mciSendString("open 素材/bgm.mp3",0,0,0);//打开音乐
  197.         //mciSendString("play 素材/bgm.mp3",0,0,0);//播放音乐 只播放一次
  198.         //mciSendString("play 素材/bgm.mp3 repeat",0,0,0);//repeat循环播放音乐
  199.         mciSendString("open 素材/bgm.mp3 alias bgm", 0, 0, 0);//打开音乐 alias bgm给这个取个别名bgm
  200.         mciSendString("play bgm",0,0,0);//播放音乐 只播放一次
  201.         /*
  202.         关闭音乐 stop
  203.         暂停 pause
  204.          */
  205. #endif
  206.         initgraph(640, 640);//创建640*640窗口
  207.         init();
  208.         //开始界面++++++++++=======================
  209.         putimage(0, 0, &img[0]);//背景图
  210.         settextstyle(40, 0, "宋体");
  211.         settextcolor(BLACK);
  212.         //setbkmode(TRANSPARENT); //字体背景透明
  213.         setbkmode(1);//字体背景透明
  214.         rectangle(200, 200, 400, 400);//画矩形
  215.         outtextxy(200, 200, "开始游戏");
  216.         MOUSEMSG msg ;
  217.         int flag = 1;
  218.         while (flag)
  219.         {
  220.                 msg = GetMouseMsg();//获取鼠标消息
  221.                 switch (msg.uMsg)
  222.                 {
  223.                 case WM_LBUTTONDOWN://左键按下
  224.                         if (msg.x > 200 && msg.x<400 && msg.y>200 && msg.y < 400)
  225.                         {
  226.                                 //点击的区域在方框之内,可以退出循环
  227.                                 flag = 0;
  228.                         }
  229.                         break;
  230.                 default:
  231.                         break;
  232.                 }
  233.         }
  234.         
  235.         
  236.         drawMap();
  237.         while (1)
  238.         {
  239.                 play();
  240.                 drawMap();
  241.                 gameOver();
  242.         }


  243.         getchar();
  244.         closegraph();//关闭窗口
  245.         return 0;
  246. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表