#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;
}