游戏规则
开局要选择颜色,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;
}