#include <iomanip>
#include <cmath>
#include <string>
#include <iostream>
#include <cstdio>
using namespace std;
int a[11][11];
int winner=0;
int hensou1(int x,int y){
if(a[x][y]==1&&x>=0&&x<10&&y+4<10&&y>=0){
if(a[x][y+1]==1&&a[x][y+2]==1&&a[x][y+3]==1&&a[x][y+4]==1)
return 1;
}
else return 0;
}
int shusou1(int z,int x){
if(a[z][x]==1&&z>=0&&z+4<10&&x<10&&x-4>=0){
if(a[z+1][x]==1&&a[z+2][x]==1&&a[z+3][x]==1&&a[z+4][x]==1)
return 1;
}
else return 0;
}
int zxxiesou1(int z,int x){
if(a[z][x]==1&&z>=0&&z+4<10&&x<10&&x-4>=0){
if(a[z+1][x-1]==1&&a[z+2][x-2]==1&&a[z+3][x-3]==1&&a[z+4][x-4]==1)
return 1;
}
else return 0;
}
int yxxiesou1(int z,int x){
if(a[z][x]==1&&z>=0&&z+4<10&&x+4<10&&x>=0){
if(a[z+1][x+1]==1&&a[z+2][x+2]==1&&a[z+3][x+3]==1&&a[z+4][x+4]==1)
return 1;
}
else return 0;
}
int hensou2(int z,int x){
if(a[z][x]==2&&z>=0&&z<10&&x+4<10&&x>=0){
if(a[z][x+1]==2&&a[z][x+2]==2&&a[z][x+3]==2&&a[z][x+4]==2)
return 2;
}
else return 0;
}
int shusou2(int z,int x){
if(a[z][x]==2&&z>=0&&z+4<10&&x<10&&x>=0){
if(a[z+1][x]==2&&a[z+2][x]==2&&a[z+3][x]==2&&a[z+4][x]==2)
return 2;
}
else return 0;
}
int zxxiesou2(int z,int x){
if(a[z][x]==2&&z>=0&&z+4<10&&x<10&&x-4>=0){
if(a[z+1][x-1]==2&&a[z+2][x-2]==2&&a[z+3][x-3]==2&&a[z+4][x-4]==2)
return 2;
}
else return 0;
}
int yxxiesou2(int z,int x){
if(a[z][x]==2&&z>=0&&z+4<10&&x+4<10&&x>=0){
if(a[z+1][x+1]==2&&a[z+2][x+2]==2&&a[z+3][x+3]==2&&a[z+4][x+4]==2)
return 2;
}
else return 0;
}
int panding(){
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(hensou1(i,j)==1) winner=1;
if(shusou1(i,j)==1) winner=1;
if(zxxiesou1(i,j)==1) winner=1;
if(yxxiesou1(i,j)==1) winner=1;
if(hensou2(i,j)==2) winner=2;
if(shusou2(i,j)==2) winner=2;
if(zxxiesou2(i,j)==2) winner=2;
if(yxxiesou2(i,j)==2) winner=2;
}
}
return 1;
}
void luozi(int x,int y){
if(a[x-1][y-1]==0) a[x-1][y-1]=1;
else{
cout<<"下回合此处有子,请勿落子,再次落子:";
int erluox,erluoy;
cin>>erluox>>erluoy;
luozi(erluox,erluoy);
}
}
void luozi2(int x,int y){
if(a[x-1][y-1]==0) a[x-1][y-1]=2;
else{
cout<<"下回合此处有子,请勿落子,再次落子:";
int erluox,erluoy;
cin>>erluox>>erluoy;
luozi2(erluox,erluoy);
}
}
int fall(int x,int y){
int weight=1,tap=x-1;
while(a[tap][y]!=0&&tap>=0){
weight++;
tap--;
}
if(a[x+1][y]!=0){
weight=1;
}
while(a[x+weight][y]!=0&&weight!=0){
weight--;
}
int guocheng=x+weight;
if(guocheng>=10){
guocheng=9;
}
a[guocheng][y]=a[x][y];
a[x][y]=0;
}
int allfall(){
for(int i=9;i>=0;i--){
for(int j=9;j>=0;j--){
if(a[i][j]!=0){
fall(i,j);
}
}
}
}
int main(){
int zix1=0,ziy1=0,zix2=0,ziy2=0;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
a[i][j]=0;
}
}
cout<<"welcome 牛顿五子棋"<<endl<<"初步规则如下"<<endl<<"胜利规则类似五子棋,但不同于五子棋,每个棋子都会下落,标2为2号玩家,标1为1号玩家"<<endl;
cout<<"进阶玩法:重力因素。每一回合(即双方落子后),每颗子会下落其重量高度。"<<endl<<"例如,如果一颗子上堆叠了另一颗子,则该子落下两格。无子则一格"<<endl;
cout<<"吃子操作:如果一颗子落到第十行,则它可以被覆盖"<<endl;
cout<<"(注意,你可能会发现自己的棋子比想下的地方更下了一格,不必惊慌,那是因为系统优先判定了下坠)"<<endl ;
cout<<" ";
for(int i=0;i<10;i++){
printf("%5d",i+1);
}
cout<<endl<<endl;
for(int i=0;i<10;i++){
printf("%5d",i+1);
for(int j=0;j<10;j++){
printf("%5d",a[i][j]);
}
cout<<endl<<endl;
}
while(!winner){
cout<<"1号玩家请落子:";
cin>>zix1>>ziy1;
luozi(zix1,ziy1);
cout<<"2号玩家请落子:";
cin>>zix2>>ziy2;
luozi2(zix2,ziy2);
allfall();
cout<<"上一回合落子和下落结果如下:"<<endl;
for(int i=0;i<10;i++){
printf("%5d",i+1);
}
cout<<endl<<endl;
for(int i=0;i<10;i++){
printf("%5d",i+1);
for(int j=0;j<10;j++){
printf("%5d",a[i][j]);
}
cout<<endl<<endl;
}
panding();
}
for(int i=0;i<10;i++){
printf("%5d",i+1);
}
cout<<endl<<endl;
for(int i=0;i<10;i++){
printf("%5d",i+1);
for(int j=0;j<10;j++){
printf("%5d",a[i][j]);
}
cout<<endl<<endl;
}
cout<<"有五子连成了!让我看看...."<<"胜利者为"<<winner<<"号玩家";
return 0;
}