C++基于easyx图形库实现推箱子游戏

Posted 程序员编程指南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++基于easyx图形库实现推箱子游戏相关的知识,希望对你有一定的参考价值。

学习编程语言时,看视频看书的时候不是看看就过去了,编程毕竟是门一门手艺活,孰能生巧。

建议一边看,一边将视频中的示例或者小项目教学自己也实现一下,刚开始不会可以照着敲,比只看不动手强一百倍。

精心为学弟学妹整理了60个适合练手的C语言/C++项目,值得收藏!_程序员编程指南的博客-CSDN博客_适合大学生练手的编程项目

神级编程网站,堪称程序员的充电站,我给你找好了不能错过_程序员编程指南的博客-CSDN博客_程序员充电网站

这篇文章主要为大家详细介绍了C++基于easyx图形库实现推箱子游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C++实现推箱子游戏的具体代码,供大家参考,具体内容如下:

头文件:

#include<stdio.h>
#include<stdlib.h>
//#include<Windows.h>
#include<conio.h>
#include<graphics.h>
#include<stdbool.h>
 
//播放音乐需要的头文件
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
 
//格子边长
#define SPACE 60
 
//6.3.1 定义变量
IMAGE png[12];//5张图,定义5个变量,定义一个数组
 
#define MapMany 6
 
//枚举方向
enum CH 
 right = 1,
 left = 2,
 up = 3,
 down = 4
ch;
 
//定义一个全局三维数组
 
//0表示空地“ ”  1表示墙“■”  2代表目的地“⊙”  3代表人站在空地上“♀”  4代表箱子“□”
//5箱子与目的地重合“◆”  6,人站在目的地上“♀”
 
//下面定义地图
int map[MapMany][10][10] = 
 //图一
 
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ,
   1, 2, 0, 1, 1, 0, 0, 0, 2, 1 ,
   1, 0, 0, 1, 1, 0, 0, 0, 0, 1 ,
   1, 0, 0, 1, 1, 1, 1, 0, 4, 1 ,
   1, 0, 0, 1, 1, 1, 1, 0, 0, 1 ,
   1, 0, 0, 1, 1, 1, 0, 0, 0, 1 ,
   1, 0, 0, 1, 1, 1, 0, 0, 0, 1 ,
   1, 4, 0, 0, 0, 0, 0, 3, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ,
 ,
 //图二
 
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ,
   1, 0, 1, 2, 0, 0, 0, 4, 0, 1 ,
   1, 0, 1, 0, 0, 0, 0, 0, 0, 1 ,
   1, 0, 1, 0, 0, 1, 1, 0, 0, 1 ,
   1, 0, 1, 0, 0, 1, 1, 0, 0, 1 ,
   1, 0, 1, 1, 1, 1, 1, 0, 3, 1 ,
   1, 0, 1, 1, 1, 1, 1, 0, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 2, 0, 0, 4, 0, 0, 0, 0, 1 ,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ,
 ,
 //图三
 
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ,
   1, 2, 0, 1, 0, 0, 3, 0, 0, 1 ,
   1, 0, 0, 1, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 1, 1, 1, 1, 0, 0, 1 ,
   1, 4, 0, 1, 1, 1, 1, 0, 0, 1 ,
   1, 0, 0, 1, 1, 0, 0, 0, 4, 1 ,
   1, 0, 0, 1, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 0, 4, 0, 1, 0, 0, 1 ,
   1, 2, 0, 0, 0, 0, 1, 0, 2, 1 ,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ,
 ,
 //图四
 
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ,
 ,
 //图五
 
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ,
 ,
 //图六
 
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,
   0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,
 
;
 
//定义当前关卡
int WhatMap = 0;//初始化位第0张地图
 
void DrawMap(int n);
void initscreen();
void ManUp();
int KbHit();
void ManUp();
void ManRight();
void ManLeft();
void ManDown();
int GameOver();
void drawGame();

