打星星

#include <iostream>
#include <time.h>
#include <windows.h>
#include "SXB.h"
#define w 15
#define h 30
#define s 450
SXB zd; //子弹
SXB dr; //敌人
int x = w/2;
int y = h-1;

char smap[9]=
{
	0,1,0,
	1,1,1,
	1,0,1

};
void main()
{
	srand(time(0));

	while (1)
	{
		MoveCursor(0, 0);
		char map[s] = {};
		for (int i = 0;i < dr.GetLen(); ++i)
		{
			ZB* a = dr.GetDataSXB(i);
			map[a->x+a->y*w] = 1;//敌人
		}
		for (int i = 0;i < zd.GetLen(); ++i)
		{
			ZB* a = zd.GetDataSXB(i);
			map[a->x+a->y*w] = 2;//子弹
		}
		for(int i = 0 ; i < 9 ; ++ i)
		{
			if(smap[i] == 1)
				map[x+i%3+(y+i/3)*w] = 3;//英雄
		}
		
		for (int y = 0;y < h; ++y)
		{
			//MoveCursor(5, w*y);
			for (int x = 0;x < w; ++x)
			{
				switch (map[x+y*w])
				{
				case 0:std::cout<<"  ";break;
				case 1:std::cout<<"卍";break;
				case 2:std::cout<<"o";break;
				case 3:std::cout<<"⑧";break;
				}
			}
			std::cout<<std::endl;
		}

		//产生敌人
		if (1)
		{
			ZB a;
			a.x = (rand()%13)+1;
			a.y = 0;
			a.count = 10;
			dr.PushbackSXB(a);
		}
		//敌人下落
		for (int i = 0; i < dr.GetLen(); ++i)
		{
			ZB* a = dr.GetDataSXB(i);
			a->count--;
			if (a->count == 0)
			{
				a->count = 1;
				a->y++;
				if (a->y > h-1)
				{
					dr.EraseSXB(i);
					i--;
				}
			}
		}
		if (GetAsyncKeyState('W') & 0x8000)
		{
			if (y > 0) y--;
		}
		if (GetAsyncKeyState('S') & 0x8000)
		{
			if (y < h-3) y++;
		}

		if (GetAsyncKeyState('A') & 0x8000)
		{
			if (x > 0) x--;
		}
		if (GetAsyncKeyState('D') & 0x8000)
		{
			if (x < w-3) x++;
		}
		//产生子弹
		if (GetAsyncKeyState(' ') & 0x8000)
		{
			ZB a1;
			a1.x = x+1;
			a1.y = y;
			a1.count = 1;
			a1.dir = 1 ;
			zd.PushbackSXB(a1);
			ZB a2;
			a2.x = x+1;
			a2.y = y;
			a2.count = 1;
			a2.dir = 2 ;
			zd.PushbackSXB(a2);
			ZB a3;
			a3.x = x+1;
			a3.y = y;
			a3.count = 1;
			a3.dir = 3 ;
			zd.PushbackSXB(a3);
			ZB a4;
			a4.x = x+1;
			a4.y = y;
			a4.count = 1;
			a4.dir = 4 ;
			zd.PushbackSXB(a4);
			ZB a5;
			a5.x = x+1;
			a5.y = y;
			a5.count = 1;
			a5.dir = 5 ;
			zd.PushbackSXB(a5);
			ZB a6;
			a6.x = x+1;
			a6.y = y;
			a6.count = 1;
			a6.dir = 6 ;
			zd.PushbackSXB(a6);
			ZB a7;
			a7.x = x+1;
			a7.y = y;
			a7.count = 1;
			a7.dir = 7 ;
			zd.PushbackSXB(a7);
		}
		//子弹上移动
		for (int i = 0;i < zd.GetLen(); ++i)
		{
			ZB* a = zd.GetDataSXB(i);
			a->count --;
			if (a->count == 0)
			{
				switch (a->dir)
				{
				case 1:	a->count = 1;
						a->y--;
						if (a->y < 1)
						{
							zd.EraseSXB(i);
							i-- ;
						}break;
				case 2:		a->count = 1;a->y -- ;
						a->x -- ;
						if (a->y < 1 || a->x <1)
						{
							zd.EraseSXB(i);
							i--;
						}break ;
				case 3:		a->count = 1;a->y -- ;
						a->x ++ ;
						if (a->y < 1 || a->x > w-2)
						{
							zd.EraseSXB(i);
							i-- ;
						}break;
				case 4:		a->count = 1;
							a->y -= 2 ;
							a->x -- ;
							if (a->y < 1 || a->x > w-2)
							{
								zd.EraseSXB(i);
								i-- ;
							}break;
				case 5:		a->count = 1;
							a->y -= 2 ;
							a->x ++ ;
							if (a->y < 1 || a->x > w-2)
							{
								zd.EraseSXB(i);
								i-- ;
							}break;
				case 6:		a->count = 1;
					a->y -= 4 ;
					a->x -- ;
					if (a->y < 1 || a->x > w-2)
					{
						zd.EraseSXB(i);
						i-- ;
					}break;
				case 7:		a->count = 1;
					a->y -= 4 ;
					a->x ++ ;
					if (a->y < 1 || a->x > w-2)
					{
						zd.EraseSXB(i);
						i-- ;
					}break;
				}
				
			}
		}
		//子弹和敌人的碰撞
		for (int i = 0;i < zd.GetLen(); ++i)
		{
			ZB* a = zd.GetDataSXB(i);

			for (int j = 0;j < dr.GetLen(); ++j)
			{
				ZB* b = dr.GetDataSXB(j);
				if (a->x == b->x && a->y == b->y)
				{
					dr.EraseSXB(j);
					zd.EraseSXB(i);
					i--;
					break;
				}
			}
		}
	}

	
}
#ifndef _SXB_H_
#define _SXB_H_
#include <iostream>

