乐迪钱魏润禹


私信TA

用户名:qwry

访问量:4613

签 名:

等  级
排  名 1051
经  验 3277
参赛次数 14
文章发表 18
年  龄 0
在职情况 学生
学  校 乐迪教育
专  业

  自我简介:

1001100101101101101111111

 

 

void MoveAITank(Tank* AI_tank) //AI专用函数,该函数主要为AI加强

{

    if(AI_tank->alive)         //如果坦克活着

{

if(AI_tank->stop!=0)   //坦克是否停止运动的判断,若stop参数不为0

{

AI_tank->stop--;   //则此坦克本回合停止运动

return;

}

if( !(rand()%23) )     //22分之1的概率执行方向重置

{

AI_tank->direction = rand()%4+1;

if( rand()%3 )     //在方向重置后有2分之1的概率停止走动3步的时间

{

AI_tank->stop=2;

return;

}

}

ClearTank (AI_tank->x , AI_tank->y);

if(TankCheak ( *AI_tank , AI_tank->direction))   //如果前方无障碍

switch ( AI_tank->direction )

{

        case UP   : AI_tank->y--; break;  //上前进一格

        case DOWN : AI_tank->y++; break;  //下前进一格

          case LEFT : AI_tank->x--; break;  //左前进一格

        case RIGHT: AI_tank->x++; break;  //右前进一格

}

else                     //前方有障碍

{

if(!(rand()%4))      //3分之1的概率乱转

{

AI_tank->direction=rand()%4+1;

AI_tank->stop=2; //乱转之后停止走动3步的时间

PrintTank(*AI_tank);

return;          //∵continue会跳过下面的打印函数,∴这里先打印

}

else                 //另外3分之2的几率选择正确的方向

{

int j;

    for(j=1;j<=4;j++)

        if(TankCheak ( *AI_tank , j ))  //循环判断坦克四周有无障碍,此函数返值1为可通过

    break;

    if(j==5)         //j==5说明此坦克四周都有障碍物,无法通行

{

PrintTank(*AI_tank);

    return;      //则跳过下面的while循环以防程序卡死

}

    while(TankCheak ( *AI_tank , AI_tank->direction) == 0)  //如果前方仍有障碍

    AI_tank->direction=(rand()%4+1);                    //则换个随机方向检测

}

}

PrintTank(*AI_tank);     //打印AI坦克

}

}

 

 

void BuildMyTank (Tank* my_tank) //建立我的坦克

{

my_tank->x=15;

    my_tank->y=38;

    my_tank->stop=NULL;

    my_tank->direction=1;

    my_tank->model=0;

    my_tank->color=1;

    my_tank->alive=1;

    my_tank->my=1;

my_tank->CD=7;

    PrintTank (*my_tank) ;   //打印我的坦克

}

 

 

void MoveMyTank(int turn )   //玩家专用函数,turn为keyboard函数里因输入不同方向键而传入的不同的值

{

ClearTank(my_tank.x , my_tank.y);        //map 数组中“我的坦克”参数清除工作已在此函数中完成

my_tank.direction=turn;                  //将键盘输入的方向值传入我的坦克方向值

if(TankCheak ( my_tank , my_tank.direction ))  //若此时我的坦克当前方向上无障碍

switch (turn)

{

case UP   : my_tank.y--; break;  //上前进一格

case DOWN : my_tank.y++; break;  //下前进一格

case LEFT : my_tank.x--; break;  //左前进一格

case RIGHT: my_tank.x++; break;  //右前进一格

}                                        //若坦克当前方向上有障碍则跳过坐标变化直接打印该转向的坦克

PrintTank (my_tank);

}

 

 

bool TankCheak(Tank tank,int direction)  //检测坦克前方障碍函数,参量为假坐标。返值1为可通过,返值0为阻挡(人机共用)

{

switch(direction)                    //direction变量   1上,2下,3左,4右

{

    case UP:

if (map[tank.y-2][tank.x]==0 && map[tank.y-2][tank.x-1]==0 && map[tank.y-2][tank.x+1]==0)

return 1;

else

return 0;

        case DOWN:

if (map[tank.y+2][tank.x]==0 && map[tank.y+2][tank.x-1]==0 && map[tank.y+2][tank.x+1]==0)

return 1;

else

return 0;

case LEFT:

if (map[tank.y][tank.x-2]==0 && map[tank.y-1][tank.x-2]==0 && map[tank.y+1][tank.x-2]==0)

return 1;

else

return 0;

case RIGHT:

if (map[tank.y][tank.x+2]==0 && map[tank.y-1][tank.x+2]==0 && map[tank.y+1][tank.x+2]==0)

return 1;

else

return 0;

default:

printf("错误!!");

Sleep(5000);

return 0;

}

}

 

 

void ClearTank(int x,int y)   //清除坦克函数(人机共用)

{

for(int i=0;i<3;i++)

for(int j=0;j<3;j++)

{                     //将坦克占用的地图上的九格去掉

      map[y+j-1][x+i-1]=0;

        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);

GoToxy(2*x+2*j-2,y+i-1);

printf("  ");

}

}

 

 

void PrintTank(Tank tank)     //打印坦克(人机共用) 由于读取的Tank参数较多,故就不将参数一一传入了