CPP文件:

#include"SokoBan.h"
 
int main()

 initscreen();
 //播放音乐
 mciSendString(TEXT("open sun.mp3 alias mysong"), NULL, 0, NULL);
 mciSendString(TEXT("play mySong"), NULL, 0, NULL);
 
 while (1)
 
  switch (KbHit())
  
  case 4:ManUp(); break;
  case 2:ManLeft(); break;
  case 1:ManRight(); break;
  case 3:ManDown(); break;
  //case 0:continue;
  
  drawGame();
  if (GameOver())
  
   WhatMap++;
   Sleep(1000);
  
  if (WhatMap == 3)break;
 
 loadimage(&png[7], _T("6.jpg"), 10*SPACE, 10*SPACE, true);
 putimage(0, 0, &png[7]);
 Sleep(10000);
 return 0;

 //system("pause");

 
//设置窗口大小
void initscreen()

 initgraph(10 * SPACE, 10 * SPACE );
 
 //6.3.2 加载图片
 
 //0表示空地“ ”  1表示墙“■”  2代表目的地“⊙”  3代表人站在空地上“♀”  4代表箱子“□”
 //5箱子与目的地重合“◆”  6,人站在目的地上“♀”
 loadimage(&png[0], _T("0.jpg"), SPACE, SPACE, true);
 loadimage(&png[1], _T("1.jpg"), SPACE, SPACE, true);
 loadimage(&png[2], _T("2.jpg"), SPACE, SPACE, true);
 loadimage(&png[3], _T("3.jpg"), SPACE, SPACE, true);
 loadimage(&png[4], _T("4.jpg"), SPACE, SPACE, true);
 loadimage(&png[5], _T("5.jpg"), SPACE, SPACE, true);
 loadimage(&png[6], _T("3.jpg"), SPACE, SPACE, true);
 
 
 //以下是windows窗口
 //system("mode con cols=20 lines=10");  //cols 代表列 //lines 代表行
 //           //设置标题
 //SetConsoleTitleA("推箱子");    //设置标题

//贴图
void drawGame() 
 for (int i = 0; i < 10; i++) //显示一行
  for (int j = 0; j < 10; j++) //显示一个格子
   putimage(j*SPACE, i*SPACE, &png[map[WhatMap][i][j]]);
  
 

 
//画出地图
 
//0表示空地“ ”  1表示墙“■”  2代表目的地“⊙”  3代表人“♀”  4代表箱子“□”
//5箱子与目的地重合“◆”  6,人站在目的地
void DrawMap(int n)

 system("cls");
 for (int j = 0; j < 10; j++)
 
  int i;
  for (i = 0; i < 10; i++)
  
   if (map[WhatMap][i][j] == 0)printf(" ");
   if (map[WhatMap][i][j] == 1)printf("■");
   if (map[WhatMap][i][j] == 2)printf("⊙");
   if (map[WhatMap][i][j] == 3)printf("♀");
   if (map[WhatMap][i][j] == 4)printf("□");
   if (map[WhatMap][i][j] == 5)printf("◆");
   if (map[WhatMap][i][j] == 6)printf("♀");
  
  if(i<9)printf("\\n");
 

 
//判断按键操作
int KbHit()

 if (GetAsyncKeyState(VK_UP)&1)return up;
 else if (GetAsyncKeyState(VK_DOWN)&1)return down;
 else if (GetAsyncKeyState(VK_RIGHT)&1)return right;
 else if (GetAsyncKeyState(VK_LEFT)&1)return left;
 else return 0;

 
