c++小游戏[海战旗]
  • 板块灌水区
  • 楼主sikunran
  • 当前回复25
  • 已保存回复25
  • 发布时间2025/1/11 21:27
  • 上次更新2025/1/12 10:33:12
查看原帖
c++小游戏[海战旗]
1041395
sikunran楼主2025/1/11 21:27

海战旗都玩过吧,手搓了一个低配版。

代码不多,600多行。

具体规则就是,先输入船的坐标,然后从p1开始进攻。如果命中则该玩家继续进攻,否则更换为另一位玩家。直到对方所有船被击中则获得胜利。

注意:该代码是双人版本,需要按照游戏提示交换电脑,和朋友游玩时请自觉,不要偷看对方的船图。

#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
char l1[11][11],l2[11][11];//l1:p1的船图,l2:p2的船图,h1:p1被击中图,h2:p2被击中图
int x,y,x2,y2;
int xianshi_l1(){
	for(int i=1;i<=9;i++){
		cout<<i;
	}
	cout<<'T'<<endl; 
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			cout<<l1[i][j];
		}
		if(i!=10)cout<<i<<endl;
	}
	cout<<'T'<<endl; 
} 
int xianshi_l2(){
	for(int i=1;i<=9;i++){
		cout<<i;
	}
	cout<<'T'<<endl; 
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			cout<<l2[i][j];
		}
		if(i!=10)cout<<i<<endl;
	}
	cout<<'T'<<endl; 
} 
int r(int MAX,int MIN){
	srand(time(0));
	return rand()%(MAX-MIN+1)+MIN;
}

int win(){
	bool flag1=false,flag2=false;
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			if(l1[i][j]=='#'){
				flag1=true;
		    }
			if(l2[i][j]=='#'){
				flag2=true;
			}
		}
	}
	if(!flag1){
		return 2;
	}
	else if(!flag2){
		return 1;
	}
	else{
		return 0;
	}
}
int xianshi_h1(){
	for(int i=1;i<=9;i++){
		cout<<i;
	}
	cout<<'T'<<endl; 
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			if(l1[i][j]=='#'){
				cout<<'.';
			}
			else{
				cout<<l1[i][j];
			}
		}
		if(i!=10)cout<<i<<endl;
	}
	cout<<'T'<<endl; 
}
int xianshi_h2(){
	for(int i=1;i<=9;i++){
		cout<<i;
	}
	cout<<'T'<<endl; 
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			if(l2[i][j]=='#'){
				cout<<'.';
			}
			else{
				cout<<l2[i][j];
			}
		}
		if(i!=10)cout<<i<<endl;
	}
	cout<<'T'<<endl; 
}

