VS2019实现简易的射击坦克小游戏(easyx)

小游戏

使用vs2019写的,进入游戏,可以进行射击的小游戏。十分的简单,但运行有一点点慢。

效果图

在这里插入图片描述
还有·另外一种:
在这里插入图片描述
总之是用easyX库来实现的,是之前的小作业。也是C有意思的一点。

玩法

可以ASDW控制,左键开火,右键放置障碍。

代码


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<graphics.h>
#include<windows.h>
#include<time.h>
#include<Mmsystem.h>
#include<conio.h>
using namespace std;
struct TANK
{
	int x1;
	int y1;//定义坦克出来的位置
};
   TANK tank[50];
   int i = 0;
   int tlong = 30;// 定义坦克的长度
   int thig = 30;//坦克宽度
   int x2=50;
   int y2=375;//玩家的位置坐标(x2,y2)
   int ky;//从键盘得到的命令

   int temp_x2 = 50;
   int temp_y2 = 375;

   MOUSEMSG m;//定义鼠标事件

void drawtank()//画出坦克
{
	
	setcolor(RED);
	setfillcolor(RED);
	rectangle(tank[i].x1, tank[i].y1, tank[i].x1 + tlong, tank[i].y1 + thig);
	fillrectangle(tank[i].x1, tank[i].y1, tank[i].x1 + tlong, tank[i].y1 + thig);
	setlinestyle(PS_SOLID,5);
	line(tank[i].x1 + tlong/2, tank[i].y1 + tlong, tank[i].x1 + tlong/2, tank[i].y1 + tlong+20);//绘制炮管
}
//记住炮口坐标 (tank[i].x1 + tlong/2, tank[i].y1 + tlong+20)

void enemyfire()//模拟敌方开火
{
	int b=0;//炮弹增加值

	for (int a=0; a < 10; a++)
	{
		b = b + 40;
		setcolor(YELLOW);
		setlinestyle(PS_SOLID,8);
		circle(tank[i].x1 + tlong / 2, tank[i].y1 + tlong + 20 + b, 2);
		Sleep(10);
		setcolor(WHITE);
		setlinestyle(PS_SOLID,8);
		circle(tank[i].x1 + tlong / 2, tank[i].y1 + tlong + 20 + b, 2);
	}
}

void hideplayer()//让玩家在移动前被覆盖,即掩码图
{
	setcolor(WHITE);
	setfillcolor(WHITE);
	circle(temp_x2, temp_y2, 8);
	fillcircle(temp_x2, temp_y2, 8);
}

void drawplayer()//画出玩家新的位置,达到使其移动的效果
{
	setcolor(GREEN);
	setfillcolor(GREEN);
	circle(x2, y2, 8);
	fillcircle(x2, y2, 8);
}

void playermove()//定义玩家角色
{
	int dis = 30;//人物移动距离
	
	//记录玩家角色之前所在的坐标
	
	setcolor(GREEN);
	

	if (_kbhit())
	{

		ky = _getch();
		switch (ky)
		{
		case 97://a

			temp_x2 = x2;
			temp_y2 = y2;//用temp_x2,y2保存该点之前的坐标,即掩码图坐标

			hideplayer();
			x2=x2-dis;
			drawplayer();
		
		
			break;
			
		case 100://d
			temp_x2 = x2;
			temp_y2 = y2;//用temp_x2,y2保存该点之前的坐标,即掩码图坐标

			hideplayer();
			x2=x2+dis;
			drawplayer();
		

			break;
			
		case 115://s
			temp_x2 = x2;
			temp_y2 = y2;//用temp_x2,y2保存该点之前的坐标,即掩码图坐标

			hideplayer();
			y2=y2+dis;
			drawplayer();
		
			break;
			
		case 119://w
			temp_x2 = x2;
			temp_y2 = y2;//用temp_x2,y2保存该点之前的坐标,即掩码图坐标

			hideplayer();
			y2 = y2 - dis;
			drawplayer();
			break;
			
		}
	}

}

void startup()
{
	
	for (int i = 0; i < 50; i++)
	{
		tank[i].x1 = rand() % 920;
		tank[i].y1 = rand() % 593;
	}
}

void playerfire()                    //设置玩家开火,x2,y2为玩家坐标!!记住!!
{                                    //发射火箭弹QAQ!!!!
	int k;      
	//计算发射点到目标点的斜率,以确定路径
	m = GetMouseMsg();



	switch (m.uMsg)
	{
	case WM_LBUTTONDOWN:
		
		/*int x3 = 0;int y3 = 0;//设置x3,y3为暂时值,(同时知道了m.x与m.y鼠标坐标)*/
		/*	k = (m.y - y2) / (m.x - x2);
		setcolor(YELLOW);
		for (    ; x3< m.x||y3<m.y;    )
		{
			x3 = x2;
			y3 = y2;//用来存放x2,y2(玩家坐标)的值,以防其被随意改变


			setcolor(YELLOW);
			setlinestyle(PS_SOLID, 8);
			circle(x3,y3,2);
			Sleep(10);
			setcolor(WHITE);
			setlinestyle(PS_SOLID, 8);
			circle(x3,y3,2);
			x3 = x3 + 3;
			y3 = y3 + 3*k;
		}*/
		setcolor(YELLOW);
		setlinestyle(PS_SOLID, 2);
		line(x2, y2, m.x, m.y);

		Sleep(800);

		setcolor(WHITE);
		setlinestyle(PS_SOLID, 8);
		line(x2, y2, m.x, m.y);

		setfillcolor(WHITE);
		solidcircle(m.x, m.y, 40);
		break;
		

	case WM_RBUTTONDOWN:
		int sl = 10; int sr = 30;//定义掩体的长度
		setcolor(BLUE);
		rectangle(m.x+sr,m.y +sl, m.x -sr, m.y -sl);
		setfillcolor(BLUE);
		fillrectangle(m.x + sr,m.y + sl, m.x - sr, m.y - sl);
		break;
	
	}
			
			
}
int dis;
void surface()
{
	cout << endl << endl <<endl<<endl<< "                                     坦克小游戏" << endl;
	cout << "游戏说明:" << endl;
	cout << "                按“ASDW”进行上下左右移动 ,按鼠标左键 点击 目标坦克开炮,鼠标右键释放掩体 " << endl<<endl;
	cout << "                选择游戏难度  输入(1)普通敌人,(2)一般敌人,(3)冷酷敌人" << endl<<endl;
	cout << " ----------------------------输入数字,选择难度,按ENTER进入游戏-------------------------------- " << endl;
	cin >> dis;

}

int main()
{
	int dis2;
	surface();
	if (dis == 1)
	{
		dis2 = 100;
	}
	if (dis == 2)
	{
		dis2 = 50;
	}
	if (dis == 3)
	{
		dis = 20;
	}
	else
	{
		dis = 100;
	}
	int windowwid = 920;
	int windowhig = windowwid * 0.618;
	
	initgraph(windowwid, windowhig);
	setbkcolor(WHITE);
	cleardevice();

	for (int k = 0; ; k++)
	{
		
		if (k % dis == 0)
		{
			startup();
			drawtank();
			enemyfire();
			
		}
		drawplayer();
		playermove();
		playerfire();
		








	}
}
	    
		
	

	


	

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F1gh4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值