{                             // tank.color参数对应不同的颜色,范围 1 ~ 6

ColorChoose(tank.color);  //颜色选择函数   定义一个数组里装着字符指针(既装字符串)的数组指针(指向一维数组首地址的指针)

    char *(*tankF)[4] = tank_figure[tank.model];  //将二维数组首址赋初值给数组指针 model==0为我的坦克,4为电脑1坦克,8为电脑2,类推

for(int i = 0; i < 3; i++)   

{

        GoToxy((tank.x-1)*2 , tank.y-1+i);        //在坦克中心坐标的左边,上中下三行打印

        printf("%s", tankF[i][tank.direction-1]); //打印的是地址,地址既字符串

      for(int j=0;j<3;j++)

if(tank.my)       //若为我的坦克

            map[tank.y+j-1][tank.x+i-1]=200;  //在map上把"坦克"九格填满代表敌我坦克的参数。敌方此值为100~103,我方为200

else

    map[tank.y+j-1][tank.x+i-1]=100+tank.num;  //这样可以通过map值读取坦克编号,读取操作在BulletHit 函数

}

}

 

 

void HideCursor()  //隐藏光标

{                  //CONSOLE_CURSOR_INFO结构体包含控制台光标的信息,DWORD dwSize光标百分比厚度(1~100)和BOOL bVisible光标是否可见

CONSOLE_CURSOR_INFO cursor_info={1,0};

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info); //SetConsoleCursorInfo用来设置指定的控制台光标的大小和可见性。

}

 

 

void GoToxy(int x,int y)  //光标移动函数,X表示横坐标,Y表示纵坐标。

{

COORD  coord;         //使用头文件自带的坐标结构

coord.X=x;            //这里将int类型值传给short,不过程序中涉及的坐标值均不会超过short范围

coord.Y=y;

HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE);  //获得标准输出句柄

SetConsoleCursorPosition(a,coord);         //以标准输出的句柄为参数设置控制台光标坐标

}

 

 

void ColorChoose(int color)   //颜色选择函数

{

switch(color)

{

    case 1:               //天蓝色(我的坦克颜色)

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);

break;

case 2:               //绿色

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);

break;

case 3:               //黄色

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);

break;

case 4:               //红色

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);

break;

case 5:               //紫色

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);

break;

case 6:               //白色

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN);

break;

case 7:               //深蓝色(∵颜色深难与黑色背景辨识度不高 ∴坦克颜色不选用此颜色),只用在字体颜色闪烁中

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);

break;

}

}

 

 

void Stop()    //暂停

{

int color=1,timing=0;

while(1)

{

if(timing++%30==0)

{

ColorChoose(color);   //颜色选择

GoToxy(100,13);       //副屏幕打印

printf("游戏暂停");

GoToxy(88,17);

printf("按回车键回到游戏");

GoToxy(88,18);

printf("或按 Esc键退出游戏");

if(++color==8)

color=1;

}

if (GetAsyncKeyState( 0xD )& 0x8000)      //回车键

{

GoToxy(100,13);       //副屏幕打印

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);

printf("正在进行");   //覆盖掉原来的提示

GoToxy(88,17);

printf("                     ");

GoToxy(88,18);

printf("                     ");

break;

}

else if(GetAsyncKeyState( 0x1B )& 0x8000) //Esc键退出

exit(0);

Sleep(20);

}

}

 

 

void ClearMainScreen()  //主屏幕清屏函数,因使用system("cls");再打印框架有一定几率造成框架上移一行的错误,所以单独编写清屏函数

{

for(int i=1;i<40;i++)

{

GoToxy(2,i);

printf("                                                                              ");

}

}

 

 

void Frame ()     //打印游戏主体框架

{                 //SetConsoleTextAttribute为设置文本颜色和文本背景颜色函数

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY);

printf("  ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁  ");

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE); 

printf("  ▂▂▂▂▂▂▂▂▂▂▂▂▂ \n");

for(int i=0;i<14;i++)

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_INTENSITY);

    printf("▕                                                                              ▏");

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE); 

printf(" |                          |\n");

}

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_INTENSITY);

printf("▕                                                                              ▏");

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE); 

printf(" |═════════════|\n");

for(int i=0;i<24;i++)

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_INTENSITY);

    printf("▕                                                                              ▏");

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE); 

printf(" |                          |\n");

}

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_INTENSITY);

printf("  ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔  ");

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_BLUE); 

printf(" ﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊\n");

SideScreen ();  //打印副屏幕

}

 

 

void PrintMap()     // 打印地图(地图既地图障碍物)

{

for(int j=0;j<41;j++)

for(int i=0;i<41;i++)

if(map[i][j]==6)

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN

|FOREGROUND_RED|FOREGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);

GoToxy(2*j,i);

printf("■");

}

else if(map[i][j]==2)

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED|BACKGROUND_GREEN|BACKGROUND_RED);

GoToxy(2*j,i);

printf("▓");

}

else if(map[i][j]==1)

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|BACKGROUND_GREEN|BACKGROUND_RED);

GoToxy(2*j,i);

printf("▓");

}

else if(map[i][j]==5)

{                      

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|BACKGROUND_BLUE|FOREGROUND_BLUE|FOREGROUND_GREEN);

GoToxy(2*j,i);

printf("~");

}

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);

GoToxy(38,37); printf("◣★◢");

GoToxy(38,38); printf("███");    //∵无论地图怎么变,家所在位置不变,且家的字符多种,不方便用上述方式打印

GoToxy(38,39); printf("◢█◣");    //∴直接打印(且家的map值与符号无关)

}


 

0.0分

0 人评分

  评论区

878
2022-07-05 18:40:12
  • «
  • 1
  • »