[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;
}
}
}