才发现这表情都是QQ的?能不能有点创意?
#include "stdafx.h" #include <string.h> #include <stdlib.h> #include <conio.h> #include <windows.h> #include <time.h> #include "MyAStar.h" #pragma comment(lib, "Winmm.lib ") #define KEYDOWN(vk_code)((GetAsyncKeyState(vk_code)&0x8000)?1:0) int QWE = 0; int Map[30][60]={ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,0}, {0,2,2,2,2,2,2,2,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,2,2,1,1,1,2,2,0}, {0,2,2,2,2,2,2,1,1,1,1,1,2,2,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,2,1,1,1,2,2,0}, {0,2,2,2,2,2,1,1,1,1,1,1,1,2,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,2,1,1,1,2,2,0}, {0,1,1,1,2,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,2,2,2,2,2,2,3,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,2,1,1,1,2,2,0}, {0,1,1,2,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,2,1,1,1,1,2,3,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,2,1,1,1,2,2,0}, {0,1,2,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,2,1,1,1,1,2,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,2,1,1,1,2,2,0}, {0,2,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,2,2,2,1,1,1,1,2,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,2,1,1,1,2,2,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,2,2,2,1,1,1,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,2,1,1,1,2,2,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,1,1,2,1,1,1,2,1,1,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,2,1,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,2,1,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,2,1,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,3,1,1,1,1,1,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,1,3,1,1,1,1,1,1,1,1,1,2,2,1,1,1,2,2,1,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} },row,col; bool g_Tank[4][3][3]={{0,1,0, 1,1,1, 1,0,1}, {1,0,1, 1,1,1, 0,1,0}, {0,1,1, 1,1,0, 0,1,1}, {1,1,0, 0,1,1, 1,1,0}}; struct tankInfo //_TANKINFO TankInfo,*PTankInfo extern TankInfo MyTank { int a;//方向 int nPosX; int nPosY; int nType; //阵营 1是我军 0是敌军 bool g_IsBullet; }mytank ={0,2,2,1,0},jtank={3,2,27,0,0},Qtank={2,47,25,0,0},Ktank={3,23,11,0,0}, OldmyTank = mytank,oldjtank= jtank,oldqtank= Qtank,oldktank=Ktank, shoot[300]={0},shoot1[300]={0},shoot2[300]={0},shoot3[300]={0}, Bullet = {0}; //************************************ // 方法: DITU 设置游戏边框 // 函数名: DITU // 继承关系:public // 返回值: void //************************************ void DITU(){ void WriteChar(int Wide, int High, char*m_pszChar, int m_wArr); for (row=0;row<30;row++) { for (col=0;col<60;col++) { if (Map[row][col]==0) //游戏边框 WriteChar(col,row,"¤",F_RED); else if (Map[row][col]==2) //小土堆儿 WriteChar(col,row,"§",F_H_BLUE); else if (Map[row][col]==3) WriteChar(col,row,"▲",F_H_CYAN); //钢筋混凝土 else WriteChar(col,row," ",0x0); } } } //************************************ // 方法: WriteChar // 函数名: WriteChar // 继承关系:public // 返回值: void // 参数: int Wide // 参数: int High // 参数: char * m_pszChar //************************************ void WriteChar(int col, int row, char*m_pszChar, int m_wArr) { CONSOLE_CURSOR_INFO m_cci; m_cci.dwSize =2; m_cci.bVisible = FALSE; // 将该标志设为false 表示不显示光标 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &m_cci); // 设置某个控制台屏幕缓冲区的光标属性,如大小,是否可见 COORD loc ={0}; loc.X = col * 2; // Y坐标的缓冲区是X的2倍,在控制台属性里能体现出来 loc.Y = row; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), m_wArr); // 设置某个控制台屏幕缓冲区中的字符的颜色和背景色 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), loc); // 设置光标位置 printf("%s", m_pszChar); } class MyClass { public: void makejtank(); void makeQtank(); void makeKtank(); void drawshoot(tankInfo Bullet); void DrawTank(tankInfo mytank); void DrawjTank(tankInfo jtank); //画出 一般坦克 void DrawQTank(tankInfo Qtank); //画出 自动寻路坦克 void DrawKTank(tankInfo Ktank); //画出 自动寻路坦克 void ClsTank(tankInfo mytank); void MS(tankInfo pldBullet,tankInfo* pNewBullet,char * bb); //子弹碰撞 与移动 void moveShoot (tankInfo* pBullet); bool IsMoveTank(tankInfo mytank); }; //************************************ // 方法: DrawTank 画坦克 // 函数名: DrawTank // 继承关系:public // 返回值: void // 参数: tankInfo mytank //************************************ void MyClass::DrawTank(tankInfo mytank) { for (int Y= mytank.nPosY-1;Y<mytank.nPosY+2;Y++) { for (int X = mytank.nPosX-1;X<mytank.nPosX+2;X++) { if (g_Tank[mytank.a][Y-mytank.nPosY+1][X-mytank.nPosX+1]) { Map[Y][X] = 0x10; WriteChar(X,Y,"●",F_H_PURPLE); } } } } void MyClass::DrawjTank(tankInfo jtank) { for (int Y= jtank.nPosY-1;Y<jtank.nPosY+2;Y++) { for (int X = jtank.nPosX-1;X<jtank.nPosX+2;X++) { if (g_Tank[jtank.a][Y-jtank.nPosY+1][X-jtank.nPosX+1]) { Map[Y][X] = 0x18; WriteChar(X,Y,"□",F_YELLOW); } } } } void MyClass::makejtank() { ClsTank(jtank); int i=jtank.a; switch (i) { case 0: if (oldjtank.a==0) { jtank.nPosY--; }else jtank.a=0;break; case 1: if (oldjtank.a==1) { jtank.nPosY++; }else jtank.a=1;break; case 2: if (oldjtank.a==2) { jtank.nPosX--; }else jtank.a=2;break; case 3: if (oldjtank.a==3) { jtank.nPosX++; }else jtank.a=3; } if (IsMoveTank(jtank)) { ClsTank(oldjtank); DrawjTank(jtank); oldjtank = jtank; }else{ i = rand()%4; jtank = oldjtank; jtank.a = i; } int t=rand()%3; if (t==0) { for (int i=0;i<300;i++){ if (!shoot1[i].g_IsBullet) //判断数组当前位置是否为空 { tankInfo tempBullet = jtank; //把当前中心点坐标给中间值 switch (tempBullet.a) { case 0: tempBullet.nPosY-=1;break; case 1: tempBullet.nPosY+=1;break; case 2: tempBullet.nPosX-=1;break; case 3: tempBullet.nPosX+=1;break; } shoot1[i]=tempBullet; //如果为空 装填子弹 shoot1[i].g_IsBullet = true; mciSendString(L"close 2.wav",0,0,0); drawshoot(tempBullet); //画出第一个子弹 mciSendString(L"play 2.wav",0,0,0); //PlaySound(TEXT("1"),NULL,SND_FILENAME | SND_ASYNC); break; } } } } void MyClass::DrawQTank(tankInfo Qtank) { for (int Y= Qtank.nPosY-1;Y<Qtank.nPosY+2;Y++) { for (int X = Qtank.nPosX-1;X<Qtank.nPosX+2;X++) { if (g_Tank[Qtank.a][Y-Qtank.nPosY+1][X-Qtank.nPosX+1]) { Map[Y][X] = 0x20; WriteChar(X,Y,"○",F_GREEN); } } } } void MyClass::makeQtank() { CMyAStar Obj; Obj.SetMap(60,30); POSITION Begin = {Qtank.nPosX,Qtank.nPosY}; POSITION End = {mytank.nPosX,mytank.nPosY}; Obj.SetInfo(Begin,End); Obj.InitMap(Map); Obj.GetPath(); if (Obj.m_vecPath.size()>1) { switch (Qtank.nPosX-Obj.m_vecPath[1].pos_x) { case 1: //向左走 if(oldqtank.a==2) Qtank.nPosX--; else Qtank.a=2;break; break; case -1: //向右走 if (oldqtank.a==3) Qtank.nPosX++; else Qtank.a=3; break; } switch (Qtank.nPosY-Obj.m_vecPath[1].pos_y) { case 1://向上走 if (oldqtank.a==0) Qtank.nPosY--; else Qtank.a=0; break; case -1://向下走 if (oldqtank.a==1) Qtank.nPosY++; else Qtank.a=1; break; } } if (IsMoveTank(Qtank)) { ClsTank(oldqtank); DrawQTank(Qtank); oldqtank = Qtank; Obj.m_vecPath.clear(); } int t=rand()%5; if (t==1) { for (int i=0;i<300;i++){ if (!shoot2[i].g_IsBullet) //判断数组当前位置是否为空 { tankInfo tempBullet = Qtank; //把当前中心点坐标给中间值 switch (tempBullet.a) { case 0: tempBullet.nPosY-=1;break; case 1: tempBullet.nPosY+=1;break; case 2: tempBullet.nPosX-=1;break; case 3: tempBullet.nPosX+=1;break; } shoot2[i]=tempBullet; //如果为空 装填子弹 shoot2[i].g_IsBullet = true; mciSendString(L"close 2.wav",0,0,0); drawshoot(tempBullet); //画出第一个子弹 mciSendString(L"play 2.wav",0,0,0); //PlaySound(TEXT("1"),NULL,SND_FILENAME | SND_ASYNC); break; } } } } void MyClass::DrawKTank(tankInfo Qtank) { for (int Y= Qtank.nPosY-1;Y<Qtank.nPosY+2;Y++) { for (int X = Qtank.nPosX-1;X<Qtank.nPosX+2;X++) { if (g_Tank[Qtank.a][Y-Qtank.nPosY+1][X-Qtank.nPosX+1]) { Map[Y][X] = 0x22; WriteChar(X,Y,"※",F_GREEN); } } } } void MyClass::makeKtank() { CMyAStar Obj; Obj.SetMap(60,30); POSITION Begin = {Ktank.nPosX,Ktank.nPosY}; POSITION End = {mytank.nPosX,mytank.nPosY}; Obj.SetInfo(Begin,End); Obj.InitMap(Map); Obj.GetPath(); if (Obj.m_vecPath.size()>1) { switch (Ktank.nPosX-Obj.m_vecPath[1].pos_x) { case 1: //向左走 if(oldktank.a==2) Ktank.nPosX--; else Ktank.a=2;break; break; case -1: //向右走 if (oldktank.a==3) Ktank.nPosX++; else Ktank.a=3; break; } switch (Ktank.nPosY-Obj.m_vecPath[1].pos_y) { case 1://向上走 if (oldktank.a==0) Ktank.nPosY--; else Ktank.a=0; break; case -1://向下走 if (oldktank.a==1) Ktank.nPosY++; else Ktank.a=1; break; } } if (IsMoveTank(Ktank)) { ClsTank(oldktank); DrawQTank(Ktank); oldktank = Ktank; Obj.m_vecPath.clear(); } int t=rand()%6; if (t==1) { for (int i=0;i<300;i++){ if (!shoot3[i].g_IsBullet) //判断数组当前位置是否为空 { tankInfo tempBullet = Ktank; //把当前中心点坐标给中间值 switch (tempBullet.a) { case 0: tempBullet.nPosY-=1;break; case 1: tempBullet.nPosY+=1;break; case 2: tempBullet.nPosX-=1;break; case 3: tempBullet.nPosX+=1;break; } shoot3[i]=tempBullet; //如果为空 装填子弹 shoot3[i].g_IsBullet = true; mciSendString(L"close 2.wav",0,0,0); drawshoot(tempBullet); //画出第一个子弹 mciSendString(L"play 2.wav",0,0,0); //PlaySound(TEXT("1"),NULL,SND_FILENAME | SND_ASYNC); break; } } } } //************************************ // 方法: ClsTank 擦除老坦克 // 函数名: ClsTank // 继承关系:public // 返回值: void // 参数: tankInfo mytank //************************************ void MyClass::ClsTank(tankInfo mytank) { for (int Y= mytank.nPosY-1;Y<mytank.nPosY+2;Y++) { for (int X = mytank.nPosX-1;X<mytank.nPosX+2;X++) { if (g_Tank[mytank.a][Y-mytank.nPosY+1][X-mytank.nPosX+1]) { Map[Y][X] = 1; WriteChar(X,Y," ",F_H_WHITE); } } } }//************************************ // 方法: MS 子弹移动 判断碰撞 // 函数名: MS // 继承关系:public // 返回值: void // 参数: tankInfo * pBullet ,tankInfo Bullet ,char * bb指向数组的指针 //************************************ void MyClass::MS(tankInfo Bullet,tankInfo* pBullet,char * bb) { if (Map[pBullet->nPosY][pBullet->nPosX]==1) { WriteChar(Bullet.nPosX,Bullet.nPosY," ",F_H_WHITE); Map[Bullet.nPosY][Bullet.nPosX] = 1; WriteChar(pBullet->nPosX,pBullet->nPosY,bb,F_WHITE); Map[pBullet->nPosY][pBullet->nPosX] = 11; } else if (Map[pBullet->nPosY][pBullet->nPosX]==2)// 土墙 { WriteChar(Bullet.nPosX,Bullet.nPosY," ",F_H_WHITE); Map[Bullet.nPosY][Bullet.nPosX] = 1; WriteChar(pBullet->nPosX,pBullet->nPosY," ",F_H_WHITE); Map[pBullet->nPosY][pBullet->nPosX]=1; memset(pBullet,0,sizeof(tankInfo)); } else if (Map[pBullet->nPosY][pBullet->nPosX]==3||Map[pBullet->nPosY][pBullet->nPosX]==0||Map[pBullet->nPosY][pBullet->nPosX]==11) // 遇到边界 钢筋混凝土 { WriteChar(Bullet.nPosX,Bullet.nPosY," ",F_H_WHITE); Map[Bullet.nPosY][Bullet.nPosX] = 1; memset(pBullet,0,sizeof(tankInfo)); } else if (Map[pBullet->nPosY][pBullet->nPosX]==0x10) //自己坦克中弹 直接退出 { WriteChar(Bullet.nPosX,Bullet.nPosY," ",F_H_WHITE); Map[Bullet.nPosY][Bullet.nPosX] = 1; memset(pBullet,0,sizeof(tankInfo)); for (;;) {system("cls");printf("你输了");} } else if (Map[pBullet->nPosY][pBullet->nPosX]==0x18) //敌方坦克中弹 擦去 重生 { QWE++; WriteChar(Bullet.nPosX,Bullet.nPosY," ",F_H_WHITE); Map[Bullet.nPosY][Bullet.nPosX] = 1; memset(pBullet,0,sizeof(tankInfo)); ClsTank(jtank); jtank.nPosX=2; jtank.nPosY=17; makejtank(); } else if (Map[pBullet->nPosY][pBullet->nPosX]==0x20) //牛逼坦克中弹 擦去 重生 { QWE++; WriteChar(Bullet.nPosX,Bullet.nPosY," ",F_H_WHITE); Map[Bullet.nPosY][Bullet.nPosX] = 1; memset(pBullet,0,sizeof(tankInfo)); ClsTank(Qtank); Qtank.nPosX=37; Qtank.nPosY=17; makeQtank(); } else if (Map[pBullet->nPosY][pBullet->nPosX]==0x22) //2号牛逼坦克中弹 擦去 重生 { QWE++; WriteChar(Bullet.nPosX,Bullet.nPosY," ",F_H_WHITE); Map[Bullet.nPosY][Bullet.nPosX] = 1; memset(pBullet,0,sizeof(tankInfo)); ClsTank(Ktank); Ktank.nPosX=23; Ktank.nPosY=11; makeKtank(); } } void MyClass::moveShoot (tankInfo* pBullet) { tankInfo Bullet =* pBullet; switch (pBullet->a) { case 0: pBullet->nPosY--; MS(Bullet ,pBullet,"↑"); break; case 1: pBullet->nPosY++; MS(Bullet ,pBullet,"↓"); break; case 2: pBullet->nPosX--; MS(Bullet ,pBullet,"←"); break; case 3: pBullet->nPosX++; MS(Bullet ,pBullet,"→"); break; } } //************************************ // 方法: drawshoot 画出第一个子弹 // 函数名: drawshoot // 继承关系:public // 返回值: void // 参数: tankInfo Bullet //************************************ void MyClass::drawshoot(tankInfo Bullet) { if (Bullet.a==0) { WriteChar(Bullet.nPosX,Bullet.nPosY,"↑",F_WHITE); Map[Bullet.nPosY][Bullet.nPosX] = 11; } else if (Bullet.a==1) { WriteChar(Bullet.nPosX,Bullet.nPosY,"↓",F_WHITE); Map[Bullet.nPosY][Bullet.nPosX] = 11; } else if (Bullet.a==2) { WriteChar(Bullet.nPosX,Bullet.nPosY,"←",F_WHITE); Map[Bullet.nPosY][Bullet.nPosX] = 11; } else if (Bullet.a==3) { WriteChar(Bullet.nPosX,Bullet.nPosY,"→",F_WHITE); Map[Bullet.nPosY][Bullet.nPosX] = 11; } } //************************************ // 方法: IsMoveTank 判断碰撞移动 // 函数名: IsMoveTank // 继承关系:public // 返回值: bool // 参数: tankInfo mytank //************************************ bool MyClass::IsMoveTank(tankInfo mytank) { switch (mytank.a) { case 0: mytank.nPosY--; for (int X = mytank.nPosX-1;X<mytank.nPosX+2;X++) { if (Map[mytank.nPosY][X]==1) { continue; } else if (Map[mytank.nPosY][X]==2||Map[mytank.nPosY][X]==3||Map[mytank.nPosY][X]==0||Map[mytank.nPosY-1][X]==0x10||Map[mytank.nPosY-1][X]==0x18||Map[mytank.nPosY-1][X]==0x20||Map[mytank.nPosY-1][X]==0x22) { return false; } } break; case 1: mytank.nPosY++; for (int X = mytank.nPosX-1;X<mytank.nPosX+2;X++) { if (Map[mytank.nPosY][X]==1) { continue; } else if (Map[mytank.nPosY][X]==2||Map[mytank.nPosY][X]==3||Map[mytank.nPosY][X]==0||Map[mytank.nPosY+1][X]==0x10||Map[mytank.nPosY+1][X]==0x18||Map[mytank.nPosY+1][X]==0x20||Map[mytank.nPosY+1][X]==0x20) { return false; } } break; case 2: mytank.nPosX--; for (int Y = mytank.nPosY-1;Y<mytank.nPosY+2;Y++) { if (Map[Y][mytank.nPosX]==1) { continue; } else if (Map[Y][mytank.nPosX]==2||Map[Y][mytank.nPosX]==3||Map[Y][mytank.nPosX]==0||Map[Y][mytank.nPosX-1]==0x10||Map[Y][mytank.nPosX-1]==0x18||Map[Y][mytank.nPosX-1]==0x20||Map[Y][mytank.nPosX-1]==0x22) { return false; } } break; case 3: mytank.nPosX++; for (int Y = mytank.nPosY-1;Y<mytank.nPosY+2;Y++) { if (Map[Y][mytank.nPosX]==1) { continue; } else if (Map[Y][mytank.nPosX]==2||Map[Y][mytank.nPosX]==3||Map[Y][mytank.nPosX]==0||Map[Y][mytank.nPosX+1]==0x10||Map[Y][mytank.nPosX+1]==0x18||Map[Y][mytank.nPosX+1]==0x20||Map[Y][mytank.nPosX+1]==0x22) { return false; } }break; } return true; } //************************************ // 方法: Gameing 键盘键入 // 函数名: Gameing // 继承关系:public // 返回值: void //************************************ void Gameing () { MyClass u; DITU(); u.DrawTank(OldmyTank); int nTime = 4000; int nTimeShoot = 4000; srand( (unsigned)time( NULL ) ); clock_t moveStart = clock(); clock_t moveEnd ; clock_t moveEnemyStart = clock(); clock_t moveEnemyEnd ; clock_t moveBulletStart = clock(); clock_t moveBulletEnd ; while (true) { //子弹移动 moveBulletEnd = clock(); if (moveBulletEnd-moveBulletStart>20) { moveBulletStart =moveBulletEnd; for (int i=0;i<200;i++) { if (shoot[i].g_IsBullet) { u.moveShoot(&shoot[i]); //从坦克尖开始移动 u.DrawTank(mytank); //占了坦克尖端 得重新画一个坦克 } if (shoot1[i].g_IsBullet) { u.moveShoot(&shoot1[i]); //从坦克尖开始移动 u.DrawjTank(jtank); //占了坦克尖端 得重新画一个坦克 } if (shoot2[i].g_IsBullet) { u.moveShoot(&shoot2[i]); //从坦克尖开始移动 u.DrawQTank(Qtank); //占了坦克尖端 得重新画一个坦克 } if (shoot3[i].g_IsBullet) { u.moveShoot(&shoot3[i]); //从坦克尖开始移动 u.DrawKTank(Ktank); //占了坦克尖端 得重新画一个坦克 } } } //敌军移动 moveEnemyEnd = clock(); if (moveEnemyEnd-moveEnemyStart>300) { moveEnemyStart =moveEnemyEnd; u.makejtank(); // 生成敌军坦克,并移动 u.makeKtank(); u.makeQtank(); // 生成ai敌军坦克,并移动 } //接收玩家控制 moveEnd = clock(); if (moveEnd-moveStart>100) { moveStart =moveEnd; if (KEYDOWN('w')||KEYDOWN('W')) { if (OldmyTank.a==0) { mytank.nPosY--; } else mytank.a = 0; } if (KEYDOWN('s')||KEYDOWN('S')) { if (OldmyTank.a==1) { mytank.nPosY++; } else mytank.a=1; } if (KEYDOWN('a')||KEYDOWN('A')) { if (OldmyTank.a==2) { mytank.nPosX--; } else mytank.a=2; } if (KEYDOWN('d')||KEYDOWN('D')) { if (OldmyTank.a==3) { mytank.nPosX++; } else mytank.a=3; } if (KEYDOWN(' ')) { for (int i=0;i<200;i++) { if (!shoot[i].g_IsBullet) //判断数组当前位置是否为空 { Bullet = mytank; //把当前中心点坐标给中间值 switch (Bullet.a) { case 0: Bullet.nPosY-=1;break; case 1: Bullet.nPosY+=1;break; case 2: Bullet.nPosX-=1;break; case 3: Bullet.nPosX+=1;break; } shoot[i]=Bullet; //如果为空 装填子弹 shoot[i].g_IsBullet = true; mciSendString(L"close 2.wav",0,0,0); u.drawshoot(Bullet); //画出第一个子弹 mciSendString(L"play 2.wav",0,0,0); //PlaySound(TEXT("1"),NULL,SND_FILENAME | SND_ASYNC); break; } } } if (u.IsMoveTank(mytank)) //移动坦克 { u.ClsTank(OldmyTank); u.DrawTank(mytank); OldmyTank = mytank; continue; } mytank = OldmyTank; } } }