[Games] C++国际象棋

version 1.1.0

游戏性说明

游戏分P1 P2 分别进行,每人输入四个数. 前两个数为要移动的棋子坐标,后两个数为目标坐标. 坐标第一个数描述左右,第二个数描述上下.

#include<bits/stdc++.h>
using namespace std;
int m[9][9],cl[9]={0,4,2,3,5,6,3,2,4},p,rp;
queue<int> q;
//兵1 马2 象3 车4 后5 王6 
void cle(){
	for(int i=1;i<=8;++i){
		m[1][i]=cl[i];
		m[8][i]=cl[i]+6;
		m[2][i]=1;
		m[7][i]=7;
	}
}
char cg(int x){
	if(x>6){
		x-=6;
	}
	if(x==0){
		return ' ';
	}
	else if(x==1){
		return 'P';
	}
	else if(x==2){
		return 'N';
	}
	else if(x==3){
		return 'B';
	}
	else if(x==4){
		return 'R';
	}
	else if(x==5){
		return 'Q';
	}
	else if(x==6){
		return 'K';
	}
}
void ysc(){
	cout<<endl<<"This is your Chess ->"<<endl<<endl;
	cout<<"  ";
	for(int i=1;i<=8;++i){
		cout<<i<<" ";
	}
	cout<<endl;
	if(p==1){
		for(int i=1;i<=8;++i){
			cout<<i<<" ";
			for(int j=1;j<=8;++j){
				if(m[i][j]>6){
					cout<<cg(m[i][j])<<" ";
				}
				else{
					cout<<"  ";
				}
			}
			cout<<endl;
		}
	}
	else{
		for(int i=1;i<=8;++i){
			cout<<i<<" ";
			for(int j=1;j<=8;++j){
				if(m[i][j]<=6){
					cout<<cg(m[i][j])<<" ";
				}
				else{
					cout<<"  ";
				}
			}
			cout<<endl;
		}
	}
	cout<<endl;
}
void sc(){
	system("cls");
	cout<<"P  Pawn"<<endl<<"N  Knight"<<endl<<"B  Bishop (Go Diagonally)"<<endl<<"R  Rook (Go Streight)"<<endl<<"Q  Queen"<<endl<<"K  King"<<endl<<endl;
	cout<<"  ";
	for(int i=1;i<=8;++i){
		cout<<i<<" ";
	}
	cout<<endl;
	for(int i=1;i<=8;++i){
		cout<<i<<" ";
		for(int j=1;j<=8;++j){
			cout<<cg(m[i][j])<<" ";
		}
		cout<<endl;
	}
	cout<<endl;
	ysc();
}
bool pd2(int x,int y,int tx,int ty){
	if(m[x][y]==1||m[x][y]==7){
		if(y!=ty){
			if(abs(y-ty)==1&&m[tx][ty]!=0&&abs(x-tx)==1){
				return true;
			}
			return false;
		}
		else{
			if(m[tx][ty]!=0){
				return false;
			}
			if(x==2&&m[x][y]<=6){
				if(tx-x==1||tx-x==2){
					return true;
				}
				return false;
			}
			if(x==7&&m[x][y]>6){
				if(x-tx==1||x-tx==2){
					return true;
				}
				return false;
			}
			else{
				if(m[x][y]>6){
					if(x-tx==1){
						return true;
					}
				}
				else{
					if(tx-x==1){
						return true;
					}
				}
				return false;
			}
		}
	}
	else if(m[x][y]==2||m[x][y]==8){
		if(abs(x-tx)==1&&abs(y-ty)==2){
			return true;
		}
		else if(abs(x-tx)==2&&abs(y-ty)==1){
			return true;
		}
		return false;
	}
	else if(m[x][y]==3||m[x][y]==9){
		if(abs(x-tx)==abs(y-ty)){
			for(int c=1,i=max(x,tx),j=max(y,ty);c<abs(x-tx);++c){
				i--;
				j--;
				if(m[i][j]!=0){
					return false;
				}
			}
			return true;
		}
		return false;
	}
	else if(m[x][y]==4||m[x][y]==10){
		if(y==ty){
			for(int i=max(x,tx)-1;i>min(x,tx);--i){
				if(m[i][y]!=0){
					return false;
				}
			}
		}
		else if(x==tx){
			for(int i=max(y,ty)-1;i>min(y,ty);--i){
				if(m[x][i]!=0){
					return false;
				}
			}
		}
		return true;
	}
	else if(m[x][y]==5||m[x][y]==11){
		if(y==ty){
			for(int i=max(x,tx)-1;i>min(x,tx);--i){
				if(m[i][y]!=0){
					return false;
				}
			}
			return true;
		}
		else if(x==tx){
			for(int i=max(y,ty)-1;i>min(y,ty);--i){
				if(m[x][i]!=0){
					return false;
				}
			}
			return true;
		}
		else if(abs(x-tx)==abs(y-ty)){
			for(int c=1,i=max(x,tx),j=max(y,ty);c<abs(x-tx);++c){
				i--;
				j--;
				if(m[i][j]!=0){
					return false;
				}
			}
			return true;
		}
		return false;
	}
	else{
		if(abs(x-tx)<=1&&abs(y-ty)<=1){
			return true;
		}
		return false;
	}
}
bool pd3(int x,int y,int tx,int ty){
	if(x<=0||x>8||y<=0||y>8||tx<=0||tx>8||ty<=0||ty>8){
		return false;
	}
	if(m[x][y]>6&&m[tx][ty]>6){
		return false;
	}
	if(m[x][y]<=6&&m[tx][ty]<=6&&m[tx][ty]!=0){
		return false;
	}
	return pd2(x,y,tx,ty);
}
bool pd1(int x,int y,int tx,int ty){
	if(m[x][y]==0){
		return false;
	}
	if(m[x][y]<=6&&p==1){
		return false;
	}
	if(m[x][y]>6&&p==2){
		return false;
	}
	return pd3(x,y,tx,ty);
}
void save(){
	cout<<endl<<"Saving File_#"<<time(NULL)<<endl<<endl;
	while(!q.empty()){
		for(int i=1;i<=4;++i){
			cout<<q.front()<<" ";
			q.pop();
		}
		cout<<endl;
	}
	cout<<endl<<"File end."<<endl;
}
int main(){
	cle();
	p=1;
	sc();
	while(1){
		if(rp!=p){
			rp=p;
			cout<<endl;
			cout<<"Player "<<p<<"'s Turn"<<endl;
		}
		cout<<">> ";
		int cx,cy,tx,ty;
		cin>>cy>>cx>>ty>>tx;
		if(cx==0&&cy==0&&ty==0&&tx==0){
			int in;
			cout<<endl<<"Input 1 to Save Process."<<endl<<">> ";
			cin>>in;
			if(in==1){
				save();
				system("pause");
			}
			cout<<endl<<"Continue ";
		}
		else if(pd1(cx,cy,tx,ty)==true){
			q.push(cy);
			q.push(cx);
			q.push(ty);
			q.push(tx);
			if(m[cx][cy]==6||m[cx][cy]==12){
				cout<<endl<<"GameOver."<<endl;
				system("pause");
			}
			m[tx][ty]=m[cx][cy];
			m[cx][cy]=0;
			p=p%2+1;
			sc();
		}
		else{
			cout<<endl<<"Error"<<endl<<endl;
		}
	}
}
posted @ 2024-02-23 20:13  HaneDaniko  阅读(12)  评论(0编辑  收藏  举报