有没有大佬帮我指正一下错误啊,找了一个小时了没找出来

2301_80044544 2024-02-08 17:29:07
#include<bits/stdc++.h>
#include<windows.h>
#include<bitset>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) 
using namespace std; 
int tx[15][15],shi[15][15];//图像显示 
int jhdj=0,fjx,fjy;
bool jdz(int a){
	if(a<0){
		return -a;
	}else{
		return a;
	}
}
class yddy{
	protected:
		int x1(int y,int x){
			switch(drld){
				case 2:
				case 6:
					return x;
				case 7:
				case 9:
					return x-1;
				case 8:
				case 10:
					return x+1;
				case 11:
					if(shi[y][x]==0){
						if(jdz(fjy-y)<jdz(fjx-x)){
							return x;
						}else{
							return fjx;
						}
					}else{
						return x;
					}
					break;
			}
		}
		int y1(int y,int x){
			switch(drld){
				case 6:
					return y+2;
				case 11:
					if(shi[y][x]==0){
						if(jdz(fjy-y)>=jdz(fjx-x)){
							return y;
						}else{
							return fjy;
						}
					}else{
						return y;
					}
					break;
				default:
					return y+1;
			}
		}
	public:
		int drld;
		void yd(int i,int j){
			int shiyd;
			tx[i][j]=0;
			switch(tx[y1(i,j)][x1(i,j)]){
				case 1:
					tx[y1(i,j)][x1(i,j)]=4;//如果前面是人物,人物噶
					break;
				case 3:
					if(drld==10||drld==9){
						tx[i-1][j-1]=7;
						tx[i-1][j+1]=8;
						tx[i-1][j]=2;
					}
					jhdj+=1;
					tx[y1(i,j)][x1(i,j)]=5;//如果前面是炮弹,敌人噶
					break;
				case 5:
					tx[y1(i,j)][x1(i,j)]=0;//如果爆过,恢复原样
					break;
				default:
					tx[y1(i,j)][x1(i,j)]=drld;//否则前进 
					break;
			}
			if(tx[y1(i,j)][x1(i,j)]==11){
				shiyd=shi[i][j];
				shi[i][j]=0;
				if(shiyd==0){
					shi[y1(i,j)][x1(i,j)]=30;
				}else{
					shi[y1(i,j)][x1(i,j)]=shiyd-1;
				}
			}
		}
};
bool an(char a){     
	if(KEY_DOWN(a)){//用于简化KEY_DOWN() 
		return true;
	}else{
		return false;
	}
}
int main(){
	srand((unsigned)time(NULL));
	yddy a;
	int x=7,y=13,fzdr[10]={0,0,0,0,0,0,0,0,0,0},drwz[10]={0,0,0,0,0,0,0,0,0,0},fj=0,js=0,sw=0;//x,y代表战机的x,y坐标;fzdr用于控制敌人出现的时间;drwz用于控制敌人出现的位置;fj用于控制炮弹发射的频率 
	while(1){
		tx[y][x]=0;//清除痕迹 
		fj++;
		js++;
		if(an('A')&&x!=0){
			if(tx[y][x-1]==2||tx[y][x-1]>5){
				tx[y][x-1]=4;//如果即将碰到敌人,则死 
				tx[y][x]=0;
				sw++;
			}else{
				x--;
			}
		}
		if(an('D')&&x!=14){
			if(tx[y][x+1]==2||tx[y][x+1]>5){
				tx[y][x+1]=4;
				tx[y][x]=0;
				sw++;
			}else{
				x++;
			}
		}
		if(an('S')&&y!=14){
			if(tx[y+1][x]==2||tx[y+1][x]>5){
				tx[y+1][x]=4;
				tx[y][x]=0;
				sw++;
			}else{
				y++;
			}
		}
		if(an('W')&&y!=0){
			if(tx[y-1][x]==2||tx[y-1][x]>5){
				tx[y-1][x]=4;
				tx[y][x]=0;
				sw++;
			}else{
				y--;
			}
		}
		fjx=x;
		fjy=y;
		if(an('K')&&fj>2){//如果等待超过0.5s,符合条件可开火 
			tx[y-1][x]=3;
			fj=0;
		} 
		tx[y][x]=1;//定位人物
		for(int i=0;i<7;i++){
			if(fzdr[i]==0){//当是20的倍数时(间隔2s),出现敌人 
				drwz[i]=rand()%15+0;
				fzdr[i]=rand()%15+10;
				if(i==0){
					tx[0][drwz[i]]=2;
				}
				if(i==1){
					tx[0][drwz[i]]=6;
				}
				if(i==2){
					tx[0][drwz[i]]=7;
				}
				if(i==3){
					tx[0][drwz[i]]=8;
				}
				if(i==4){
					tx[0][drwz[i]]=9;
				}
				if(i==5){
					tx[0][drwz[i]]=10;
				}
				if(i==6){
					tx[rand()%15+0][drwz[i]]=11;
				}
			}
			fzdr[i]--;
		}
		for(int i=14;i>-1;i--){
			for(int j=14;j>-1;j--){
				if(tx[i][j]==2||tx[i][j]>5){
					if(tx[i][j]==7&&j==0){
						tx[i][j]=8;
					}
					if(tx[i][j]==8&&j==14){
						tx[i][j]=7;
					}
					if(tx[i][j]==9&&j==0){
						tx[i][j]=10;
					}
					if(tx[i][j]==10&&j==14){
						tx[i][j]=9;
					}
					a.drld=tx[i][j];
					a.yd(i,j);
				}
			}
		}
		for(int i=0;i<15;i++){
			for(int j=0;j<15;j++){
				if(tx[i][j]==3){//炮弹前进 
					tx[i-1][j]=3;
					tx[i][j]=0;
				}
			}
		}
		for(int i=0;i<15;i++){
			for(int j=0;j<15;j++){
				switch(tx[i][j]){//显示模块 
					case 0:
						cout<<"  ";//空格 
						break;
					case 1:
						if(sw==0){
							cout<<"士";//飞机 
						}
						break;
					case 2:
						cout<<"平";//敌人 
						break;
					case 6:
						cout<<"丅";//敌人 
						break;
					case 7:
					case 8:
						cout<<"甲";//敌人 
						break;
					case 9:
					case 10:
						cout<<"非";
						break;
					case 11:
						cout<<"十";
						break;
					case 3:
						cout<<"||";//炮弹 
						break;
					case 4:
						cout<<"米";//被击毁 
						Sleep(1000);
						system("cls");
						cout<<"你噶了,你存活了"<<js/10.0<<"秒,击毁敌机"<<jhdj<<"架";
						Sleep(1000);
						return 0;
					case 5:
						cout<<"米";//击毁敌人 
						break;       
				}
			}
			cout<<"1"; 
			cout<<endl;
		}
		for(int i=0;i<15;i++){
			cout<<"一"; 
		}
		cout<<endl;
		for(int i=0;i<15;i++){
			for(int j=0;j<15;j++){
				cout<<shi[i][j]<<'\t';
			}
			cout<<endl;
		}
		cout<<"存活时间:"<<js/10.0<<"s,击毁敌机"<<jhdj<<"架";
		Sleep(100);
		system("cls");
	}	
}
//阿泽开发,禁止抄袭 

