69,512
社区成员
![](https://csdnimg.cn/release/cmsfe/public/img/topic.427195d5.png)
![](https://csdnimg.cn/release/cmsfe/public/img/me.40a70ab0.png)
![](https://csdnimg.cn/release/cmsfe/public/img/task.87b52881.png)
![](https://csdnimg.cn/release/cmsfe/public/img/share-circle.3e0b7822.png)
#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");
}
}
//阿泽开发,禁止抄袭
其他一切正常,但是敌机“十”,本来我是想让它隔一段时间移动到我方飞机同行(同列)的,但是他一直定位,有没有大佬帮我修复一下,指正我的错误?谢谢了。(编程小白,找不出错误)
#要解决这个问题,您需要修改 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;
}
}
}
}
}