海战旗都玩过吧,手搓了一个低配版。
代码不多,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;
}