小游戏
使用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();
}
}