int main(){
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			l1[i][j]='.';
			l2[i][j]='.';
		}
	}
	cout<<"欢迎来到海战旗"<<endl<<endl<<"本局为10x10大小棋盘(!!!T代表10,但输入时仍要玩家输入10!!!)"<<endl<<"每人有4格船x1,3格船x1,两格船x2,一格船x2"<<endl<<endl<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl;
	cout<<"按下ENTER以继续";
	char c;
	scanf("%c",&c); 
	system("cls"); 
	/*
	
	———————————————————
	初始化部分开始 
	——————————————————— 

	*/
	//一号玩家输入 
	
	//输入四格船坐标 
	cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl;
	xianshi_l1(); 
	while(true){
		cout<<"输入四格船起始坐标(x,y)"<<endl;
		cin>>x>>y;
		cout<<"输入四格船结束坐标(x,y)"<<endl;
		cin>>x2>>y2;
		if(x!=x2&&y!=y2)cout<<"请重新输入!"<<endl; 
		else if(x<1||x>10||x2<1||x2>10||y<1||y>10||y2<1||y2>10)cout<<"请重新输入!"<<endl; 
		else if(max(x,x2)-min(x,x2)!=3&&max(y,y2)-min(y,y2)!=3)cout<<"请重新输入!"<<endl; 
		else if(y==y2){
			for(int i=min(x,x2);i<=max(x,x2);i++){
				l1[y][i]='#';
			}
			break;
		}
		else if(x==x2){
			for(int i=min(y,y2);i<=max(y,y2);i++){
				l1[i][x]='#';
			}
			break;
		} 
    }
    system("cls");
    //输入三格船坐标 
	cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl;
	xianshi_l1();
	while(true){
		cout<<"输入三格船起始坐标(x,y)"<<endl;
		cin>>x>>y;
		cout<<"输入三格船结束坐标(x,y)"<<endl;
		cin>>x2>>y2;
		if(x!=x2&&y!=y2)cout<<"请重新输入!"<<endl; 
		else if(x<1||x>10||x2<1||x2>10||y<1||y>10||y2<1||y2>10)cout<<"请重新输入!"<<endl; 
		else if(max(x,x2)-min(x,x2)!=2&&max(y,y2)-min(y,y2)!=2)cout<<"请重新输入!"<<endl; 
		else if(y==y2){
			int flag=true;
			for(int i=min(x,x2);i<=max(x,x2);i++){
				if(l1[y][i]=='#'){
					cout<<"请重新输入!"<<endl;
					flag=false;
					break;
				} 
		    }
		    if(flag){
				for(int i=min(x,x2);i<=max(x,x2);i++){
					l1[y][i]='#';
				}		
				break;
			}
			else{
				continue;
			}
		}
		else if(x==x2){
			int flag=true;
			for(int i=min(y,y2);i<=max(y,y2);i++){
				if(l1[i][x]=='#'){
					cout<<"请重新输入!"<<endl;
					flag=false;
					break;
				} 
		    }
		    if(flag){
				for(int i=min(y,y2);i<=max(y,y2);i++){
					l1[i][x]='#';
				}		
				break;
			}
			else{
				continue;
			}
    	}
    }
    system("cls");
    //输入两格船坐标 
	cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl;
	xianshi_l1();
	while(true){
		cout<<"输入两格船起始坐标(x,y)"<<endl;
		cin>>x>>y;
		cout<<"输入两格船结束坐标(x,y)"<<endl;
		cin>>x2>>y2;
		if(x!=x2&&y!=y2)cout<<"请重新输入!"<<endl; 
		else if(x<1||x>10||x2<1||x2>10||y<1||y>10||y2<1||y2>10)cout<<"请重新输入!"<<endl; 
		else if(max(x,x2)-min(x,x2)!=1&&max(y,y2)-min(y,y2)!=1)cout<<"请重新输入!"<<endl; 
		else if(y==y2){
			int flag=true;
			for(int i=min(x,x2);i<=max(x,x2);i++){
				if(l1[y][i]=='#'){
					cout<<"请重新输入!"<<endl;
					flag=false;
					break;
				} 
		    }
		    if(flag){
				for(int i=min(x,x2);i<=max(x,x2);i++){
					l1[y][i]='#';
				}		
				break;
			}
			else{
				continue;
			}
		}
		else if(x==x2){
			int flag=true;
			for(int i=min(y,y2);i<=max(y,y2);i++){
				if(l1[i][x]=='#'){
					cout<<"请重新输入!"<<endl;
					flag=false;
					break;
				} 
		    }
		    if(flag){
				for(int i=min(y,y2);i<=max(y,y2);i++){
					l1[i][x]='#';
				}		
				break;
			}
			else{
				continue;
			}
    	}
    }
    system("cls");
    //输入两格船坐标
	cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl;
	xianshi_l1();
	while(true){
		cout<<"输入两格船起始坐标(x,y)"<<endl;
		cin>>x>>y;
		cout<<"输入两格船结束坐标(x,y)"<<endl;
		cin>>x2>>y2;
		if(x!=x2&&y!=y2)cout<<"请重新输入!"<<endl; 
		else if(x<1||x>10||x2<1||x2>10||y<1||y>10||y2<1||y2>10)cout<<"请重新输入!"<<endl; 
		else if(max(x,x2)-min(x,x2)!=1&&max(y,y2)-min(y,y2)!=1)cout<<"请重新输入!"<<endl; 
		else if(y==y2){
			int flag=true;
			for(int i=min(x,x2);i<=max(x,x2);i++){
				if(l1[y][i]=='#'){
					cout<<"请重新输入!"<<endl;
					flag=false;
					break;
				} 
		    }
		    if(flag){
				for(int i=min(x,x2);i<=max(x,x2);i++){
					l1[y][i]='#';
				}		
				break;
			}
			else{
				continue;
			}
		}
		else if(x==x2){
			int flag=true;
			for(int i=min(y,y2);i<=max(y,y2);i++){
				if(l1[i][x]=='#'){
					cout<<"请重新输入!"<<endl;
					flag=false;
					break;
				} 
		    }
		    if(flag){
				for(int i=min(y,y2);i<=max(y,y2);i++){
					l1[i][x]='#';
				}		
				break;
			}
			else{
				continue;
			}
    	}
    }
    system("cls"); 
    //输入一格船坐标 
	cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl;
	xianshi_l1();
	while(true){//为了不搞得跟坨shi一样所以重新编了一格的代码 
		cout<<"输入一格船坐标(x,y)"<<endl;
		cin>>x>>y;
		if(x<1||x>10||y<1||y>10)cout<<"请重新输入!"<<endl; 
		else if(l1[y][x]=='#')cout<<"请重新输入!"<<endl; 
		else {
			l1[y][x]='#';
			break;	
		}
	}
	system("cls"); 
    //输入一格船坐标 
	cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl;
	xianshi_l1();
	while(true){
		cout<<"输入一格船坐标(x,y)"<<endl;
		cin>>x>>y;
		if(x<1||x>10||y<1||y>10)cout<<"请重新输入!"<<endl; 
		else if(l1[y][x]=='#')cout<<"请重新输入!"<<endl; 
		else {
			l1[y][x]='#';
			break;
		}
		
	}
	
	system("cls");
	xianshi_l1();
	Sleep(2000);
	
	
	//--------------------------------------------------------
	//二号玩家输入 
	
	
	system("cls"); 
	cout<<endl<<endl<<endl<<endl<<"                                                    请p2输入"<<endl<<endl<<endl<<endl;
	cout<<"欢迎来到海战旗"<<endl<<endl<<"本局为10x10大小棋盘(!!!T代表10,但输入时仍要玩家输入10!!!)"<<endl<<"每人有4格船x1,3格船x1,两格船x2,一格船x2"<<endl<<endl<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl;
	cout<<"按下ENTER以继续";
	scanf("%c",&c); 
	scanf("%c",&c); 
	system("cls"); 
	//输入四格船坐标 
	cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl;
	xianshi_l2(); 
	while(true){
		cout<<"输入四格船起始坐标(x,y)"<<endl;
		cin>>x>>y;
		cout<<"输入四格船结束坐标(x,y)"<<endl;
		cin>>x2>>y2;
		if(x!=x2&&y!=y2)cout<<"请重新输入!"<<endl; 
		else if(x<1||x>10||x2<1||x2>10||y<1||y>10||y2<1||y2>10)cout<<"请重新输入!"<<endl; 
		else if(max(x,x2)-min(x,x2)!=3&&max(y,y2)-min(y,y2)!=3)cout<<"请重新输入!"<<endl; 
		else if(y==y2){
			for(int i=min(x,x2);i<=max(x,x2);i++){
				l2[y][i]='#';
			}
			break;
		}
		else if(x==x2){
			for(int i=min(y,y2);i<=max(y,y2);i++){
				l2[i][x]='#';
			}
			break;
		} 
    }
    system("cls");
    //输入三格船坐标 
	cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl;
	xianshi_l2();
	while(true){
		cout<<"输入三格船起始坐标(x,y)"<<endl;
		cin>>x>>y;
		cout<<"输入三格船结束坐标(x,y)"<<endl;
		cin>>x2>>y2;
		if(x!=x2&&y!=y2)cout<<"请重新输入!"<<endl; 
		else if(x<1||x>10||x2<1||x2>10||y<1||y>10||y2<1||y2>10)cout<<"请重新输入!"<<endl; 
		else if(max(x,x2)-min(x,x2)!=2&&max(y,y2)-min(y,y2)!=2)cout<<"请重新输入!"<<endl; 
		else if(y==y2){
			int flag=true;
			for(int i=min(x,x2);i<=max(x,x2);i++){
				if(l2[y][i]=='#'){
					cout<<"请重新输入!"<<endl;
					flag=false;
					break;
				} 
		    }
		    if(flag){
				for(int i=min(x,x2);i<=max(x,x2);i++){
					l2[y][i]='#';
				}		
				break;
			}
			else{
				continue;
			}
		}
		else if(x==x2){
			int flag=true;
			for(int i=min(y,y2);i<=max(y,y2);i++){
				if(l2[i][x]=='#'){
					cout<<"请重新输入!"<<endl;
					flag=false;
					break;
				} 
		    }
		    if(flag){
				for(int i=min(y,y2);i<=max(y,y2);i++){
					l2[i][x]='#';
				}		
				break;
			}
			else{
				continue;
			}
    	}
    }
    system("cls");
    //输入两格船坐标 
	cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl;
	xianshi_l2();
	while(true){
		cout<<"输入两格船起始坐标(x,y)"<<endl;
		cin>>x>>y;
		cout<<"输入两格船结束坐标(x,y)"<<endl;
		cin>>x2>>y2;
		if(x!=x2&&y!=y2)cout<<"请重新输入!"<<endl; 
		else if(x<1||x>10||x2<1||x2>10||y<1||y>10||y2<1||y2>10)cout<<"请重新输入!"<<endl; 
		else if(max(x,x2)-min(x,x2)!=1&&max(y,y2)-min(y,y2)!=1)cout<<"请重新输入!"<<endl; 
		else if(y==y2){
			int flag=true;
			for(int i=min(x,x2);i<=max(x,x2);i++){
				if(l2[y][i]=='#'){
					cout<<"请重新输入!"<<endl;
					flag=false;
					break;
				} 
		    }
		    if(flag){
				for(int i=min(x,x2);i<=max(x,x2);i++){
					l2[y][i]='#';
				}		
				break;
			}
			else{
				continue;
			}
		}
		else if(x==x2){
			int flag=true;
			for(int i=min(y,y2);i<=max(y,y2);i++){
				if(l2[i][x]=='#'){
					cout<<"请重新输入!"<<endl;
					flag=false;
					break;
				} 
		    }
		    if(flag){
				for(int i=min(y,y2);i<=max(y,y2);i++){
					l2[i][x]='#';
				}		
				break;
			}
			else{
				continue;
			}
    	}
    }
    system("cls");
    //输入两格船坐标
	cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl;
	xianshi_l2();
	while(true){
		cout<<"输入两格船起始坐标(x,y)"<<endl;
		cin>>x>>y;
		cout<<"输入两格船结束坐标(x,y)"<<endl;
		cin>>x2>>y2;
		if(x!=x2&&y!=y2)cout<<"请重新输入!"<<endl; 
		else if(x<1||x>10||x2<1||x2>10||y<1||y>10||y2<1||y2>10)cout<<"请重新输入!"<<endl; 
		else if(max(x,x2)-min(x,x2)!=1&&max(y,y2)-min(y,y2)!=1)cout<<"请重新输入!"<<endl; 
		else if(y==y2){
			int flag=true;
			for(int i=min(x,x2);i<=max(x,x2);i++){
				if(l2[y][i]=='#'){
					cout<<"请重新输入!"<<endl;
					flag=false;
					break;
				} 
		    }
		    if(flag){
				for(int i=min(x,x2);i<=max(x,x2);i++){
					l2[y][i]='#';
				}		
				break;
			}
			else{
				continue;
			}
		}
		else if(x==x2){
			int flag=true;
			for(int i=min(y,y2);i<=max(y,y2);i++){
				if(l2[i][x]=='#'){
					cout<<"请重新输入!"<<endl;
					flag=false;
					break;
				} 
		    }
		    if(flag){
				for(int i=min(y,y2);i<=max(y,y2);i++){
					l2[i][x]='#';
				}		
				break;
			}
			else{
				continue;
			}
    	}
    }
    system("cls"); 
    //输入一格船坐标 
	cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl;
	xianshi_l2();
	while(true){//为了不搞得跟坨shi一样所以重新编了一格的代码 
		cout<<"输入一格船坐标(x,y)"<<endl;
		cin>>x>>y;
		if(x<1||x>10||y<1||y>10)cout<<"请重新输入!"<<endl; 
		else if(l2[y][x]=='#')cout<<"请重新输入!"<<endl; 
		else {
			l2[y][x]='#';
			break;	
		}
	}
	system("cls"); 
    //输入一格船坐标 
	cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl;
	xianshi_l2();
	while(true){
		cout<<"输入一格船坐标(x,y)"<<endl;
		cin>>x>>y;
		if(x<1||x>10||y<1||y>10)cout<<"请重新输入!"<<endl; 
		else if(l2[y][x]=='#')cout<<"请重新输入!"<<endl; 
		else {
			l2[y][x]='#';
			break;
		}
		
	}
	system("cls"); 
	xianshi_l2();
	Sleep(2000); 
	system("cls"); 
	cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<"                                                   开始游戏"<<endl;
	Sleep(2000);
	system("cls");
	
	/*
	
	———————————————————
	初始化结束
	正式游戏部分开始 
	——————————————————— 

	*/
	
	
	while(true){
		//p1回合 
		cout<<endl<<endl<<endl<<"                                                   请p1输入"<<endl<<endl<<"                                               按下ENTER以继续"; 
		scanf("%c",&c);	
		scanf("%c",&c);	
		system("cls");
		cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl<<"您的船图:"<<endl;
		xianshi_l1();
		cout<<endl<<endl<<"对方被命中图:"<<endl; 
		xianshi_h2();
		while(true){
			cout<<"请输入炮弹攻击坐标(x,y)"<<endl;
			cin>>x>>y;
			if(x>10||x<1||y>10||y<1||l2[y][x]=='x'||l2[y][x]=='*'){
				cout<<"请重新输入!"<<endl;
			}
			else{
				if(l2[y][x]=='#'){
					l2[y][x]='*';
					cout<<"!命中!";
					Sleep(1000);
					system("cls");
					if(win()==1){
						cout<<endl<<endl<<endl<<endl<<"                                                !恭喜p1胜利!"<<endl<<endl<<endl<<endl;
						Sleep(5000);
						return 0;
					}
					cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl<<"您的船图:"<<endl;
					xianshi_l1();
					cout<<endl<<endl<<"对方被命中图:"<<endl; 
					xianshi_h2();
				}
				else if(l2[y][x]=='.'){
					l2[y][x]='x';
					cout<<"未命中";
					Sleep(1000);
					system("cls");
					break;
				} 
			}
		}
		
		//-------------------------------
		
        //p2回合 
		cout<<endl<<endl<<endl<<"                                                   请p2输入"<<endl<<endl<<"                                               按下ENTER以继续"; 
		scanf("%c",&c);	
		scanf("%c",&c);	
		system("cls");
		cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl<<"您的船图:"<<endl;
		xianshi_l2();
		cout<<endl<<endl<<"对方被命中图:"<<endl; 
		xianshi_h1();
		while(true){
			cout<<"请输入炮弹攻击坐标(x,y)"<<endl;
			cin>>x>>y;
			if(x>10||x<1||y>10||y<1||l1[y][x]=='x'||l1[y][x]=='*'){
				cout<<"请重新输入!"<<endl;
			}
			else{
				if(l1[y][x]=='#'){
					l1[y][x]='*';
					cout<<"!命中!";
					Sleep(1000);
					system("cls");
					if(win()==2){
						cout<<endl<<endl<<endl<<endl<<"                                                !恭喜p1胜利!"<<endl<<endl<<endl<<endl;
						Sleep(5000);
						return 0;
					}
					cout<<".为正常海面  #为有船  *为命中或被命中  x为打空"<<endl<<endl<<"您的船图:"<<endl;
					xianshi_l2();
					cout<<endl<<endl<<"对方被命中图:"<<endl; 
					xianshi_h1();
				}
				else if(l1[y][x]=='.'){
					l1[y][x]='x';
					cout<<"未命中";
					Sleep(1000);
					system("cls");
					break;
				} 
			}
		}
	}
	return 0;
} 
2025/1/11 21:27
加载中...