【Game】模拟经典游戏超级玛丽

这个程序模拟的红白机上的经典游戏超级玛丽。

【Game】模拟经典游戏超级玛丽

【Game】模拟经典游戏超级玛丽

【Game】模拟经典游戏超级玛丽

MyTimer头文件

 

// 程序名称:精确到微秒的延时类(基于多媒体定时器)



#pragma once

#include <windows.h>



class MyTimer

{

private:

	LARGE_INTEGER m_clk;	// 保存时钟信息

	LONGLONG m_oldclk;	// 保存开始时钟和结束时钟

	int m_freq;		// 时钟频率(时钟时间换算率),时间差



public:

	MyTimer();

	void Sleep(int ms);

	void Reset();

};



// 构造函数

MyTimer::MyTimer()

{

	QueryPerformanceFrequency(&m_clk);

	m_freq = (int)m_clk.QuadPart / 1000;

	

	// 获得计数器的时钟频率

	m_oldclk = 0;

}



// 延时

void MyTimer::Sleep(int ms)

{

	unsigned int c = ms * m_freq;



	if (m_oldclk == 0)

	{

		// 开始计时

		QueryPerformanceCounter(&m_clk);

		m_oldclk = m_clk.QuadPart;// 获得开始时钟

	}



	m_oldclk += c;

	QueryPerformanceCounter(&m_clk);

	if (m_clk.QuadPart > m_oldclk)

		m_oldclk = m_clk.QuadPart;

	else

		do

		{

			::Sleep(1);

			QueryPerformanceCounter(&m_clk);// 获得终止时钟

		}

		while(m_clk.QuadPart < m_oldclk);

}



// 重置延时器

void MyTimer::Reset()

{

	m_oldclk = 0;

}

 

代码

 

/************************************************************

   程序名称:超级蘑菇

   注:本游戏的每个算法思想都是由自己独立思考出来的,所以可能会有很

   多不完善以及错误的地方,在此也希望大家能指出程序中的bug或错误。

   游戏优点:使用了类和结构体,所以结构较为清晰明了。功能比较完全,包含图片和音乐。

   游戏缺点:由于没有太多时间,所以只设置了一关游戏,而且游戏地图很小。

************************************************************************/

#include <graphics.h>

#include <conio.h>

#include <math.h>

#include "MyTimer.h" // 一个保证精确延时的类

#pragma comment(lib, "Winmm.lib") // 给游戏添加音乐要用到它



#define G	9.8 // 重力加速度

#define XSIZE	512 // 屏幕大小

#define YSIZE	384

#define X	64  // 主角起始位置

#define Y	192

#define W	32  // 主角的宽和高

#define H	32

#define STEP	4  // 主角走一步相距的像素个数

#define HIGH	(2*role.w+1) // 主角跳跃的最大高度

 

#define	CMD_LEFT	1  // 方向键的宏定义

#define	CMD_RIGHT	2

#define	CMD_UP		4

#define CMD_DOWN	8

#define CMD_SHOOT	16

#define CMD_ESC		32

int life;   // 全局变量,主角共有多少条生命

int score;  // 全局变量,主角获得的分数

struct ROLE

{

    int id;

    int x;// 横坐标

    int y;// 纵坐标

    int w;// 图片宽度

    int h;// 图片高度

    int xleft;// 水平运动的左界限 

    int xright;// 水平运动的右界限

    int turn;// 精灵的运动方向

    int jump;// 精灵是否跳跃

    int iframe;// 加载第几副精灵图,这样就能让精灵看上去动起来了

};

struct MAP // 储存地图的结构体

{

	int id;

	int x;

	int y;

};

struct BULLET // 子弹的结构体

{

	int x;

	int y;

	int turn;

	int iframe;

	int id;

};

struct COINT // 硬币的结构体

{

	int x;

	int y;

	double iframe;

};

struct ENEMY // 敌人的结构体

{

	int id;

	int x;

	int y;

	int turn;

	int iframe;

};

class game // 整个游戏只设置了这一个类

{

private:

	ROLE role;

	MAP map[350];

	BULLET bullet[20];

	COINT coint[50];

	ENEMY enemy[20];

	IMAGE img_mapsky,img_p,img_map,img_ani,img_mapbk,img_home;

	int xmapsky;// 背景天空的起始横坐标

	int xmap;// 地图的起始坐标

	double v0;// 精灵跳跃的初速度             

	double h;				// 精灵跳跃的高度

	double t;				// 精灵跳跃的时间

	int ibullet;			// 第几颗子弹

	int xbullet;			// 子弹的x坐标

	int ybullet;			// 子弹的y坐标

	int get_bullet;			// 是否获得武器,0表示没有获得,1表示已获得

	POINT icoint;			// 储存硬币的坐标

	POINT bomb[20];			// 储存哪些地方爆炸了的坐标

	POINT temp;				// 临时坐标。储存哪些地方爆炸了的坐标

	double score_frame;		// 下面3个double型的变量用于控制各自图片的帧,以实现动画的效果。如画面中的流水

	double bomb_frame;

	double mapbk_frame;

	int win;				// 玩家是否过关

	int pause;				// 玩家是否按Esc(暂停键)

public:

	game();

	~game();

	void start();// 处理游戏开始的界面,和按暂停键后的界面

	void init();// 初始化各项变量

	void move();// 控制主角移动

	void show();// 显示画面

	int isdie();// 判断主角是否已死

	int  GetCommand();// 获取控制命令

	void left();// 主角向左运动

	void right();// 主角向右运动

	void up();// 主角跳跃

	void init_shoot();// 初始化发射子弹

	void fall();// 主角自由落体或者向上跳跃

	int is_l_touch(int id);	// 主角的左边是否碰到墙或敌人,以及敌人是否碰到陆地的左边界

	int is_r_touch(int id);	// 主角的右边是否碰到墙或敌人,以及敌人是否碰到陆地的右边界

	int is_t_touch();// 主角的头是否碰到墙

	int is_b_touch(int id);	// 主角是否踩到敌人。

	int is_touch();	// 主角是否吃到金币

	int is_land(ENEMY e);// 敌人是否站在陆地上

	void getbullet();// 获取子弹

	void shoot();// 发射子弹

	int eat(BULLET b);// 子弹是否打到敌人或者墙壁

	void end();// 处理游戏结束

};

game::game()

{

	initgraph(XSIZE,YSIZE);

}

game::~game()

{

	closegraph();

}

void game::start()