//********************************************人向上移动
void ManUp()

 //先找到人的位置
 int i, j;
 for (i = 0; i < 10; i++)
 
  int flag = 0;
  for (j = 0; j < 10; j++)
   if (map[WhatMap][i][j] == 3 || map[WhatMap][i][j] == 6)
   
    flag = 1;
    break;
   
  if (flag)break;
 
 //人的位置是map[WhatMap][i][j];
 
 //改变人的方向
 
 //人的位置是空地
 if (map[WhatMap][i][j] == 3)
 
  //***********人的上面是空地
  if (map[WhatMap][i + 1][j] == 0)
  
   map[WhatMap][i][j] = 0;
   map[WhatMap][i + 1][j] = 3;
  
  //************人的上面是目的地
  else if (map[WhatMap][i + 1][j] == 2)
  
   map[WhatMap][i][j] = 0;
   map[WhatMap][i + 1][j] = 6;
  
  //*************人的上面是箱子
  else if (map[WhatMap][i + 1][j] == 4)
  
   //1,***********箱子上面是目的地
   if (map[WhatMap][i + 2][j] == 2)
   
    map[WhatMap][i][j] = 0;
    map[WhatMap][i + 1][j] = 3;
    map[WhatMap][i + 2][j] = 5;
   
   //2,************箱子上面是空地
   else if (map[WhatMap][i + 2][j] == 0)
   
    map[WhatMap][i][j] = 0;
    map[WhatMap][i + 1][j] = 3;
    map[WhatMap][i + 2][j] = 4;
   
   //3,*************箱子上面是。。。。。
  
 
 
 //人的位置是目的地
 else if (map[WhatMap][i][j] == 6)
 
 
  //***********人的上面是空地
 
  if (map[WhatMap][i + 1][j] == 0)
  
   map[WhatMap][i][j] = 2;
   map[WhatMap][i + 1][j] = 3;
  
  //************人的上面是目的地
  else if (map[WhatMap][i + 1][j] == 2)
  
   map[WhatMap][i][j] = 2;
   map[WhatMap][i + 1][j] = 6;
  
  //*************人的上面是箱子
 
  else if (map[WhatMap][i + 1][j] == 4)
  
   //1,***********箱子上面是目的地
   if (map[WhatMap][i + 2][j] == 2)
   
    map[WhatMap][i][j] = 2;
    map[WhatMap][i + 1][j] = 3;
    map[WhatMap][i + 2][j] = 5;
   
   //2,************箱子上面是空地
   else if (map[WhatMap][i + 2][j] == 0)
   
    map[WhatMap][i][j] = 2;
    map[WhatMap][i + 1][j] = 3;
    map[WhatMap][i + 2][j] = 4;
   
   //3,*************箱子上面是。。。。。
  
 

//********************************************人向右移动
void ManRight()

 //先找到人的位置
 int i, j;
 for (i = 0; i < 10; i++)
 
  int flag = 0;
  for (j = 0; j < 10; j++)
   if (map[WhatMap][i][j] == 3 || map[WhatMap][i][j] == 6)
   
    flag = 1;
    break;
   
  if (flag)break;
 
 //人的位置是map[WhatMap][i][j];
 
 //改变人的方向
 
 //人的位置是空地
 if (map[WhatMap][i][j] == 3)
 
  //***********人的右面是空地
  if (map[WhatMap][i][j+1] == 0)
  
   map[WhatMap][i][j] = 0;
   map[WhatMap][i][j+1] = 3;
  
  //************人的右面是目的地
  else if (map[WhatMap][i][j+1] == 2)
  
   map[WhatMap][i][j] = 0;
   map[WhatMap][i][j+1] = 6;
  
  //*************人的右面是箱子
  else if (map[WhatMap][i][j+1] == 4)
  
   //1,***********箱子右面是目的地
   if (map[WhatMap][i][j+2] == 2)
   
    map[WhatMap][i][j] = 0;
    map[WhatMap][i][j+1] = 3;
    map[WhatMap][i][j+2] = 5;
   
   //2,************箱子右面是空地
   else if (map[WhatMap][i][j+2] == 0)
   
    map[WhatMap][i][j] = 0;
    map[WhatMap][i][j+1] = 3;
    map[WhatMap][i][j+2] = 4;
   
   //3,*************箱子右面是。。。。。
  
 
 //人的位置是目的地
 else if (map[WhatMap][i][j] == 6)
 
  //***********人的右面是空地
 
  if (map[WhatMap][i][j+1] == 0)
  
   map[WhatMap][i][j] = 2;
   map[WhatMap][i][j+1] = 3;
  
  //************人的右面是目的地
  else if (map[WhatMap][i][j+1] == 2)
  
   map[WhatMap][i][j] = 2;
   map[WhatMap][i][j+1] = 6;
  
  //*************人的右面是箱子
 
  else if (map[WhatMap][i][j+1] == 4)
  
   //1,***********箱子右面是目的地
   if (map[WhatMap][i][j+2] == 2)
   
    map[WhatMap][i][j] = 2;
    map[WhatMap][i][j+1] = 3;
    map[WhatMap][i][j+2] = 5;
   
   //2,************箱子右面是空地
   else if (map[WhatMap][i][j+2] == 0)
   
    map[WhatMap][i][j] = 2;
    map[WhatMap][i][j+1] = 3;
    map[WhatMap][i][j+2] = 4;
   
   //3,*************箱子右面是。。。。。
  
 

