破晓

17岁

自制小游戏 《逆行》 铜牌收录

A,D键躲避迎面而来的车辆。

展示图片

所需图片资源:

CarCar0Car2Car01road

#include <graphics.h>
#include <time.h>   
#include <stdio.h>
#include <string>
#include <tchar.h>
#include <iostream>
#include <conio.h>
using namespace std;
IMAGE Texture_BK;	//背景图
IMAGE Texture_Car;	//车
IMAGE Texture_Car2;	//车2
IMAGE Texture_BCar;	//车掩码
IMAGE Texture_BCar2;//车掩码2
struct player
{
	int x;

	int road_type;
	int time;
	bool Ctrl;
	void init() {
		Ctrl = false;
		time = 0;
	}
	void Draw()
	{
		if (Ctrl == true)
		{
			if (time == 0)
			{
				Ctrl = false;
				time = 0;
			}
			if (time > 0)
			{
				time--;
			}
		}
		if (road_type == 0)
		{
			x = 5 + (100 / 30)*time;
			putimage(5 + (100 / 30)*time, 420, &Texture_BCar, NOTSRCERASE);
			putimage(5 + (100 / 30)*time, 420, &Texture_Car, SRCINVERT);
		}
		else if (road_type == 1)
		{
			x = 115 - (100 / 30)*time;
			putimage(115 - (100 / 30)*time, 420, &Texture_BCar, NOTSRCERASE);
			putimage(115 - (100 / 30)*time, 420, &Texture_Car, SRCINVERT);
		}
	}

}Player;
struct Car {
	int road_type;//在哪条道
	int y;//高度
	int speed;
	void initCar() {
		y = -98;
		road_type = 0;
		speed = 10;
	}
	bool Draw()
	{
		if(y<610)y+=speed;
		else
		{
			return false;
		}
		if (road_type == 0)
		{
			putimage(5, y, &Texture_BCar2, NOTSRCERASE);
			putimage(5, y, &Texture_Car2, SRCINVERT);
			return true;
		}
		if (road_type == 1)
		{
			putimage(115, y, &Texture_BCar2, NOTSRCERASE);
			putimage(115, y, &Texture_Car2, SRCINVERT);
			return true;
		}
	}
};
//返回游戏分数
int PlayGame() 
{
	int By = 0;
	long int Time=0;//坚持时间
	
	Car car;
	car.initCar();
	car.speed = 6;
	while (true)
	{
		switch (Time /60)
		{
		case 100:car.speed = 7; break;
		case 200:car.speed = 8; break;
		case 400:car.speed = 9; break;
		case 600:car.speed = 10; break;
		default:
			break;
		}
		//清屏
		cleardevice();
		//控制Player
		if (Player.road_type == 1 && GetAsyncKeyState('A') && Player.Ctrl == false)
		{
			Player.road_type = 0;
			Player.time = 30;
			Player.Ctrl = true;
		}
		if (Player.road_type == 0 && GetAsyncKeyState('D') && Player.Ctrl == false)
		{
			Player.road_type = 1;
			Player.time = 30;
			Player.Ctrl = true;
		}

		//移动背景图
		if (By < 610) {
			By += 5;
		}
		else {
			By = 0;
		}
		//绘制背景图
		putimage(0, By, &Texture_BK);
		putimage(0, By - 610, &Texture_BK);

		//绘制玩家
		Player.Draw();
		//绘制车辆
		if (car.Draw() == false)
		{
			if (rand() % 20 == 1)
			{
				car.y = -190;
				if (rand() % 2 == 0)
				{
					car.road_type = 0;
				}
				else 
				{
					car.road_type = 1;
				}
			}
				
		}

		//绘制分数
		settextcolor(RGB(255,255,255));
		char dit[32];
		sprintf_s(dit, "时间:%d秒", Time / 60);
		outtextxy(0, 0, dit);

		int x = 5;
		if (car.road_type == 1)x = 115;
		//对玩家和车数据进行判断是否发生碰撞
		//判断玩家4个顶点,是否在 其他车的四个顶点中心,只要有一个在中心就被判断为被碰撞
		if ((    //判断左上角
			Player.x >= x&&
			Player.x<=x + 98 &&
			420 >=car.y &&
			420 <= car.y + 180
			) || (//判断右上角
				Player.x +98>= x &&
				Player.x +98<= x + 98 &&
				420 >= car.y &&
				420 <= car.y + 180
			) || (//判断左下角
					Player.x >= x &&
					Player.x <= x + 98 &&
					420+180 >= car.y &&
					420 +180 <= car.y + 180
			) || (//判断右下角
					Player.x + 98 >= x &&
					Player.x + 98 <= x + 98 &&
					420 + 180 >= car.y &&
					420 + 180 <= car.y + 180
				)
			)
		{
			setlinecolor(RGB(255, 0, 0));
			rectangle(x, car.y, x + 98, car.y + 180);
			setlinecolor(RGB(0, 255, 0));
			rectangle(Player.x, 420, Player.x + 98, 420 + 180);
			FlushBatchDraw();
			Sleep(1000);
			return Time/60;
		}



		//输出之前绘制的缓冲
		FlushBatchDraw();
		//锁帧60帧,1000/60=16.6..
		Sleep(16.6);
		Time++;
	}
	return -1;
}
int _tmain(int argc, _TCHAR* argv[])
{
	//加载素材
	loadimage(&Texture_BK, "res\\road.png");
	loadimage(&Texture_Car, "res\\Car.png");
	loadimage(&Texture_BCar, "res\\Car0.png");
	loadimage(&Texture_BCar2, "res\\Car01.png");
	loadimage(&Texture_Car2, "res\\Car2.png");
	initgraph(218, 610);
	setbkcolor(RGB(255, 255, 255));
	BeginBatchDraw();


	int score=-1;

	while (true)
	{
		if (MouseHit()&& GetMouseMsg().mkLButton==true)
		{
			FlushMouseMsgBuffer();//清空鼠标缓存
			score=PlayGame();
		}

		putimage(0,0,&Texture_BK);
		setbkmode(TRANSPARENT);
		settextcolor(RGB(0,0,0));
		char ps[] = "点击任意处开始游戏";
		outtextxy(210/2-textwidth(ps)/2,610/2-textheight(ps)/2, ps);

		if (score != -1)
		{
			settextcolor(RGB(0, 255, 64));
			char Sscore[32];
			sprintf_s(Sscore, "分数:%d", score);
			outtextxy(210 / 2 - textwidth(Sscore) / 2, 610 / 2 - textheight(Sscore) / 2-32, Sscore);
		}
		FlushBatchDraw();
	}
	return 0;
}


添加评论