otto电棍 推箱子游戏实现(包含各种圣经)

头文件 

#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粉可以私信我,我把所需要的文件发给你。

 

猜你喜欢

转载自blog.csdn.net/lxyhhhhhcl/article/details/132032584