头文件
#pragma once //文件只包含一次
#include<iostream>
#include<graphics.h>
#include<string>
#include<stdlib.h>
#include<conio.h>
#include<mmsystem.h>//播放音频头文件
#pragma comment(lib,"winmm.lib")//告诉编译器加载winmm.lib库文件
using namespace std;
#define RATIO 61 //图形像素大小
#define SCREEN_LONG 960 //显示长度
#define SCREEN_WIDTH 768 //显示宽度
#define LINE 9 //行
#define COL 12 //列
#define START_X 100
#define START_Y 150
//控制上下左右,Q退出
#define KEY_UP 'w'
#define KEY_LEFT 'a'
#define KEY_RIGHT 'd'
#define KEY_DOWN 's'
#define KEY_QUIT 'q'
#define isVald(pos) pos.x>=0&&pos.x<LINE&&pos.y>0&&pos.y<COL //判断移动合法性
#define Count 500
enum _PROPS {
WALL,
FLOOR,
BOX_DES, //箱子目的地
MAN,
BOX,
HIT,
JCHZ, //箱子命中目标
ALL
};
enum _DIRECTION {
UP,
DOWN,
LEFT,
RIGHT
};
cpp文件
#include"box_man.h"
//游戏地图
int map[LINE][COL] = {
{WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL},
{WALL,JCHZ,WALL,FLOOR,FLOOR,FLOOR,FLOOR,FLOOR,FLOOR,FLOOR,WALL,WALL},
{WALL,FLOOR,BOX,FLOOR,WALL,BOX_DES,FLOOR,WALL,BOX_DES,FLOOR,WALL,WALL},
{WALL,FLOOR,WALL,FLOOR,WALL,FLOOR,WALL,WALL,FLOOR,FLOOR,FLOOR,WALL},
{WALL,FLOOR,WALL,BOX_DES,WALL,FLOOR,FLOOR,BOX,FLOOR,FLOOR,FLOOR,WALL},
{WALL,FLOOR,FLOOR,FLOOR,WALL,MAN,FLOOR,FLOOR,FLOOR,BOX,FLOOR,WALL},
{WALL,FLOOR,BOX_DES,FLOOR,FLOOR,BOX,FLOOR,FLOOR,FLOOR,FLOOR,FLOOR,WALL},
{WALL,FLOOR,WALL,WALL,FLOOR,WALL,FLOOR,FLOOR,WALL,WALL,FLOOR,WALL},
{WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL,WALL},
};
struct _POS {
int x; //小人所在二维数组的行
int y; //小人所在二维数组的列
};
struct _POS man;
IMAGE images[ALL];
/*
*改变地图视图中一格对应道具并重新显示
*输入:
* line-道具在地图数组的行下标
* col-道具在地图数组的列下标
* prop-地图的类型
*返回值:无
*/
void changeMap(struct _POS*pos,enum _PROPS prop ) {
map[pos->x][pos->y] = prop;
putimage(START_X + pos->y * RATIO, START_Y + pos->x * RATIO, &images[prop]);
}
/*
* 实现游戏四个方向(上下左右)的控制
* 输入:
* direcct-人前进方向
*
*/
void eatJchz() {
settextcolor(RED);
RECT rec = { 0,0,SCREEN_LONG,SCREEN_WIDTH };
settextstyle(50, 0, _T("宋体"));
drawtext(_T("鸡掰,韭菜盒子有毒"), &rec, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
void gameControl(enum _DIRECTION direct) {
struct _POS next_pos = man; //小人下一步的位置
struct _POS nextBOX = man; //小人下一步的位置
switch (direct) {
case UP:
mciSendString("play 冲刺.mp3", 0, 0, 0);
next_pos.x--;
nextBOX.x -= 2;
break;
case DOWN:
mciSendString("play 冲.mp3", 0, 0, 0);
next_pos.x++;
nextBOX.x += 2;
break;
case LEFT:
//mciSendString("play 古神语1.mp3", 0, 0, 0);
next_pos.y--;
nextBOX.y -= 2;
break;
case RIGHT:
//mciSendString("play 古神语.mp3", 0, 0, 0);
next_pos.y++;
nextBOX.y += 2;
break;
}
if (isVald(next_pos) &&map[next_pos.x][next_pos.y] == FLOOR) {
changeMap(&next_pos, MAN);//小人前进一格
changeMap(&man, FLOOR);
man = next_pos;
}else if (map[next_pos.x][next_pos.y] == JCHZ) {
changeMap(&next_pos, MAN);
changeMap(&man, FLOOR);
man = next_pos;
mciSendString("play jchz.mp3", 0, 0, 0);
eatJchz();
system("pause");
exit(-1);
}
else if (isVald(nextBOX) && map[next_pos.x][next_pos.y] == BOX) {
if ( map[nextBOX.x][nextBOX.y] == FLOOR) {
changeMap(&next_pos, MAN);
changeMap(&man, FLOOR);
man = next_pos;
changeMap(&nextBOX, BOX);
}
else if (map[nextBOX.x][nextBOX.y] == BOX_DES) {
changeMap(&next_pos, MAN);
changeMap(&man, FLOOR);
man = next_pos;
changeMap(&nextBOX, HIT);
}
}
}
/*判断游戏是否结束 如果不存在箱子目的地了 就代表游戏结束了
* 输入:无
*
*
*/
int temp = 3;
void num_Des() {
int OTTO = 0;
for (int i = 0; i < LINE; i++) {
for (int j = 0; j < COL; j++) {
if (map[i][j] == BOX_DES) {
OTTO++;
}
}
}
if (OTTO == temp) {
switch (temp) {
case 1:
mciSendString("play wcnm.mp3", 0, 0, 0);
break;
case 2:
mciSendString("play cnm.mp3", 0, 0, 0);
break;
case 3:
mciSendString("play 手贱.mp3", 0, 0, 0);
break;
}
temp--;
}
}
bool isGameOver() {
for (int i = 0; i < LINE; i++) {
for (int j = 0; j < COL; j++) {
if (map[i][j] == BOX_DES) {
return false;
}
}
}
return true;
}
//结束场景
void gameOverScene() {
IMAGE images[Count];
char fileName[Count];
initgraph(1196, 856, 0);
mciSendString("play 棍父.mp3", 0, 0, 0);//repeat表示重复播放
while (1)
{
for (int i = 1; i < Count; i++)
{
//7月10日(0) 002
sprintf_s(fileName, "res\\images\\棍父 %03d.jpg", i);
loadimage(0, fileName);
Sleep(30);
}
exit(-1);
}
}
int main() {
IMAGE bg_img;//定义一个图片
initgraph(SCREEN_LONG, SCREEN_WIDTH);//初始化图形系统
loadimage(&bg_img, _T("blackground.bmp"), SCREEN_LONG, SCREEN_WIDTH, true);//加载图片
putimage(0, 0, &bg_img);//显示图片
//加载道具图标
loadimage(&images[WALL], _T("wall_right.bmp"), RATIO, RATIO, true);
loadimage(&images[FLOOR], _T("floor.bmp"), RATIO, RATIO, true);
loadimage(&images[BOX_DES], _T("des.bmp"), RATIO, RATIO, true);
loadimage(&images[MAN], _T("man.png"), RATIO, RATIO, true);
loadimage(&images[BOX], _T("box.bmp"), RATIO, RATIO, true);
loadimage(&images[HIT], _T("box.bmp"), RATIO, RATIO, true);
loadimage(&images[JCHZ], _T("JCHZ.png"), RATIO, RATIO, true);
for (int i = 0; i < LINE; i++) {
for (int j = 0; j < COL; j++) {
if (map[i][j] == MAN) {
man.x = i;
man.y = j;
}
putimage(START_X + j * RATIO, START_Y + i * RATIO, &images[map[i][j]]);
}
}
//游戏环节
bool quit = false;
do {
if (_kbhit()) {//如果键盘有敲击动作,_kbhit()函数返回true
char ch = _getch();//ch 储存键盘输入
if (ch == KEY_UP) {
gameControl(UP);
}
else if (ch == KEY_DOWN) {
gameControl(DOWN);
}
else if (ch == KEY_LEFT) {
gameControl(LEFT);
}
else if (ch == KEY_RIGHT) {
gameControl(RIGHT);
}
else if (ch == KEY_QUIT) {
quit = true;
}
if (isGameOver()) {
gameOverScene();
quit = true;
}
num_Des();
}
Sleep(100);
} while (quit == false);
system("pause");
closegraph();
return 0;
}
实现效果:
里面还有许多彩蛋,谁玩谁知道。
代码里面包含了许多音频图片,只复制粘贴无法运行代码,我不知道这里面怎么放文件,所以有需要的OTTO粉可以私信我,我把所需要的文件发给你。