//********************************************人向左移动
void ManLeft()

 //先找到人的位置
 int i, j;
 for (i = 0; i < 10; i++)
 
  int flag = 0;
  for (j = 0; j < 10; j++)
   if (map[WhatMap][i][j] == 3 || map[WhatMap][i][j] == 6)
   
    flag = 1;
    break;
   
  if (flag)break;
 
 //人的位置是map[WhatMap][i][j];
 
 //改变人的方向
 
 //人的位置是空地
 if (map[WhatMap][i][j] == 3)
 
  //***********人的左面是空地
  if (map[WhatMap][i][j-1] == 0)
  
   map[WhatMap][i][j] = 0;
   map[WhatMap][i][j-1] = 3;
  
  //************人的左面是目的地
  else if (map[WhatMap][i][j-1] == 2)
  
   map[WhatMap][i][j] = 0;
   map[WhatMap][i][j-1] = 6;
  
  //*************人的左面是箱子
  else if (map[WhatMap][i][j-1] == 4)
  
   //1,***********箱子左面是目的地
   if (map[WhatMap][i][j-2] == 2)
   
    map[WhatMap][i][j] = 0;
    map[WhatMap][i][j-1] = 3;
    map[WhatMap][i][j-2] = 5;
   
   //2,************箱子左面是空地
   else if (map[WhatMap][i][j-2] == 0)
   
    map[WhatMap][i][j] = 0;
    map[WhatMap][i][j-1] = 3;
    map[WhatMap][i][j-2] = 4;
   
   //3,*************箱子左面是。。。。。
  
 
 //人的位置是目的地
 else if (map[WhatMap][i][j] == 6)
 
  //***********人的上面是空地
 
  if (map[WhatMap][i][j-1] == 0)
  
   map[WhatMap][i][j] = 2;
   map[WhatMap][i][j-1] = 3;
  
  //************人的上面是目的地
  else if (map[WhatMap][i][j-1] == 2)
  
   map[WhatMap][i][j] = 2;
   map[WhatMap][i][j-1] = 6;
  
  //*************人的上面是箱子
 
  else if (map[WhatMap][i][j-1] == 4)
  
   //1,***********箱子上面是目的地
   if (map[WhatMap][i][j-2] == 2)
   
    map[WhatMap][i][j] = 2;
    map[WhatMap][i][j-1] = 3;
    map[WhatMap][i][j-2] = 5;
   
   //2,************箱子上面是空地
   else if (map[WhatMap][i][j-2] == 0)
   
    map[WhatMap][i][j] = 2;
    map[WhatMap][i][j-1] = 3;
    map[WhatMap][i][j-2] = 4;
   
   //3,*************箱子上面是。。。。。
  
 

