游戏,牛顿五子棋,自己写的,有人玩吗
  • 板块灌水区
  • 楼主NingYia_
  • 当前回复11
  • 已保存回复11
  • 发布时间2022/8/18 09:55
  • 上次更新2023/10/27 14:50:06
查看原帖
游戏,牛顿五子棋,自己写的,有人玩吗
759661
NingYia_楼主2022/8/18 09:55
#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){//因为循环必定搜到横连五块的第一个,所以直接从他往右横搜4格 
	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){//因为循环必定搜到横连五块的第一个,所以直接从他往右横搜4格 
	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;
}
2022/8/18 09:55
加载中...