栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++推箱子游戏小作业

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++推箱子游戏小作业

#include

//#include

#include

#include //getch头文件 用来读取用户的按键

 

//放音乐 加上下面这个

#include //windows.h要加

#pragma comment(lib,"WINMM.LIB")

//-----------------------------------------------------

 

//空地 0 墙 1 箱子 2 人物 3 目的地 4

//人可以占在目的地上-->3+4-->7

//箱子推到目的地 2+4-->6

//----------------------------------------------------

int map[6][12]={

  0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,

  1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1,

  1, 0, 0, 0, 1, 1, 1, 1, 2, 2, 0, 1,

  1, 0, 0, 3, 6, 4, 4, 4, 2, 0, 0, 1,

  1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1,

  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0

};//准备地图

 

IMAGE img[6];//需要6张图片 bmp jpg 

int flag;

//----------------------------------------------------------

void drawMap()//自己写一个贴图函数 用来画地图

{

 BeginBatchDraw();//防止贴图过快出现的 闪的情况

 putimage(0, 0, &img[0]);//加上背景图

 for (int i = 0; i < 6; ++i)//行

 {

  for (int j = 0; j < 12; ++j)//列

  {

   //单独贴图(有图片才能贴图)

   //这个位置需要将图片和地图的元素对应

   switch (map[i][j])

   {

   //case 0:break;

   case 1://墙

    putimage(j * 50, i * 50, &img[1]);

    break;

   case 2://箱子

    putimage(j * 50, i * 50, &img[2]);

    break;

   case 3://人

    putimage(j * 50, i * 50, &img[3]);

    break;

   case 4://目的地

    putimage(j * 50, i * 50, &img[4]);

    break;

   case 6://箱子在目的地上

    putimage(j * 50, i * 50, &img[5]);

    break;

   case 7://人在目的地上

    putimage(j * 50, i * 50, &img[3]);

    break;

   default:

    break;

   }

  }

 }

 EndBatchDraw();

}

void play()//让用户操作

{

 //第一步 先找人的位置

 int x, y;

 for (int i = 0; i < 6; ++i)

 {

  for (int j = 0; j < 12; ++j)

  {

   if (map[i][j] == 3 || map[i][j] == 7)

   {

    x = i;

    y = j;

   }

  }

 }

 //接下来等待用户操作 wasd getch()直接读取一个按键消息

 switch (getch())

 {

 case'W':

 case 'w':

  //往上

  if (map[x - 1][y] == 0 || map[x - 1][y] == 4)//人的上方是空地或者目的地 可以直接走上去

  {

   map[x - 1][y] += 3; //人走上去 +3

   map[x][y] -= 3; //原位置减掉3

  }

  else if (map[x - 1][y] == 2 || map[x - 1][y] == 6)//上方是箱子或者箱子在目的地上

  {

   if (map[x - 2][y] == 0 || map[x - 2][y] == 4)//箱子上方是空地

   {

    //人走上去 箱子也推上去

    map[x - 2][y] += 2;

    map[x - 1][y] += 1; //-2 +3

    map[x][y] -= 3;

   }

  }

  break;

 case 'S':

 case 's':

  //往下

  if (map[x + 1][y] == 0 || map[x + 1][y] == 4)

  {

   map[x + 1][y] += 3; 

   map[x][y] -= 3;  

  }

  else if (map[x + 1][y] == 2 || map[x + 1][y] == 6)

  {

   if (map[x + 2][y] == 0 || map[x + 2][y] == 4)

   {

    map[x + 2][y] += 2;

    map[x + 1][y] += 1; 

    map[x][y] -= 3;

   }

  }

  break;

 case 'A':

 case 'a':

  //往左

  if (map[x][y - 1] == 0 || map[x][y - 1] == 4)

  {

   map[x][y - 1] += 3;

   map[x][y] -= 3;

  }

  else if (map[x][y - 1] == 2 || map[x][y - 1] == 6)

  {

   if (map[x][y - 2] == 0 || map[x][y - 2] == 4)

   {

    map[x][y - 2] += 2;

    map[x][y - 1] += 1;

    map[x][y] -= 3;

   }

  }

  break;

  break;

 case 'D':

 case 'd':

  //往右

  if (map[x][y + 1] == 0 || map[x][y + 1] == 4)

  {

   map[x][y + 1] += 3;

   map[x][y] -= 3;

  }

  else if (map[x][y + 1] == 2 || map[x][y + 1] == 6)

  {

   if (map[x][y + 2] == 0 || map[x][y + 2] == 4)

   {

    map[x][y + 2] += 2;

    map[x][y + 1] += 1;

    map[x][y] -= 3;

   }

  }

  break;

 //case 'Q':

 //case 'q':

 // //直接结束

 // exit(0);//stdlib.h

 // break;

 default:

  break;

 }

 

}

void judge()//判断游戏输赢

{

 //1 什么情况算输

 //2.什么时候算赢

 

 //赢 -->没有箱子 说明所有的箱子全部在目的地上

 //输的条件 1. 箱子推到角落上 推不出来

 //计时一分钟 超时结束

 //按Q 表示退出

 //规定30步以内 超过步数 直接结束

 flag = 2;//初值

 for (int i = 0; i < 6; ++i)//行

 {

  for (int j = 0; j < 12; ++j)//列

  {

   if (map[i][j] == 2)

   {

    flag = 0;

    //说明还没有结束

    //找到一个箱子 箱子是否在死角

    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;

     }

    }

   }

  }

 }

 

 //flag 值表示几种情况

 //flag=0 表示游戏可以继续

 //flag=1 表示输

 //flag=2 表示赢

}

//---------------------------------------------------------------

int main()

{

 //while (1)

 //{

 // printf("%dn", getch());

 //}

 

 mciSendString(L"open music.mp3 alias bgm", 0, 0, 0);//打开音乐

 mciSendString(L"play bgm repeat", 0, 0, 0);//播放音乐

 //alias mp3 给音乐取个名字

 //repeat 表示循环播放的意思

 

 

 

 initgraph(600,300);//每个方块的大小50*50 窗口大小就是600*300

 //加载素材

 loadimage(&img[0], L"背景.jpg");

 loadimage(&img[1], L"墙.jpg", 50, 50);//加载墙 大小是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);//箱子在目的地上

 

 while (1)

 {

  drawMap();

  judge();//判断一下 

  if (flag != 0) break;//看一下是否结束

  play();

 }

 

 if (flag == 1)

 { //Windos.h 但是加了图形库头文件 这个windows.h可以不加

  MessageBox(GetHWnd(), L"抱歉 输了", L"LOSE", MB_OK);

 }

 else

 {

  MessageBox(GetHWnd(), L"YOU WIN!", L"WIN", MB_OK);

 }

 

 getchar();

 closegraph();

 return 0;

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935646.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号