struct ZB
{
	int x;
	int y;
	int count;
	int dir ;
};
typedef ZB DATA;

class SXB
{
	DATA* p;//首地址
	int size;//容量
	int len;//长度
public:
	

	SXB();
	~SXB();

	bool InsertSXB(int xb, DATA data);//插入
	void PushbackSXB(DATA data);  //添加到末尾 
	bool EraseSXB(int xb);//删除指定
	//查找数据,返回所在下标,没找到返回-1下标
	int FindDataSXB(DATA data, bool(*bj)(DATA&, DATA&), int startxb = 0);
	DATA* GetDataSXB(int xb);//获取
	void ClearSXB();//清空
	void SortSXB(SXB* sxb, bool(*bj)(DATA&, DATA&));//排序
	int GetLen() const {return len;}
private:

};

#endif

void MoveCursor(int x, int y);
#include "SXB.h"
#include<windows.h>
void MoveCursor(int x, int y)//-----------------------------设置光标位置
{
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);///获取输出流句柄
	COORD coord;///定义COORD结构体(包含X和Y两个成员)
	coord.X = x * 2;	///设置结构体X轴
	coord.Y = y;		///设置结构体Y轴
	SetConsoleCursorPosition(hOut, coord);///设置光标位置
	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };///修改光标宽带和显示
	SetConsoleCursorInfo(hOut, &cursor_info);///设置光标不可见
}

SXB::SXB()
{
	len = 0;
	size = 1;
	p = (DATA*)malloc(sizeof(DATA) * 1);
}

SXB::~SXB()
{
	if (p)
	{
		free(p);
		p = 0;
	}
}

//插入
bool SXB::InsertSXB(int xb, DATA data)
{
	if (xb < 0 || xb > len)
		return false;
	//扩容
	if (len == size)
	{
		DATA* np = (DATA*)malloc(sizeof(DATA)* size*2);
		for (int i = 0;i < len; ++i)
			np[i] = p[i];
		free(p);
		p = np;
		size *= 2;
	}
	//移位
	for (int i = len-1; i >= xb; --i)
		p[i+1] = p[i];
	//插入数据
	p[xb] = data;
	len++;
	return true;
}

//添加到末尾
void SXB::PushbackSXB(DATA data)
{
	InsertSXB(len, data);
}

//删除指定下标的数据
bool SXB::EraseSXB(int xb)
{
	if (xb < 0 || xb > len-1)
		return false;
	for (int i = xb+1; i < len; ++i)
		p[i-1] = p[i];
	len--;
	return true;
}

//查找数据,返回所在下标,没找到返回-1下标
int SXB::FindDataSXB(DATA data, bool(*bj)(DATA&, DATA&), int startxb)
{
	for (int i = startxb; i < len; ++i)
	{
		//if (sxb->p[i] == data)//不能用==因为如果DATA是符合数据类型不能用比较运算符
		if (bj(p[i], data))
			return i;
	}
	return -1;
}

//获取某下标的数据的地址
DATA* SXB::GetDataSXB(int xb)
{
	if (xb < 0 || xb > len-1)
		return 0;
	return &p[xb];
	//return sxb->p + xb;
}

//清空
void SXB::ClearSXB()
{
	len = 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值