//********************************************人向下移动
void ManDown()

 //先找到人的位置
 int i, j;
 for (i = 0; i < 10; i++)
 
  int flag = 0;
  for (j = 0; j < 10; j++)
   if (map[WhatMap][i][j] == 3 || map[WhatMap][i][j] == 6)
   
    flag = 1;
    break;
   
  if (flag)break;
 
 //人的位置是map[WhatMap][i][j];
 
 //改变人的方向
 
 //人的位置是空地
 if (map[WhatMap][i][j] == 3)
 
  //***********人的下面是空地
  if (map[WhatMap][i - 1][j] == 0)
  
   map[WhatMap][i][j] = 0;
   map[WhatMap][i - 1][j] = 3;
  
  //************人的上面是目的地
  else if (map[WhatMap][i - 1][j] == 2)
  
   map[WhatMap][i][j] = 0;
   map[WhatMap][i - 1][j] = 6;
  
  //*************人的上面是箱子
  else if (map[WhatMap][i - 1][j] == 4)
  
   //1,***********箱子上面是目的地
   if (map[WhatMap][i - 2][j] == 2)
   
    map[WhatMap][i][j] = 0;
    map[WhatMap][i - 1][j] = 3;
    map[WhatMap][i - 2][j] = 5;
   
   //2,************箱子上面是空地
   else if (map[WhatMap][i - 2][j] == 0)
   
    map[WhatMap][i][j] = 0;
    map[WhatMap][i - 1][j] = 3;
    map[WhatMap][i - 2][j] = 4;
   
   //3,*************箱子上面是。。。。。
  
 
 //人的位置是目的地
 else if (map[WhatMap][i][j] == 6)
 
  //***********人的上面是空地
 
  if (map[WhatMap][i - 1][j] == 0)
  
   map[WhatMap][i][j] = 2;
   map[WhatMap][i - 1][j] = 3;
  
  //************人的上面是目的地
  else if (map[WhatMap][i - 1][j] == 2)
  
   map[WhatMap][i][j] = 2;
   map[WhatMap][i - 1][j] = 6;
  
  //*************人的上面是箱子
 
  else if (map[WhatMap][i - 1][j] == 4)
  
   //1,***********箱子上面是目的地
   if (map[WhatMap][i - 2][j] == 2)
   
    map[WhatMap][i][j] = 2;
    map[WhatMap][i - 1][j] = 3;
    map[WhatMap][i - 2][j] = 5;
   
   //2,************箱子上面是空地
   else if (map[WhatMap][i - 2][j] == 0)
   
    map[WhatMap][i][j] = 2;
    map[WhatMap][i - 1][j] = 3;
    map[WhatMap][i - 2][j] = 4;
   
   //3,*************箱子上面是。。。。。
  
 

 
 
//判断游戏是否结束
int GameOver()

 //统计目的地的个数
 int flag = 0;
 for (int i = 0; i < 10; i++)
 
  for (int j = 0; j < 10; j++)
  
   if (map[WhatMap][i][j] == 2)flag++;
  
 
 
 //箱子到达目的地的个数
 int count = 0;
 for (int i = 0; i < 10; i++)
 
  for (int j = 0; j < 10; j++)
  
   if (map[WhatMap][i][j] == 4)count++;
  
 
 if (count == 0&&flag == 0 )return 1;
 else return 0;

运行效果:

游戏资源:

以上是关于C++基于easyx图形库实现推箱子游戏的主要内容,如果未能解决你的问题,请参考以下文章

easyx图形库做贪吃蛇游戏

飞机大战——图文详解

校园导游系统(C++实现,VC6.0编译,使用EasyX图形库)

C++经典绘图工具EasyX

4.18 c++图形库easyx的基础编程

项目: 推箱子图形化游戏 C++ / C