坦克大战俄罗斯方块原码Word文件下载.docx
- 文档编号:19381021
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:37
- 大小:40.79KB
坦克大战俄罗斯方块原码Word文件下载.docx
《坦克大战俄罗斯方块原码Word文件下载.docx》由会员分享,可在线阅读,更多相关《坦克大战俄罗斯方块原码Word文件下载.docx(37页珍藏版)》请在冰豆网上搜索。
#defineRight3
//地图标记的宏定义
#defineEmpty0
#definePlayer1
#definePlayerBullet2
#defineEnemyBullet3
#defineEnemy4
intKill;
intKillRed;
intKillGreen;
intEnemyExist;
voidSetPos(inti,intj)//设定光标位置
{
COORDpos={i,j};
HANDLEOut=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(Out,pos);
}
voidHideCurSor(void)//隐藏光标
CONSOLE_CURSOR_INFOinfo={1,0};
SetConsoleCursorInfo(Out,&
info);
intsharp[4][12]=
{0,1,1,0,1,1,1,2,2,0,2,2},
{0,0,0,2,1,0,1,1,1,2,2,1},
{0,1,0,2,1,0,1,1,2,1,2,2},
{0,0,0,1,1,1,1,2,2,0,2,1},
};
//此数组用来保存坦克各个方向的形状信息
DWORDWINAPIBulletfly(LPVOIDlpParameter);
//子弹函数申明
voidUpdata();
//更新界面信息函数申明
classTank//坦克类
private:
intDirection;
//方向
inthotpoint[2];
//活动点
intSpeed;
//速度
intFirePower;
//火力
public:
Tank(intdir,inthot1,inthot2,inttyp,intspe,intfirepow)//构造函数
{
Direction=dir;
hotpoint[0]=hot1;
hotpoint[1]=hot2;
Type=typ;
Speed=spe;
FirePower=firepow;
}
intType;
//坦克的种类(详见宏定义)
intID;
//坦克在MAP中的标记(详见宏定义)
intFireEnable;
//是否可以开火
intLife;
//生命值
voidRunning();
//运行函数
intJudge(intx,inty,intID);
//判断是否可以绘制坦克
voidDrawTank();
//重绘坦克
voidRedraw();
//擦除坦克
intGetSpeed()//获取速度
returnSpeed;
intGetFire()//获取火力
returnFirePower;
intGetDirection()//获取方向
returnDirection;
intGetHotX()//获取活动点坐标
returnhotpoint[0];
intGetHotY()
returnhotpoint[1];
voidIncreaseFire()//火力+
FirePower++;
voidIncreaseSpeed()//速度+
Speed++;
voidChangeDirection(intnewD)//改变方向
Direction=newD;
voidChangePos(intx,inty)//改变活动点
hotpoint[0]=x;
hotpoint[1]=y;
Tankplayer(Right,0,0,Normal,1,1);
//玩家
Tankenemy(Left,20,0,Red,1,1);
//敌人
voidTank:
:
DrawTank()//绘制坦克
inti;
intnx,ny;
if(Type==Red)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
elseif(Type==Blue)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
elseif(Type==Green)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
elseif(Type==Normal)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
for(i=0;
i<
6;
i++)
{
nx=hotpoint[0]+sharp[Direction][i*2];
ny=hotpoint[1]+sharp[Direction][i*2+1];
SetPos((ny+1)*2,nx+1);
//利用sharp数组相对于点x,y绘制形状
map[nx][ny]=ID;
cout<
<
"
■"
;
Redraw()//擦除坦克,原理同上
map[nx][ny]=Empty;
"
intTank:
Judge(intx,inty,intdir)//判断当前是否可以绘制坦克
nx=x+sharp[dir][i*2];
ny=y+sharp[dir][i*2+1];
if(nx<
0||nx>
=23||ny<
0||ny>
=23||map[nx][ny]!
=Empty)//不能绘制,返回1
return1;
return0;
Running()//坦克运行函数
intnewD;
//坦克的运行
while
(1)
if(Life==0)
{
EnemyExist=0;
//敌人不存在
return;
}
if(GameOver==1)
if(FireEnable==1&
&
GameOver==0)//如果可以开火
WaitForSingleObject(Mutex,INFINITE);
//线程拥有互斥对象
FireEnable=0;
//设为不可开火
HANDLEbullet=CreateThread(NULL,0,Bulletfly,&
ID,0,NULL);
//创建子弹线程
CloseHandle(bullet);
ReleaseMutex(Mutex);
//释放互斥对象
Sleep(100);
WaitForSingleObject(Mutex,INFINITE);
srand((int)time(0));
newD=rand()%4;
if(newD==Up)//随机出新的方向并重新绘制坦克
Redraw();
if(Judge(hotpoint[0]-1,hotpoint[1],newD)==0)
{
hotpoint[0]--;
Direction=newD;
}
else
if(Judge(hotpoint[0],hotpoint[1],newD)==0)
Direction=newD;
elseif(newD==Down)
if(Judge(hotpoint[0]+1,hotpoint[1],newD)==0)
hotpoint[0]++;
elseif(newD==Left)
if(Judge(hotpoint[0],hotpoint[1]-1,newD)==0)
hotpoint[1]--;
elseif(newD==Right)
if(Judge(hotpoint[0],hotpoint[1]+1,newD)==0)
hotpoint[1]++;
if(GameOver==0&
Life!
=0)
DrawTank();
ReleaseMutex(Mutex);
Sleep(500-80*Speed);
/*********************子弹线程函数*******************/
DWORDWINAPIBulletfly(LPVOIDlpParameter)
int*ID=(int*)lpParameter;
//ID用来获取发射子弹坦克的ID
intPos[2];
//子弹活动点
intdirection;
inttype;
inthit=0;
//击中标记
intoldx,oldy;
//旧活动点
intflag=0;
//子弹是否有移动的标记
if(*ID==Player)//如果是玩家坦克
type=PlayerBullet;
direction=player.GetDirection();
Speed=player.GetFire();
Pos[0]=player.GetHotX();
Pos[1]=player.GetHotY();
elseif(*ID==Enemy)//如果是敌人坦克
type=EnemyBullet;
direction=enemy.GetDirection();
Speed=enemy.GetFire();
Pos[0]=enemy.GetHotX();
Pos[1]=enemy.GetHotY();
if(direction==Up)//根据坦克的位置和方向确定子弹的初始坐标
Pos[0]--;
Pos[1]++;
elseif(direction==Down)
Pos[0]+=3;
elseif(direction==Left)
Pos[0]++;
Pos[1]--;
elseif(direction==Right)
Pos[1]+=3;
//子弹的运行
//这个不再注释了。
。
if(flag==1&
hit!
=1)//擦除原位置
map[oldx][oldy]=Empty;
SetPos((oldy+1)*2,oldx+1);
return0;
if(hit==1||Pos[0]<
0||Pos[0]>
22||Pos[1]<
0||Pos[1]>
22)//如果击中
Sleep(500);
if(type==PlayerBullet)
player.FireEnable=1;
elseif(type=EnemyBullet)
enemy.FireEnable=1;
break;
switch(map[Pos[0]][Pos[1]])//子弹经过的MAP的标记
caseEmpty:
//如果是空位置就绘制子弹
map[Pos[0]][Pos[1]]=type;
SetPos((Pos[1]+1)*2,Pos[0]+1);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
cout<
casePlayer:
//如果是玩家位置
if(type!
=PlayerBullet)
player.Life--;
//生命减少
if(player.Life<
GameOver=1;
Updata();
hit=1;
caseEnemy:
//如果是敌人位置
hit=1;
else
{
Kill++;
if(Kill%20==0&
player.Life<
5)//击杀数++
player.Life++;
if(enemy.Type==Red)//如果击杀红坦克
{
KillRed++;
if(KillRed%10==0&
player.GetFire()<
5)
player.IncreaseFire();
}
if(enemy.Type==Green)///如果击杀绿坦克
KillGreen++;
if(KillGreen%10==0&
player.GetSpeed()<
player.IncreaseSpeed();
enemy.Redraw();
//擦除敌人
enemy.Life=0;
//敌人死亡
}
Updata();
oldx=Pos[0];
oldy=Pos[1];
if(direction==Up)//子弹移动
flag=1;
Sleep(60-10*Speed);
/*************************敌人线程函数***************************/
DWORDWINAPITankRuning(LPVOIDlpParameter)
Sleep(400);
intPos;
intStart[2];
//敌人起始地址
inttyp;
intfire;
intspe;
srand((int)time(0));
//随机出敌人起始地址
Pos=rand()%4;
if(Pos==0)
Start[0]=2;
elseif(Pos==1)
Start[1]=18;
elseif(Pos==2)
Start[0]=18;
Start[1]=2;
elseif(Pos==3)
if(player.Judge(Start[0],Start[1],Down)==0)
WaitForSingleObject(Mutex,INFINITE);
typ=rand()%3+1;
//随机出敌人的种类
if(typ==Blue)
spe=1+level;
fire=1+level;
elseif(typ==Red)
fire=3+level;
elseif(typ==Green)
spe=3+level;
enemy=Tank(Down,Start[0],Start[1],typ,spe,fire);
//重新生成敌人坦克
enemy.ID=Enemy;
enemy.Life=1;
enemy.FireEnable=1;
ReleaseMutex(Mutex);
enemy.Running();
voidInit()//初始化函数
Kill=0;
KillRed=0;
KillGreen=0;
player=Tank(Left,0,0,Normal,1,1);
enemy=Tank(Left,0,0,Red,1,1);
player.Life=2;
player.FireEnable=1;
enemy.Life=0;
player.ID=Player;
EnemyExist=0;
voidUpdata()//更新界面信息
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
SetPos(53,0);
cout<
生命值:
SetPos(53,1);
5;
if(i<
player.Life)
cout<
else
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
SetPos(53,3);
移动速度:
SetPos(53,4);
player.GetSpeed())
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
SetPos(53,5);
火力:
SetPos(53,6);
player.GetFire()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 坦克 大战 俄罗斯方块