地图战争(C++)

游戏规则

开局要选择颜色,n和m是长度和宽度,可以修改(第10行)
当到你的回合时,先输入发兵坐标,再输入攻击坐标,只能攻击相邻的格子。如果攻击坐标在自己的区域,可以传送(移动无限格)
每回合,被占领的区域会增加5人,没有被占领的不会。

代码

#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
void out(string s){
    for(int i=0;i<s.length();i++){
        cout<<s[i];
        Sleep(20);
    }
}
int n=5,m=5,co,lf=4;
int mp[110][110],my[110][110],vis[110][110],num[5];
string str[5]={"","Red","Yellow","Blue","Green"};
int lst=4;
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
void setcolor(int col){
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),col);
}
void prmp(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(my[i][j]==1)setcolor(0x04);
            else if(my[i][j]==2)setcolor(0x06);
            else if(my[i][j]==3)setcolor(0x03);
            else if(my[i][j]==4)setcolor(0x02);
            else setcolor(0x07);
            if(mp[i][j]<10)cout<<" ";
            cout<<mp[i][j]<<" ";
        }
        cout<<endl;
    } 
    setcolor(0x07);
}
int gtar(int x){
    memset(vis,0,sizeof(vis));
    int res=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(my[i][j]==x){
                if(my[i+1][j]!=x)vis[i+1][j]=1;
                if(my[i][j+1]!=x)vis[i][j+1]=1;
                if(my[i-1][j]!=x)vis[i-1][j]=1;
                if(my[i][j-1]!=x)vis[i][j-1]=1;
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)res+=vis[i][j];
    }
    return res;
}
void attack(int x,int y,int tx,int ty){
    mp[tx][ty]-=mp[x][y];
    if(mp[tx][ty]<0){
        mp[tx][ty]=-mp[tx][ty];
        num[my[x][y]]++;
        if(my[tx][ty]!=0){
            num[my[tx][ty]]--;
            if(num[my[tx][ty]]==0){
                lf--;
                if(my[tx][ty]!=co)out(str[my[tx][ty]]+" has end!\n");
                else{
                    out("You lose!\n");
                    prmp();
                    exit(0);
                }
            }
        }
        my[tx][ty]=my[x][y];
    }
    mp[x][y]=0;
}
void move(int x,int y,int tx,int ty){
    mp[tx][ty]+=mp[x][y];
    mp[tx][ty]=min(mp[tx][ty],99);
    mp[x][y]=0;
}
int main(){
    srand(unsigned(time(0)));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            mp[i][j]=10;
            my[i][j]=0; 
        }
    }
    mp[1][1]=20;
    my[1][1]=1;
    mp[1][m]=20;
    my[1][m]=2;
    mp[n][1]=20;
    my[n][1]=3;
    mp[n][m]=20;
    my[n][m]=4;
    out("Welcome to the war game!\n");
    out("What color will you choose?(R/Y/B/G)\n");
    string c;
    while(cin>>c){
        if(c.length()>1){
            out("Invaild color!\n");
            continue;
        }
        else if(c[0]!='R' && c[0]!='Y' && 
        c[0]!='B' && c[0]!='G'){
            out("Invaild color!\n");
            continue;
        }
        break; 
    }
    if(c[0]=='R')co=1;
    else if(c[0]=='Y')co=2;
    else if(c[0]=='B')co=3;
    else co=4;
    int now=1;
    num[1]=num[2]=num[3]=num[4]=1;
    while(true){
        if(lf==1)break;
        if(num[now]==0){
            now=(now%4)+1;
            continue;
        }
        prmp();
        if(now==co){
            out("Your turn!\n");
            out("Which position will you want to start?(Enter two numbers)\n");
            int x,y;
            while(cin>>x>>y){
                if(x<1 || x>n || y<1 || y>m){
                    out("Invaild position!\n");
                    continue;
                }
                if(my[x][y]!=co){
                    out("Invaild position!\n");
                    continue;
                } 
                if(mp[x][y]==0){
                    out("No soldiers here!\n");
                    continue;
                }
                break;
            }
            gtar(co);
            out("Which position do you want to attack?\n");
            int tx,ty; 
            while(cin>>tx>>ty){
                if(tx<1 || tx>n || ty<1 || ty>m){
                    out("Invaild position!\n");
                    continue;
                }
                if(!vis[tx][ty] && my[tx][ty]!=co){
                    out("Invaild position!\n");
                    continue;
                }
                break; 
            }
            if(vis[tx][ty])attack(x,y,tx,ty);
            else move(x,y,tx,ty);
        }else{
            out(str[now]+" turn!\n");
            int su=gtar(now);
            int k=rand()%su+1,tot=0,tax,tay;
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    tot+=vis[i][j];
                    if(tot==k){
                        tax=i;
                        tay=j;
                        break;
                    }
                }
                if(tot==k)break;
            }
            int sx,sy;
            for(int i=0;i<4;i++){
                int ax=tax+dx[i],ay=tay+dy[i];
                if(ax<1 || ax>n || ay<1 || ay>m)continue;
                if(my[ax][ay]==now){
                    sx=ax;
                    sy=ay;
                    break;
                }
            }
            attack(sx,sy,tax,tay);
            Sleep(1000);
        }
        while(num[lst]==0)lst--;
        if(now==lst){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=m;j++){
                    if(my[i][j])mp[i][j]=min(99,mp[i][j]+5);
                }
            }
        }
        now=now%4+1;
    }
    out("You win!");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值