{

	if(pause==1)// 如果按了暂停键

	{

		BeginBatchDraw();

		POINT points[4]={ {XSIZE/2-45, YSIZE/3}, {XSIZE/2+45, YSIZE/3}, {XSIZE/2+45, YSIZE/3+90}, {XSIZE/2-45, YSIZE/3+90} };

		setfillcolor(GREEN);

		fillpolygon(points, 4);

		setbkmode(TRANSPARENT);

		settextstyle(20,0,"黑体");

    	RECT r2={XSIZE/2-45,YSIZE/3,XSIZE/2+45,YSIZE/3+30};rectangle(XSIZE/2-45,YSIZE/3,XSIZE/2+45,YSIZE/3+30);

    	drawtext("回到游戏", &r2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

    	RECT r3={XSIZE/2-45,YSIZE/3+30,XSIZE/2+45,YSIZE/3+60};rectangle(XSIZE/2-45,YSIZE/3+30,XSIZE/2+45,YSIZE/3+60);

        drawtext("重新开始", &r3, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

	    RECT r4={XSIZE/2-45,YSIZE/3+60,XSIZE/2+45,YSIZE/3+90};rectangle(XSIZE/2-45,YSIZE/3+60,XSIZE/2+45,YSIZE/3+90);

    	drawtext(" 主 菜 单 ", &r4, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

		FlushBatchDraw();



	    MOUSEMSG m;

    	while(true)

    	{

			BeginBatchDraw();

    		m=GetMouseMsg();

    		switch(m.uMsg)

            {

			case WM_LBUTTONDOWN:

				EndBatchDraw();

				if(m.x>XSIZE/2-45&&m.x<XSIZE/2+45&&m.y>YSIZE/3&&m.y<YSIZE/3+30)

    	     	    return;

    			else if(m.x>XSIZE/2-45&&m.x<XSIZE/2+45&&m.y>YSIZE/3+30&&m.y<YSIZE/3+60)

    			{

					mciSendString("close all", NULL, 0, NULL);	

    				pause=0;

					score=0;

    				return;

     			}

    			else if(m.x>XSIZE/2-45&&m.x<XSIZE/2+45&&m.y>YSIZE/3+60&&m.y<YSIZE/3+90)

				{

					mciSendString("close all", NULL, 0, NULL);	

					pause=0;

					score=0;

					life=0;

					cleardevice();

    				break;

				}

    			else

    				break;

			case WM_MOUSEMOVE:

				RECT r;

				int i;

				for(i=0;i<3;i++)

				{

				    if(m.x>XSIZE/2-45&&m.x<XSIZE/2+45&&m.y>YSIZE/3+i*30&&m.y<YSIZE/3+30+i*30)

				    {

					    r.left=XSIZE/2-45;

					    r.top=YSIZE/3+i*30;

					    r.right=XSIZE/2+45;

					    r.bottom=YSIZE/3+30+i*30;

						POINT points[4]={ {r.left,r.top}, {r.right,r.top}, {r.right,r.bottom}, {r.left,r.bottom} };

					    setfillcolor(RED);

						fillpolygon(points, 4);

						setbkmode(TRANSPARENT);

						switch(i)

						{

						case 0:

						    drawtext("回到游戏", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

						    break;

						case 1:

						    drawtext("重新开始", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

							break;

						case 2:

						    drawtext(" 主 菜 单 ", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

							break;

						}

					}

				    else

				    {

						if(getpixel(XSIZE/2-45+1,YSIZE/3+i*30+1)==RED)

						{

				       	    r.left=XSIZE/2-45;

				            r.top=YSIZE/3+i*30;

				       	    r.right=XSIZE/2+45;

				       	    r.bottom=YSIZE/3+30+i*30;

							POINT points[4]={ {r.left,r.top}, {r.right,r.top}, {r.right,r.bottom}, {r.left,r.bottom} };

			   		        setfillcolor(GREEN);

			       			fillpolygon(points, 4);

			       			setbkmode(TRANSPARENT);

			        		switch(i)

						    {

				    		case 0:

				    		    drawtext("回到游戏", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

				    			break;

				    		case 1:

				    			drawtext("重新开始", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

				    			break;

				    		case 2:

				    			drawtext(" 主 菜 单 ", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

				    			break;

							}						

						}

						FlushBatchDraw();

					}

				}

			}

			if(pause==0)

				break;

		}

	}

	if(life==1||life==2)

		return;

	life=3;

	score=0;

	settextstyle(40,0,"方正舒体");	

	RECT r1 = {0, 0, XSIZE, YSIZE/3};

	drawtext("超级蘑菇", &r1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

	settextstyle(20,0,"宋体");

	RECT r2={XSIZE/2-45,YSIZE/3,XSIZE/2+45,YSIZE/3+30};rectangle(XSIZE/2-45,YSIZE/3,XSIZE/2+45,YSIZE/3+30);

	drawtext("开始游戏", &r2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

	RECT r3={XSIZE/2-45,YSIZE/3+30,XSIZE/2+45,YSIZE/3+60};rectangle(XSIZE/2-45,YSIZE/3+30,XSIZE/2+45,YSIZE/3+60);

    drawtext("游戏介绍", &r3, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

	RECT r4={XSIZE/2-45,YSIZE/3+60,XSIZE/2+45,YSIZE/3+90};rectangle(XSIZE/2-45,YSIZE/3+60,XSIZE/2+45,YSIZE/3+90);

	drawtext("操作说明", &r4, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

	RECT r5={XSIZE/2-45,YSIZE/3+90,XSIZE/2+45,YSIZE/3+120};rectangle(XSIZE/2-45,YSIZE/3+90,XSIZE/2+45,YSIZE/3+120);

	drawtext("退出游戏", &r5, DT_CENTER | DT_VCENTER | DT_SINGLELINE);



	int flag1=1,flag2=0,flag3=0;

	MOUSEMSG m;

	while(flag1==1)

	{

		BeginBatchDraw();

		m=GetMouseMsg();

		switch(m.uMsg)

		{

		case WM_LBUTTONDOWN:

			EndBatchDraw();

		    if(m.x>XSIZE/2-45&&m.x<XSIZE/2+45&&m.y>YSIZE/3&&m.y<YSIZE/3+30&&flag1==1&&flag2==0&&flag3==0)

		    {

				flag1=0;

				break;

			}

			else if(m.x>XSIZE/2-45&&m.x<XSIZE/2+45&&m.y>YSIZE/3+30&&m.y<YSIZE/3+60&&flag1==1&&flag3==0)

			{

			    flag2=1;

				cleardevice();

				rectangle(50,50,213,220);

				outtextxy(52,52,"游戏介绍:");

				outtextxy(52,82,"超级玛丽变");

				outtextxy(52,102,"身超级蘑菇。");

				outtextxy(52,132,"开发者:");

				outtextxy(52,152,"木子念念");

				RECT R1={XSIZE-46,YSIZE-26,XSIZE-2,YSIZE-2};rectangle(XSIZE-46,YSIZE-26,XSIZE-2,YSIZE-2);

	            drawtext("返回", &R1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

				break;

			}

			else if(m.x>XSIZE/2-45&&m.x<XSIZE/2+45&&m.y>YSIZE/3+60&&m.y<YSIZE/3+90&&flag1==1&&flag2==0)

			{

				flag3=1;

				cleardevice();

				rectangle(50,50,213,220);

				outtextxy(52,52,"操作说明:");

				outtextxy(52,72,"左移:A键");

				outtextxy(52,92,"右移:D键");

				outtextxy(52,112,"发射:J键");

				outtextxy(52,132,"跳跃:W键/K键");

				outtextxy(52,152,"暂停:Esc键");

				RECT R2={XSIZE-46,YSIZE-26,XSIZE-2,YSIZE-2};rectangle(XSIZE-46,YSIZE-26,XSIZE-2,YSIZE-2);

	            drawtext("返回", &R2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

				break;

			}

			else if(m.x>XSIZE/2-45&&m.x<XSIZE/2+45&&m.y>YSIZE/3+90&&m.y<YSIZE/3+120&&flag1==1&&flag2==0&&flag3==0)

			    exit(0);

			else if(m.x>XSIZE-46&&m.x<XSIZE-3&&m.y>YSIZE-26&&m.y<YSIZE-3&&(flag2==1||flag3==1))

			{

			    cleardevice();

				flag1=0,flag2=0,flag3=0;

				start();

			}

			else

			    break;

		case WM_MOUSEMOVE:

			RECT r;

			if(flag2==1||flag3==1)

			{

			    if(m.x>XSIZE-46&&m.x<XSIZE-3&&m.y>YSIZE-26&&m.y<YSIZE-3)

				{

				    r.left=XSIZE-46;

				    r.top=YSIZE-26;

			        r.right=XSIZE-2;

					r.bottom=YSIZE-2;

					POINT points[4]={ {r.left,r.top}, {r.right,r.top}, {r.right,r.bottom}, {r.left,r.bottom} };

				    setfillcolor(RED);

					fillpolygon(points, 4);

					setbkmode(TRANSPARENT);

					drawtext("返回", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

				}

				else

				{

					if(getpixel(XSIZE-46+1,YSIZE-26+1)==RED)

					{

					    r.left=XSIZE-46;

			         	r.top=YSIZE-26;

			            r.right=XSIZE-2;

			        	r.bottom=YSIZE-2;

						POINT points[4]={ {r.left,r.top}, {r.right,r.top}, {r.right,r.bottom}, {r.left,r.bottom} };

						setfillcolor(BLACK);

					    fillpolygon(points, 4);

					    setbkmode(TRANSPARENT);

					    drawtext("返回", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

					}

				}

			}

			else

			{

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

				{

				    if(m.x>XSIZE/2-45&&m.x<XSIZE/2+45&&m.y>YSIZE/3+i*30&&m.y<YSIZE/3+30+i*30)

				    {

					    r.left=XSIZE/2-45;

					    r.top=YSIZE/3+i*30;

					    r.right=XSIZE/2+45;

					    r.bottom=YSIZE/3+30+i*30;

						POINT points[4]={ {r.left,r.top}, {r.right,r.top}, {r.right,r.bottom}, {r.left,r.bottom} };

					    setfillcolor(RED);

						fillpolygon(points, 4);

						setbkmode(TRANSPARENT);

						switch(i)

						{

						case 0:

						    drawtext("开始游戏", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

						    break;

						case 1:

						    drawtext("游戏介绍", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

							break;

						case 2:

						    drawtext("操作说明", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

							break;

					   	case 3:

							drawtext("退出游戏", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

							break;

						}

					}

				    else

				    {

						if(getpixel(XSIZE/2-45+1,YSIZE/3+i*30+1)==RED)

						{

				       	    r.left=XSIZE/2-45;

				            r.top=YSIZE/3+i*30;

				       	    r.right=XSIZE/2+45;

				       	    r.bottom=YSIZE/3+30+i*30;

							POINT points[4]={ {r.left,r.top}, {r.right,r.top}, {r.right,r.bottom}, {r.left,r.bottom} };

			   		        setfillcolor(BLACK);

			       			fillpolygon(points, 4);

			       			setbkmode(TRANSPARENT);

			        		switch(i)

						    {

				    		case 0:

				    		    drawtext("开始游戏", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

				    			break;

				    		case 1:

				    			drawtext("游戏介绍", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

				    			break;

				    		case 2:

				    			drawtext("操作说明", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

				    			break;

				    	   	case 3:

				    			drawtext("退出游戏", &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

				    			break;

							}

						}

					}

				}

			}

			FlushBatchDraw();

			break;

			default:

			    break;

		 }

	}

}

void game::init()

{

	if(pause==1)

		return;

	role.id=1;

	role.x=X;

	role.y=Y;

	role.w=W;

	role.h=H;

	role.xleft=0;

	role.xright=role.w*6+STEP;

	role.iframe=1;

	role.turn=1;

	role.jump=0;



	xmapsky=0;

	xmap=0;

	v0=0;

	h=0;

	t=0;

	ibullet=-1;

	icoint.x=-1;

	icoint.y=-1;

	score_frame=0;

	bomb_frame=1;

	mapbk_frame=1;

	temp.x=-1;

	temp.y=-1;

	xbullet=41*role.w-10;

	ybullet=4*role.h-25;

	get_bullet=0;

	win=0;

	pause=0;

	score=0;

	int i;

	for(i=0;i<350;i++)

    {

		map[i].id=0;

		map[i].x=-1;

		map[i].y=-1;

		if(i<50)

		{

			coint[i].x=-1;

			coint[i].y=-1;

			coint[i].iframe=1;

		}

		if(i<20)

		{

			bullet[i].id=0;

			bullet[i].x=-1;

	        bullet[i].y=-1;

	        bullet[i].iframe=1;

	        bullet[i].turn=-1;  



			enemy[i].id=0;

   			enemy[i].x=-1;

	        enemy[i].y=-1;

         	enemy[i].turn=1;

	        enemy[i].iframe=1;



			bomb[i].x=-1;

			bomb[i].y=-1;

	 	}

	}

	loadimage(&img_mapsky,"res\\mapsky.jpg",XSIZE,YSIZE*4);

	loadimage(&img_p,"res\\role.gif");

	loadimage(&img_map,"res\\map.gif");

	loadimage(&img_ani,"res\\ani.gif");

	loadimage(&img_mapbk,"res\\mapbk.gif");

	loadimage(&img_home,"res\\home.jpg",XSIZE,YSIZE*5);



    mciSendString("open res\\背景音乐.mp3 alias mymusic1", NULL, 0, NULL);

	mciSendString("open res\\子弹.mp3 alias mymusic2", NULL, 0, NULL);

	mciSendString("open res\\金币.mp3 alias mymusic3", NULL, 0, NULL);

	mciSendString("open res\\跳.mp3 alias mymusic4", NULL, 0, NULL);

	mciSendString("open res\\子弹打到敌人.mp3 alias mymusic5", NULL, 0, NULL);

	mciSendString("open res\\子弹撞墙.mp3 alias mymusic6", NULL, 0, NULL);

	mciSendString("open res\\踩敌人.mp3 alias mymusic7", NULL, 0, NULL);

	mciSendString("open res\\吃到武器.mp3 alias mymusic8", NULL, 0, NULL);	

	mciSendString("open res\\胜利.mp3 alias mymusic9", NULL, 0, NULL);

	mciSendString("open res\\死亡1.mp3 alias mymusic10", NULL, 0, NULL);

	mciSendString("open res\\死亡2.mp3 alias mymusic11", NULL, 0, NULL);

	                                       

	for(i=0;i<300;i++)// 以下都是编辑地图

	{

		map[i].id=1;

		map[i].x=i%100*role.w;

		if(i<100)

			map[i].y=9*role.h;

		else if(i>=100&&i<200)

			map[i].y=10*role.h;

		else

			map[i].y=11*role.h;

	}

	map[15].id=1,map[15].x=18*role.w,map[15].y=8*role.h;

	map[115].id=1,map[115].x=19*role.w,map[115].y=8*role.h;

	map[215].id=1,map[215].x=20*role.w,map[215].y=8*role.h;



	map[16].id=1,map[16].x=21*role.w,map[16].y=8*role.h;

	map[116].id=1,map[116].x=22*role.w,map[116].y=8*role.h;

	map[216].id=1,map[216].x=23*role.w,map[216].y=8*role.h;



	map[17].id=1,map[17].x=24*role.w,map[17].y=8*role.h;

	map[117].id=1,map[117].x=25*role.w,map[117].y=8*role.h;

	map[217].id=1,map[217].x=26*role.w,map[217].y=8*role.h;



	map[300].id=2,map[300].x=10*role.w,map[300].y=6*role.h;

	map[301].id=2,map[301].x=11*role.w,map[301].y=6*role.h;

	map[302].id=2,map[302].x=12*role.w,map[302].y=6*role.h;



	map[303].id=3,map[303].x=36*role.w,map[303].y=7*role.h;

	map[304].id=3,map[304].x=44*role.w,map[304].y=7*role.h;



	map[305].id=2,map[305].x=40*role.w,map[305].y=4*role.h;

	map[306].id=2,map[306].x=41*role.w,map[306].y=4*role.h;

	map[307].id=2,map[307].x=42*role.w,map[307].y=4*role.h;



	map[308].id=2,map[308].x=13*role.w,map[308].y=6*role.h;



	map[309].id=4,map[309].x=15*role.w,map[309].y=10*role.h;



	map[310].id=5,map[310].x=19*role.w,map[310].y=6*role.h;

	map[311].id=5,map[311].x=23*role.w,map[311].y=6*role.h;

	map[312].id=5,map[312].x=32*role.w,map[312].y=7*role.h;

	map[313].id=5,map[313].x=48*role.w,map[313].y=7*role.h;

	map[314].id=5,map[314].x=52*role.w,map[314].y=7*role.h;

	map[315].id=5,map[315].x=56*role.w,map[315].y=7*role.h;



	map[316].id=3,map[316].x=80*role.w,map[316].y=7*role.h;

	map[317].id=3,map[317].x=90*role.w,map[317].y=7*role.h;



	map[318].id=2,map[318].x=62*role.w,map[318].y=6*role.h;



	map[319].id=2,map[319].x=65*role.w,map[319].y=3*role.h;

	map[320].id=2,map[320].x=66*role.w,map[320].y=3*role.h;

	map[321].id=2,map[321].x=67*role.w,map[321].y=3*role.h;

	map[322].id=2,map[322].x=68*role.w,map[322].y=3*role.h;

	map[323].id=2,map[323].x=69*role.w,map[323].y=3*role.h;



	map[349].id=6,map[349].x=97*role.w,map[349].y=7*role.h;



	for(i=64;i<300;i+=100)

	{

		map[i].id=0;map[i].x=-1;map[i].y=-1;

		map[i+1].id=0;map[i+1].x=-1;map[i+1].y=-1;

		map[i+2].id=0;map[i+2].x=-1;map[i+2].y=-1;



		map[i+7].id=0;map[i].x=-1;map[i].y=-1;

		map[i+8].id=0;map[i+1].x=-1;map[i+1].y=-1;

		map[i+9].id=0;map[i+1].x=-1;map[i+1].y=-1;



		map[i+11].id=0;map[i].x=-1;map[i].y=-1;

		map[i+12].id=0;map[i+1].x=-1;map[i+1].y=-1;

		map[i+13].id=0;map[i+1].x=-1;map[i+1].y=-1;

	}

	map[64].id=4,map[64].x=64*role.w,map[64].y=10*role.h;

	map[71].id=4,map[71].x=71*role.w,map[71].y=10*role.h;

	map[75].id=4,map[75].x=75*role.w,map[75].y=10*role.h;



	enemy[0].id=1;enemy[0].x=6*role.w;enemy[0].y=8*role.h;enemy[0].turn=1;enemy[0].iframe=1;

	enemy[1].id=1;enemy[1].x=8*role.w;enemy[1].y=8*role.h;enemy[1].turn=1;enemy[1].iframe=1;

	enemy[2].id=1;enemy[2].x=27*role.w;enemy[2].y=8*role.h;enemy[2].turn=1;enemy[2].iframe=1;

	enemy[3].id=1;enemy[3].x=29*role.w;enemy[3].y=8*role.h;enemy[3].turn=1;enemy[3].iframe=1;

	enemy[4].id=1;enemy[4].x=31*role.w;enemy[4].y=8*role.h;enemy[4].turn=1;enemy[4].iframe=1;

	enemy[5].id=1;enemy[5].x=33*role.w;enemy[5].y=8*role.h;enemy[5].turn=1;enemy[5].iframe=1;

	enemy[6].id=1;enemy[6].x=35*role.w;enemy[6].y=8*role.h;enemy[6].turn=1;enemy[6].iframe=1;

	enemy[7].id=1;enemy[7].x=40*role.w;enemy[7].y=8*role.h;enemy[7].turn=1;enemy[7].iframe=1;

	enemy[8].id=1;enemy[8].x=82*role.w;enemy[8].y=8*role.h;enemy[8].turn=1;enemy[8].iframe=1;

	enemy[9].id=1;enemy[9].x=65*role.w;enemy[9].y=2*role.h;enemy[9].turn=1;enemy[9].iframe=1;

	enemy[10].id=1;enemy[10].x=69*role.w;enemy[10].y=2*role.h;enemy[10].turn=1;enemy[10].iframe=1;

	enemy[11].id=1;enemy[11].x=85*role.w;enemy[11].y=8*role.h;enemy[11].turn=1;enemy[11].iframe=1;



	for(i=0;i<4;i++)

	{

		coint[i].x=(10+i)*role.w;

	    coint[i].y=5*role.h;



		coint[i+4].x=(67+i)*role.w;

		coint[i+4].y=8*role.w;



		coint[i+8].x=74*role.w;

		coint[i+8].y=(4+i)*role.w;

	}

	for(i=12;i<18;i++)

	{

		coint[i].x=(83-12+i)*role.w;

	    coint[i].y=6*role.h;



		coint[i+6].x=(83-12+i)*role.w;

		coint[i+6].y=7*role.w;

	}

}

void game::move()

{	

	MyTimer tt;

	int c;

	int k=0;// 控制发射子弹的频率和敌人的移动速度

	int n=0;// 控制发射子弹的频率

	while(true)

	{

		tt.Sleep(25);

		t=sqrt(2*HIGH/G)/14;		

		k++;

		if(k==1000)

	    	k=0;

		if(_kbhit()&&win==0)

		{

			c=GetCommand();

	    	if(c&CMD_LEFT)

	    		left();

	    	if(c&CMD_RIGHT)

				right();

	    	if((c&CMD_UP)&&role.jump==0)

				up();

			if(c&CMD_ESC)

			{

				pause=1;

				break;

			}

			if(c&CMD_SHOOT&&get_bullet==1)

			{

				if(n==0)

			    {

			    	init_shoot();

			    	n=1;

			    }

				n++;

				if(k%10==0&&n>10)

			    {

			    	init_shoot();

			    }

			}

			else

			    n=0;

		}

		if(-xmap+role.x==97*role.w)

		{

		    mciSendString("stop mymusic1", NULL, 0, NULL);

			mciSendString("play mymusic9", NULL, 0, NULL);

		}

		if(-xmap+role.x>95*role.w)

		{

			

            win=1;

			role.x+=STEP;

			if(role.x-STEP>XSIZE)

				break;

		}

		if(is_b_touch(1)==0)

			role.jump=1;

		if(role.jump==1)

			fall();

		if(isdie()==1)

		{

			mciSendString("stop mymusic1", NULL, 0, NULL);

			mciSendString("play mymusic11", NULL, 0, NULL);

			life--;

			return;	

		}

		if(k%2==0)				// 敌人的运动

		{

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

	    	{

		    	if(enemy[i].id==1)

		    	{

		            if(is_land(enemy[i])==1)

		            {

		    	        if(enemy[i].turn==1)

			    	        enemy[i].x+=STEP;

			            else

				            enemy[i].x-=STEP;

			    	}

		            if(is_land(enemy[i])==0||is_l_touch(3)==1||is_r_touch(3)==1)

		            {

		            	if(enemy[i].turn==1)

		            		enemy[i].x-=STEP;

		            	else

		            		enemy[i].x+=STEP;

		            	enemy[i].turn*=-1;

		            }

				    enemy[i].iframe*=-1;

			    }

	    	}

		}

		int boom=0;

		if(is_b_touch(2)==1)			// 如果主角“踩到”敌人

			boom=1;

		getbullet();// 获取子弹

		if(get_bullet==1)

			shoot();



		BeginBatchDraw();

		show();

		FlushBatchDraw();



		if((is_l_touch(2)==1||is_r_touch(2)==1))

		{

			mciSendString("stop mymusic1", NULL, 0, NULL);

			mciSendString("play mymusic10", NULL, 0, NULL);

			life--;

			pause=0;

			putimage(role.x,role.y,role.w,role.h,&img_p,2*role.w,role.h,SRCAND);

	        putimage(role.x,role.y,role.w,role.h,&img_p,2*role.w,0,SRCPAINT);

		    return;

		}

	}

}

void game::show()

{

	if(xmapsky==-XSIZE)

		xmapsky=0;

    putimage(xmapsky,0,&img_mapsky);	// 显示背景

	putimage(XSIZE+xmapsky,0,&img_mapsky);



	if(is_touch()==1)

		score_frame=1;

	if(score_frame!=0)					// 碰到硬币,显示得分

	{		

		switch((int)score_frame)

		{

		case 1:

			putimage(xmap+icoint.x,icoint.y,role.w,role.h,&img_ani,0,11*role.h,SRCAND);

		    putimage(xmap+icoint.x,icoint.y,role.w,role.h,&img_ani,0,10*role.h,SRCPAINT);

			break;

		case 2:

			putimage(xmap+icoint.x,icoint.y,role.w,role.h,&img_ani,role.w,11*role.h,SRCAND);

			putimage(xmap+icoint.x,icoint.y,role.w,role.h,&img_ani,role.w,10*role.h,SRCPAINT);

			break;

		case 3:

			putimage(xmap+icoint.x,icoint.y,role.w,role.h,&img_ani,2*role.w,11*role.h,SRCAND);

			putimage(xmap+icoint.x,icoint.y,role.w,role.h,&img_ani,2*role.w,10*role.h,SRCPAINT);

			break;

		case 4:

			putimage(xmap+icoint.x,icoint.y,role.w,role.h,&img_ani,3*role.w,11*role.h,SRCAND);

			putimage(xmap+icoint.x,icoint.y,role.w,role.h,&img_ani,3*role.w,10*role.h,SRCPAINT);

			break;

		default:

			break;

		}	

		score_frame+=0.2;

	    if(score_frame==5)

		    score_frame=0;

	}

	int i;

	for(i=0;i<350;i++)			// 显示地图,天空上的地图和硬币

	{

		if(map[i].id==1)

		{

			putimage(xmap+map[i].x,map[i].y,role.w,role.h,&img_map,0,0);

		}

		else if(map[i].id==2)

		{

			putimage(xmap+map[i].x,map[i].y,role.w,role.h,&img_map,0,role.h);

		}

		else if(map[i].id==3)

		{

			putimage(xmap+map[i].x,map[i].y,2*role.w,2*role.h,&img_map,0,9*role.h);

		}

		else

		{

		    if(map[i].id==4)

		    {

		    	switch((int)mapbk_frame)

		    	{

		    	case 1:

		    		putimage(xmap+map[i].x,map[i].y,3*role.w,2*role.h,&img_mapbk,0,10*role.h,SRCAND);

		    	    putimage(xmap+map[i].x,map[i].y,3*role.w,2*role.h,&img_mapbk,0,8*role.h,SRCPAINT);

		    		break;

		    	case 2:

		   	     	putimage(xmap+map[i].x,map[i].y,3*role.w,2*role.h,&img_mapbk,3*role.w,10*role.h,SRCAND);

		     		putimage(xmap+map[i].x,map[i].y,3*role.w,2*role.h,&img_mapbk,3*role.w,8*role.h,SRCPAINT);

			    	break;

	    		default:

	    			break;

	    		}	

		    }

			else if(map[i].id==5)

		    {

		    	switch((int)mapbk_frame)

		    	{

		    	case 1:

		    		putimage(xmap+map[i].x,map[i].y,3*role.w,2*role.h,&img_mapbk,0,2*role.h,SRCAND);

		    	    putimage(xmap+map[i].x,map[i].y,3*role.w,2*role.h,&img_mapbk,0,0,SRCPAINT);

		    		break;

		    	case 2:

		   	     	putimage(xmap+map[i].x,map[i].y,3*role.w,2*role.h,&img_mapbk,3*role.w,2*role.h,SRCAND);

		     		putimage(xmap+map[i].x,map[i].y,3*role.w,2*role.h,&img_mapbk,3*role.w,0,SRCPAINT);

			    	break;

	    		default:

	    			break;

	    		}	

		    }

			else if(map[i].id==6)

			{

				switch((int)mapbk_frame)

		    	{

		    	case 1:

		    		putimage(xmap+map[i].x,map[i].y,3*role.w,2*role.h,&img_mapbk,0,6*role.h,SRCAND);

					putimage(xmap+map[i].x,map[i].y,3*role.w,2*role.h,&img_mapbk,0,4*role.h,SRCPAINT);

		    		break;

		    	case 2:

		   	     	putimage(xmap+map[i].x,map[i].y,3*role.w,2*role.h,&img_mapbk,3*role.w,6*role.h,SRCAND);

					putimage(xmap+map[i].x,map[i].y,3*role.w,2*role.h,&img_mapbk,3*role.w,4*role.h,SRCPAINT);

			    	break;

	    		default:

	    			break;

	    		}	

			}

			mapbk_frame+=0.003;

	        if(mapbk_frame>2.9)

	   		{

	   			mapbk_frame=1;

	   		}

		}

		if(i<50)

		{

			if(coint[i].x!=-1||coint[i].y!=-1)

			{

				switch((int)coint[i].iframe)

				{

				case 1:

					putimage(xmap+coint[i].x,coint[i].y,role.w,role.h,&img_ani,0,9*role.h,SRCAND);

				    putimage(xmap+coint[i].x,coint[i].y,role.w,role.h,&img_ani,0,8*role.h,SRCPAINT);

					break;

				case 2:

					putimage(xmap+coint[i].x,coint[i].y,role.w,role.h,&img_ani,role.w,9*role.h,SRCAND);

					putimage(xmap+coint[i].x,coint[i].y,role.w,role.h,&img_ani,role.w,8*role.h,SRCPAINT);

					break;

				case 3:

					putimage(xmap+coint[i].x,coint[i].y,role.w,role.h,&img_ani,2*role.w,9*role.h,SRCAND);

					putimage(xmap+coint[i].x,coint[i].y,role.w,role.h,&img_ani,2*role.w,8*role.h,SRCPAINT);

					break;

				case 4:

					putimage(xmap+coint[i].x,coint[i].y,role.w,role.h,&img_ani,3*role.w,9*role.h,SRCAND);

					putimage(xmap+coint[i].x,coint[i].y,role.w,role.h,&img_ani,3*role.w,8*role.h,SRCPAINT);

					break;

				default:

					break;

				}	

				coint[i].iframe+=0.125;

			    if(coint[i].iframe==5)

				    coint[i].iframe=1;

			}

		}

	}

	if(get_bullet==0)

	{



		switch((int)mapbk_frame)

	 	{

		    case 1:

		   		putimage(xmap+xbullet,ybullet,52,25,&img_ani,0,12*role.h+25,SRCAND);

                putimage(xmap+xbullet,ybullet,52,25,&img_ani,0,12*role.h,SRCPAINT);

		    	break;

		    case 2:

     	     	putimage(xmap+xbullet,ybullet,52,25,&img_ani,52,12*role.h+25,SRCAND);

                putimage(xmap+xbullet,ybullet,52,25,&img_ani,52,12*role.h,SRCPAINT);

			   	break;

	    	default:

	    	    break;

	  	}	



	}

	for(i=0;i<20;i++)// 显示子弹

	{

		if(get_bullet==1)

		{

		    if(bullet[i].id==1)

	        {

	            if(bullet[i].iframe==1)

    	        {

	            	putimage(bullet[i].x,bullet[i].y,role.w,role.h,&img_ani,0,3*role.h,SRCAND);

    		        putimage(bullet[i].x,bullet[i].y,role.w,role.h,&img_ani,0,2*role.h,SRCPAINT);

	            }

    	        else

    	        {

    	        	putimage(bullet[i].x,bullet[i].y,role.w,role.h,&img_ani,role.w,3*role.h,SRCAND);

    	        	putimage(bullet[i].x,bullet[i].y,role.w,role.h,&img_ani,role.w,2*role.h,SRCPAINT);

        	    }	

            }

		}

		if(enemy[i].id==1)

		{

	    	if(enemy[i].iframe==1)				// 显示敌人

	        { 

		        putimage(xmap+enemy[i].x,enemy[i].y,role.w,role.h,&img_ani,0,role.h,SRCAND);

    	        putimage(xmap+enemy[i].x,enemy[i].y,role.w,role.h,&img_ani,0,0,SRCPAINT);

	        }

	        else

	        {

	        	putimage(xmap+enemy[i].x,enemy[i].y,role.w,role.h,&img_ani,role.w,role.h,SRCAND);

	        	putimage(xmap+enemy[i].x,enemy[i].y,role.w,role.h,&img_ani,role.w,0,SRCPAINT);

	        }

	        

		}

		if(bomb[i].x!=-1||bomb[i].y!=-1)

		{

			switch((int)bomb_frame)

			{

			case 1:

				putimage(xmap+bomb[i].x-role.w/2,bomb[i].y-role.h/2,2*role.w,2*role.h,&img_ani,0,6*role.h,SRCAND);

			    putimage(xmap+bomb[i].x-role.w/2,bomb[i].y-role.h/2,2*role.w,2*role.h,&img_ani,0,4*role.h,SRCPAINT);

				break;

			case 2:

				putimage(xmap+bomb[i].x-role.w/2,bomb[i].y-role.h/2,2*role.w,2*role.h,&img_ani,2*role.w,6*role.h,SRCAND);

				putimage(xmap+bomb[i].x-role.w/2,bomb[i].y-role.h/2,2*role.w,2*role.h,&img_ani,2*role.w,4*role.h,SRCPAINT);

				break;

			case 3:

				putimage(xmap+bomb[i].x-role.w/2,bomb[i].y-role.h/2,2*role.w,2*role.h,&img_ani,4*role.w,6*role.h,SRCAND);

				putimage(xmap+bomb[i].x-role.w/2,bomb[i].y-role.h/2,2*role.w,2*role.h,&img_ani,4*role.w,4*role.h,SRCPAINT);

				break;

			case 4:

				putimage(xmap+bomb[i].x-role.w/2,bomb[i].y-role.h/2,2*role.w,2*role.h,&img_ani,6*role.w,6*role.h,SRCAND);

				putimage(xmap+bomb[i].x-role.w/2,bomb[i].y-role.h/2,2*role.w,2*role.h,&img_ani,6*role.w,4*role.h,SRCPAINT);

				break;

			default:

				break;

			}	

			bomb_frame+=0.25;

		    if(bomb_frame==5)

			{

				bomb[i].x=-1;

			    bomb[i].y=-1;

				bomb_frame=1;

			}

		}

	}

	int n=score;

	char s1[20]="当前得分:";

	char s2[10];

	_itoa(n,s2,10);

	RECT r1={10,10,110,40};

	RECT r2={110,10,150,40};

	settextstyle(20, 0,"宋体");

	drawtext(s1, &r1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

	drawtext(s2, &r2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

	if(role.iframe==1) // 显示主角

	{

		if(role.turn==1)

		{

		    putimage(role.x,role.y,role.w,role.h,&img_p,0,role.h,SRCAND);

    	    putimage(role.x,role.y,role.w,role.h,&img_p,0,0,SRCPAINT);

		}

		else

		{

			putimage(role.x,role.y,role.w,role.h,&img_p,4*role.w,role.h,SRCAND);

    	    putimage(role.x,role.y,role.w,role.h,&img_p,4*role.w,0,SRCPAINT);

		}

	}

	else

	{

		if(role.turn==1)

		{

			putimage(role.x,role.y,role.w,role.h,&img_p,role.w,role.h,SRCAND);

    	    putimage(role.x,role.y,role.w,role.h,&img_p,role.w,0,SRCPAINT);

		}

		else

		{

			putimage(role.x,role.y,role.w,role.h,&img_p,3*role.w,role.h,SRCAND);

    	    putimage(role.x,role.y,role.w,role.h,&img_p,3*role.w,0,SRCPAINT);

		}

	}

}  

int game::isdie()

{

	if(role.y>=YSIZE)

		return 1;

	else

		return 0;

}

int game::GetCommand()

{

	int c = 0;



	if (GetAsyncKeyState('A') & 0x8000)

		c |= CMD_LEFT;

	if (GetAsyncKeyState('D') & 0x8000)

    	c |= CMD_RIGHT;

	if ((GetAsyncKeyState('W') & 0x8000)||(GetAsyncKeyState('K') & 0x8000))

    	c |= CMD_UP;

	if (GetAsyncKeyState('S') & 0x8000)

    	c |= CMD_DOWN;

	if (GetAsyncKeyState('J') & 0x8000)

    	c |= CMD_SHOOT;

	if (GetAsyncKeyState(VK_ESCAPE) & 0x8000)

    	c |= CMD_ESC;

	return c;

}

void game::left()

{

	role.iframe*=-1;	

	role.turn=-1;

	role.x-=STEP;

	

	if(is_l_touch(1)==1)

		role.x+=STEP;	

	if(role.x<role.xleft)

      	role.x+=STEP;

}

void game::right()

{

	role.iframe*=-1;	

	role.turn=1;

	role.x+=STEP;

	

	if(is_r_touch(1)==1)

		role.x-=STEP;

	if(role.x>role.xright&&(-xmap+role.x<90*role.w))

	{

    	role.x-=STEP;

		xmapsky-=1;

	    xmap-=STEP;

	}

}

void game::up()

{

	mciSendString("play mymusic4 from 0", NULL, 0, NULL);

	role.iframe*=-1;	

	v0=-sqrt(2*G*HIGH);

	role.jump=1;

}

void game::init_shoot()

{

	mciSendString("play mymusic2 from 0", NULL, 0, NULL);

	ibullet++;

	if(ibullet==20)

		ibullet=0;

	bullet[ibullet].id=1;

	bullet[ibullet].y=role.y+8;

    bullet[ibullet].turn=role.turn;



	if(bullet[ibullet].turn==1)

		bullet[ibullet].x=role.x+10;

	else

		bullet[ibullet].x=role.x-26;

}

int game::is_l_touch(int id)

{

	int x,y;

	int i;

	if(id==1)						// id==1表示主角是否碰到id为1的地图,及游戏中黄色的地图

	{

    	x=-xmap+role.x;

    	y=role.y;

    	for(i=0;i<350;i++)

    	{

    		if(map[i].id!=0&&map[i].id<4)

    		{

    			POINT m[2];



			    m[0].x=map[i].x;

			    m[0].y=map[i].y;



		    	m[1].x=map[i].x+role.w;

		    	m[1].y=map[i].y;



				if(map[i].id==3)

				{

					if(((y-m[1].y)/role.h==0||(y-m[1].y-role.h)/role.h==0)&&x>m[1].x&&x<m[1].x+role.w)

			    	    return 1;

				}

				else

				{

					if((y-m[1].y)/role.h==0&&x>m[0].x&&x<m[1].x)

			    	    return 1;

				}

		    }

	    }

	    return 0;

	}

   	else if(id==2)	// id==2表示主角是否碰到敌人的左边

   	{

        x=-xmap+role.x;

       	y=role.y;

       	for(i=0;i<20;i++)

		{

        	if(enemy[i].id!=0)

        	{

		    	POINT m[2];  



	    		m[0].x=enemy[i].x;

	    		m[0].y=enemy[i].y;



	    	   	m[1].x=enemy[i].x+role.w;

		    	m[1].y=enemy[i].y;



		    	if((y-m[1].y)/role.h==0&&x>m[0].x&&x<m[1].x)  		

	    			return 1;

			}

		}

	    return 0;

	}

	else	// id==3表示敌人是否碰到地图的左边

	{

		int j;

		for(j=0;j<20;j++)

		{

			if(enemy[j].id!=0)

			{

    	        x=enemy[j].x;

    	        y=enemy[j].y;

			

    	        for(i=0;i<350;i++)

		        {

            		if(map[i].id!=0&&map[i].id<4)

            		{

            			POINT m[2];

     

			            m[0].x=map[i].x;

	        		    m[0].y=map[i].y;



		            	m[1].x=map[i].x+role.w;

		            	m[1].y=map[i].y;



			         	if(map[i].id==3)

			           	{

			        		if(((y-m[1].y)/role.h==0||(y-m[1].y-role.h)/role.h==0)&&x>m[1].x&&x<m[1].x+role.w)

			    	            return 1;

		         		}   

			        	else

			        	{

			        		if((y-m[1].y)/role.h==0&&x>m[0].x&&x<m[1].x)

			    	            return 1;

				        }   

					}

				}

			}

		}

		return 0;

	}

}

int game::is_r_touch(int id)

{

	int x,y;

	int i;

	if(id==1)

	{    

	    x=-xmap+role.x+role.w;

	    y=role.y;



	    for(i=0;i<350;i++)

    	{

	    	if(map[i].id!=0&&map[i].id<4)

		    {

			    POINT m[2];

 

    			m[0].x=map[i].x;

    			m[0].y=map[i].y;



    			m[1].x=map[i].x+role.w;

    			m[1].y=map[i].y;



				if(map[i].id==3)

				{

					if(((y-m[0].y)/role.h==0||(y-m[0].y-role.h)/role.h==0)&&x>m[0].x&&x<m[1].x)

			    	    return 1;

				}

				else

				{

					if((y-m[0].y)/role.h==0&&x>m[0].x&&x<m[1].x)

		    		    return 1;

				}

		    }

	    }

	    return 0;

	}

	else if(id==2)

	{

	    x=-xmap+role.x+role.w;

	    y=role.y;



	    for(i=0;i<20;i++)

	    {

		    if(enemy[i].id!=0)

		    {

		    	POINT m[2];



			    m[0].x=enemy[i].x;

		    	m[0].y=enemy[i].y;

 

    			m[1].x=enemy[i].x+role.w;

    			m[1].y=enemy[i].y;



	    		if((y-m[0].y)/role.h==0&&x>m[0].x&&x<m[1].x)

		    		return 1;

	    	}

	    }

	    return 0;

	}

	else

	{

		int j;

		for(j=0;j<20;j++)

		{

			if(enemy[j].id!=0)

			{

			    x=enemy[j].x+role.w;

	            y=enemy[j].y;

			

	            for(i=0;i<350;i++)

		        {

	            	if(map[i].id!=0&&map[i].id<4)

        		    {

		        	    POINT m[2];

 

            			m[0].x=map[i].x;

            			m[0].y=map[i].y;



            			m[1].x=map[i].x+role.w;

    	        		m[1].y=map[i].y;



			        	if(map[i].id==3)

			        	{

				        	if(((y-m[0].y)/role.h==0||(y-m[0].y-role.h)/role.h==0)&&x>m[0].x&&x<m[1].x)

			    	            return 1;

				        }

				        else

				        {

					        if((y-m[0].y)/role.h==0&&x>m[0].x&&x<m[1].x)

		    		            return 1;

				        }

					}

	            }

			}

		}

		return 0;

	}

}

int game::is_t_touch()

{

	int x,y;

	x=-xmap+role.x;

	y=role.y;



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

	{

		if(map[i].id!=0&&map[i].id<4)

		{

			POINT m[2];



			m[0].x=map[i].x;

			m[0].y=map[i].y;



			m[1].x=map[i].x;

			m[1].y=map[i].y+role.h;



			if((x-m[1].x)/role.w==0&&y>m[0].y&&y<m[1].y)

				return 1;

		}

	}

	return 0;

}

int game::is_b_touch(int id)

{

	if(id==1)

	{

	    int x,y;

	    x=-xmap+role.x;

    	y=role.y+role.h;



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

	    {

    		if(map[i].id!=0&&map[i].id<4)

    		{

    			POINT m[2];  



    			m[0].x=map[i].x;

	    		m[0].y=map[i].y;



	    		m[1].x=map[i].x; 

		    	m[1].y=map[i].y+role.h;



				if(map[i].id==3)

				{

					if(((x-m[0].x)/role.w==0||(x+role.w-m[0].x-2*role.w)/role.w==0)&&y>=m[0].y&&y<m[1].y)

			    	    return 1;

				}

				else

				{

					if((x-m[0].x)/role.w==0&&y>=m[0].y&&y<m[1].y)

			    	    return 1;

				}

			}

		}

	    return 0;

	}

	else if(id==2)

	{

		int x,y;

	    x=-xmap+role.x;

	    y=role.y+role.h;



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

    	{

    		if(enemy[i].id!=0)

    		{

    			POINT m[2];



	    		m[0].x=enemy[i].x;

	    		m[0].y=enemy[i].y;



		    	m[1].x=enemy[i].x;

		    	m[1].y=enemy[i].y+role.h;



		    	if((x-m[0].x)/role.w==0&&y>m[0].y&&y<m[1].y)

				{

			    	mciSendString("play mymusic7 from 0", NULL, 0, NULL);

					score+=10;

					bomb[i].x=enemy[i].x;

		        	bomb[i].y=enemy[i].y;

					enemy[i].id=0;

			        enemy[i].iframe=-1;

			        enemy[i].turn=1;

		        	enemy[i].x=-1;

		        	enemy[i].y=-1;

		    		return 1;

				}

		    }

		}

	    return 0;

	}

	return 0;

}

int game::is_touch()

{

	int i,j;

	POINT r[2];

	r[0].x=-xmap+role.x;

	r[0].y=role.y;

	r[1].x=-xmap+role.x+role.w;

	r[1].y=role.y+role.h;

	for(i=0;i<50;i++)

	{

		if(coint[i].x!=-1||coint[i].y!=-1)

		{

			POINT c[4];



			c[0].x=coint[i].x;

			c[0].y=coint[i].y;



			c[1].x=coint[i].x+role.w;

			c[1].y=coint[i].y;



			c[2].x=coint[i].x;

			c[2].y=coint[i].y+role.h;



			c[3].x=coint[i].x+role.w;

			c[3].y=coint[i].y+role.h;



		    for(j=0;j<4;j++)

			{

				if(c[j].x>=r[0].x&&c[j].y>=r[0].y&&c[j].x<=r[1].x&&c[j].y<=r[1].y)

				{

			    	mciSendString("play mymusic3 from 0", NULL, 0, NULL);

					score+=20;

					icoint.x=coint[i].x;

					icoint.y=coint[i].y;



					coint[i].x=-1;

					coint[i].y=-1;

					coint[i].iframe=1;



					return 1;

				}

			}

		}

	}

	return 0;

}

int game::is_land(ENEMY e)

{

	POINT r[2];

	r[0].x=e.x;

	r[0].y=e.y+role.h;



	r[1].x=e.x+role.h;

	r[1].y=e.y+role.h;



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

	{

		if(map[i].id!=0&&map[i].id<4)

		{

			POINT m[3];



			m[0].x=map[i].x;

			m[0].y=map[i].y;

			

			m[1].x=map[i].x+role.w;

			m[1].y=map[i].y;



			m[2].x=map[i].x;

			m[2].y=map[i].y+role.h;



			if(e.turn==1)

			{

				if((r[1].x-m[0].x)/role.w==0&&r[1].y>=m[0].y&&r[1].y<m[2].y)

			    	return 1;

			}

			else

			{

				if((r[0].x-m[1].x)/role.w==0&&r[0].y>=m[0].y&&r[0].y<m[2].y)

			    	return 1;

			}

		}

	}

	return 0;

}

void game::getbullet()

{

	int i;

	POINT r[2];

	r[0].x=-xmap+role.x;

	r[0].y=role.y;

	r[1].x=-xmap+role.x+role.w;

	r[1].y=role.y+role.h;



	POINT b[4];

	b[0].x=xbullet;

	b[0].y=ybullet;



	b[1].x=xbullet+52;

	b[1].y=ybullet;



	b[2].x=xbullet;

	b[2].y=ybullet+25;



	b[3].x=xbullet+52;

	b[3].y=ybullet+25;

	

	for(i=0;i<4;i++)

	{

		if(b[i].x>=r[0].x&&b[i].y>=r[0].y&&b[i].x<=r[1].x&&b[i].y<=r[1].y)

		{

			mciSendString("play mymusic8 from 0", NULL, 0, NULL);

			get_bullet=1;

			xbullet=0;

			ybullet=0;

		}

	}

}

void game::fall()           

{



	h=v0*t+G*pow(t,2)/2;

	

    role.y+=(int)(h+0.5);

	if(v0>=0)		// 自由落体

	{

		if(isdie()==1)

			return;    

		if(is_b_touch(1)==1)

		{

			v0=0;

			role.y=role.y/role.h*role.h;

			role.jump=0;

		}

	}

	else			// 向上跳跃

	{

		if(v0>=0)

			h=0;

		else

			role.y+=(int)(h+0.5);



		if(is_t_touch()==1)

		{

			v0=0;

			h=0;

			role.y=role.y/role.h*role.h+role.h;

		}

	}

	v0=v0+G*t;

}

void game::shoot()

{

	int i;

	for(i=0;i<20;i++)

	{

		if(bullet[i].id==1)

		{

			

	        if(bullet[i].turn==1)

			{

	     	    bullet[i].x+=2*STEP;

			}

			else

			{

		        bullet[i].x-=2*STEP;

			}

			if((bullet[i].x<(-3*role.w))||(bullet[i].x>XSIZE))

			{

		        bullet[i].id=0;

				bullet[i].x=-1;

	            bullet[i].y=-1;

	            bullet[i].iframe=1;

	            bullet[i].turn=1;	

			}

	        if(eat(bullet[i])==1)

			{

		        bullet[i].id=0;

				bullet[i].x=-1;

	            bullet[i].y=-1;

	            bullet[i].iframe=1;

	            bullet[i].turn=1;



				bomb[i].x=temp.x;

				bomb[i].y=temp.y;

			}

			bullet[i].iframe*=-1;

		}

	}

}



int game::eat(BULLET b)

{

	POINT r[4];

	r[0].x=-xmap+b.x+role.w/2;

	r[0].y=b.y;

	r[1].x=-xmap+b.x+role.w;

	r[1].y=b.y;

	r[2].x=-xmap+b.x+role.w/2;

	r[2].y=b.y+role.h/2;

	r[3].x=-xmap+b.x+role.w;

	r[3].y=b.y+role.h/2;



	int i;

	for(i=0;i<350;i++)

	{

		if(map[i].id!=0&&map[i].id<4)

		{

			POINT m[2];



			m[0].x=map[i].x;

			m[0].y=map[i].y;



			if(map[i].id==3)

			{

				m[1].x=map[i].x+2*role.w;

			    m[1].y=map[i].y+2*role.h;

			}

			else

			{

				m[1].x=map[i].x+role.w;

			    m[1].y=map[i].y+role.h;

			}



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

			{

				if(r[j].x>m[0].x&&r[j].x<m[1].x&&r[j].y>m[0].y&&r[j].y<m[1].y)

				{

	                mciSendString("play mymusic6 from 0", NULL, 0, NULL);

					temp.x=r[0].x-role.w/4;

			        temp.y=r[0].y-role.w/4;

					return 1;

				}

			}

		}

		if(i<20)

		{

	    	if(enemy[i].id==1)

	    	{

	    		POINT e[2];



    			e[0].x=enemy[i].x;

    			e[0].y=enemy[i].y;



	    		e[1].x=enemy[i].x+role.w;

				e[1].y=enemy[i].y+role.h;



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

			    {

				    if(r[j].x>e[0].x&&r[j].x<e[1].x&&r[j].y>e[0].y&&r[j].y<e[1].y)

			    	{

						

	                    mciSendString("play mymusic5 from 0", NULL, 0, NULL);

						score+=10;

			    		temp.x=enemy[i].x;

			            temp.y=enemy[i].y;



			    		enemy[i].id=0;

		    			enemy[i].iframe=-1;

		    			enemy[i].turn=1;

		    			enemy[i].x=-1;

		    			enemy[i].y=-1;



				    	return 1;

				    }

			    }

		    }

		}

	}

	return 0;

}

void game::end()

{

	MyTimer tt;

	EndBatchDraw();

	if(isdie()==1||win==1)

		pause=0;

	if(pause==1)

		return;

	if(win==1)

		tt.Sleep(5000);

	else

		tt.Sleep(2700);

	mciSendString("close all", NULL, 0, NULL);	

	tt.Sleep(1000);

	

	if(win==1)

	{

		pause=0;

		score=0;

		life=0;

		mciSendString("open res\\通关.mp3 alias mymusic13", NULL, 0, NULL);

	    mciSendString("play mymusic13", NULL, 0, NULL);

		putimage(0,-3*YSIZE,&img_home);

		tt.Sleep(7000);

		mciSendString("close mymusic13", NULL, 0, NULL);

	}

	else

	{

		score=0;

		if(life==0)

		{

			mciSendString("open res\\游戏结束.mp3 alias mymusic12", NULL, 0, NULL);

	        mciSendString("play mymusic12", NULL, 0, NULL);

			putimage(0,-YSIZE,&img_home);

		    tt.Sleep(5500);

	        mciSendString("close mymusic12", NULL, 0, NULL);

		}

		else

		{

			cleardevice();

			outtextxy(XSIZE/2-43,YSIZE/3,"生命还剩下:");

			if(life==1)

				outtextxy(XSIZE/2,YSIZE/2-20,"1");

			else if(life==2)

				outtextxy(XSIZE/2,YSIZE/2-20,"2");

			tt.Sleep(2000);

		}

	}

	cleardevice();

}

void main()

{

	game g;

	while(true)

	{

		g.start();

	    g.init();

		mciSendString("play mymusic1 repeat", NULL, 0, NULL);

	    g.show();

        g.move();

	    g.end();

	}

}

 

=======================================================
转载请注明出处:http://blog.csdn.net/utimes/article/details/8977555
=======================================================

 

你可能感兴趣的:(game)