其他一切正常,但是敌机“十”,本来我是想让它隔一段时间移动到我方飞机同行(同列)的,但是他一直定位,有没有大佬帮我修复一下,指正我的错误?谢谢了。(编程小白,找不出错误)

...全文
214 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

问题出在您对 tx[i][j] == 11 情况的处理上。您希望 "十" 型敌机能够移动到玩家飞机的同列,但现有的代码只会使其保持静止。

#要解决这个问题,您需要修改 yddy::yd() 函数,在处理 tx[i][j] == 11 的情况下添加移动逻辑。以下是修改后的代码:

void yddy::yd(int i, int j) {
  int shiyd;
  tx[i][j] = 0;
  switch (tx[y1(i, j)][x1(i, j)]) {
    case 1:
      tx[y1(i, j)][x1(i, j)] = 4; // 如果前面是人物,人物噶
      break;
    case 3:
      if (drld == 10 || drld == 9) {
        tx[i - 1][j - 1] = 7;
        tx[i - 1][j + 1] = 8;
        tx[i - 1][j] = 2;
      }
      jhdj += 1;
      tx[y1(i, j)][x1(i, j)] = 5; // 如果前面是炮弹,敌人噶
      break;
    case 5:
      tx[y1(i, j)][x1(i, j)] = 0; // 如果爆过,恢复原样
      break;
    default:
      tx[y1(i, j)][x1(i, j)] = drld; // 否则前进
      break;
  }
  if (tx[y1(i, j)][x1(i, j)] == 11) {
    shiyd = shi[i][j];
    shi[i][j] = 0;
    if (shiyd == 0) {
      shi[y1(i, j)][x1(i, j)] = 30;
    } else {
      shi[y1(i, j)][x1(i, j)] = shiyd - 1;
    }
    // 添加移动逻辑
    if (fjy != y) {
      // 敌机与玩家飞机不在同一行,则移动到玩家飞机所在行
      tx[i][j] = 0;
      if (fjy < y) {
        tx[y - 1][j] = 11;
      } else {
        tx[y + 1][j] = 11;
      }
    }
  }
}

修改后的代码会先检查 "十" 型敌机是否与玩家飞机在同一行。如果不在,则会将敌机移动到玩家飞机所在行。

此外,您还可以修改代码,让 "十" 型敌机在移动时具有一定的随机性,例如:

// 在 yddy::yd() 函数中添加以下代码

if (tx[y1(i, j)][x1(i, j)] == 11) {
  // ...
  // 添加移动逻辑
  if (fjy != y) {
    // 敌机与玩家飞机不在同一行,则移动到玩家飞机所在行
    tx[i][j] = 0;
    if (rand() % 2 == 0) {
      if (fjy < y) {
        tx[y - 1][j] = 11;
      } else {
        tx[y + 1][j] = 11;
      }
    } else {
      // 随机移动到相邻行
      if (fjy < y) {
        if (y > 0) {
          tx[y - 1][j] = 11;
        } else {
          tx[y + 1][j] = 11;
        }
      } else {
        if (y < 14) {
          tx[y + 1][j] = 11;
        } else {
          tx[y - 1][j] = 11;
        }
      }
    }
  }
}

这段代码会让 "十" 型敌机在移动到玩家飞机所在行时,有一定的概率随机移动到相邻行,增加游戏的难度和趣味性。

希望以上代码能够帮助您解决问题。

69,512

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