问题标题: 五子棋双人测试版

0
0
已解决
戈思越
戈思越
新手光能
新手光能

大家好,我是朱瑾文 我号没了 只能用戈思越的号了

​


//**************************头文件*************************** 

#include<iostream>							//cincout
#include<cstring>							//char[]
#include<string>							//string
#include<windows.h>							//system Sleep Beep
#include<cstdio>							//printf
#include<stdlib.h>							//随机函数rand 
#include<time.h>							//时间访问 
//#include<stdio.h>							//cin加快 
using namespace std;						//标准命名空间 


//********************数组、变量、结构体********************* 

struct yh{									//定义结构体用户 
    string name;							//用户名 
    int bf;									//比分 
    int bk;									//撤回步数 
    bool color;								//颜色1黑0白
};
yh ren[2]={{"",0,0},{"",0,0}},fl={"",0,0};	//定义结构体 玩家 范例 
short qp[16][16];							//棋盘15*15(从一开始用) 
int qj/*棋局*/,dj/*难度*/,wincnt/*需要几次能赢*/,rdcnt/*回合次数*/,bc/*黑棋玩家*/,wc/*白棋玩家*/,q[2][3]/*前一、二步*/;


//***********************函数提前定义************************

void col(int n);							//颜色选择函数
void goxy(short x,short y);					//光标移动函数,X表示横坐标,Y表示纵坐标。
void space(short n,string a);				//循环输出字符 
void cr();									//清屏 
void print(string n);						//停顿性输出 
void rd(int n);								//回合
bool check(int n);							//检查五子连珠 
void qpcr();								//棋盘清空 
int r(int max,int min);						//随机数生成 
void win(int wj);							//玩家胜利 
void pin(int wj);							//打印初始化数据 
void hc();									//隐藏光标
void printqp();								//打印棋盘 


//*************************主函数**************************** 

int main(){
//	ios::sync_with+stdio(false);			//加快输入速度,不知为何报错
	HWND hwnd;
	hwnd=GetForegroundWindow();				//使hwnd代表最前端的窗口
	ShowWindow(hwnd,SW_MAXIMIZE);			//最大化 hwnd 所代表的窗口 
	srand(time(NULL));						//播撒随机种子 
	system("COLOR F0"); 					//背景颜色为白,字体颜色为黑 
	system("TITLE 五子棋"); 				//标题五子棋
	MessageBox(NULL,"欢迎游玩五子棋双人测试版","五子棋",MB_OK);//弹窗提示 
	goxy(82,5);								//光标到达坐标60.5
	col(2);									//颜色更改
	cout<<"五";								//提示
	col(3);									//颜色更改
	cout<<"子";								//提示
	col(6);									//颜色更改
    cout<<"棋";								//提示
    col(1);									//颜色更改
	goxy(152,7); 							//光标到达坐标150.7
	col(7); 								//颜色更改
	print("-----朱瑾文制作");				//打印作者
	col(1);									//颜色更改
	cout<<'\n';								//换行 
	system("PAUSE");						//暂停一下 
	hc();									//隐藏光标
	cr();									//清屏
	col(2);									//颜色更改
	space(8,"********************");		//间隔
	col(1);									//颜色更改
	cout<<'\n';								//换行 
	while(1){								//输入循坏(防止输入错误) 
		print("请选择难度(1-3),越大越难,0为自定义");//提示
		col(3);								//颜色更改
		cin>>dj;							//录入数据 
		col(1);								//颜色更改
		switch(dj){							//判断变量 
			case 0:{						//随机
				while(1){					//输入循坏(防止输入错误)					
					print("双方可以撤几次棋?");//提示 
					col(3);					//颜色更改
					cin>>fl.bk;				//录入数据
					col(1);					//颜色更改
					if(fl.bk<0||fl.bk>10){	//判断变量
						print("数据错误!!!");//提示
						cout<<"\n";			//换行 
						continue;			//跳出 
					} 
					print("如果一方赢了几盘则那一方赢了全局?");//提示
					col(3);					//颜色更改
					cin>>wincnt;			//录入数据
					col(1);					//颜色更改
					if(wincnt<0||wincnt>10){//判断变量
						print("数据错误!!!");//提示
						cout<<"\n";			//换行 
						continue;			//跳出 
					} 
					break;					//跳出 
				}
				break;						//跳出
			} 
			case 1:{						//1级 
				fl.bk=10;					//设置变量
				wincnt=1; 					//设置变量
				print("双方可以撤");		//提示 
				col(6);						//颜色更改
				cout<<fl.bk;				//提示
				col(1);						//颜色更改
				print("次棋"); 				//提示
				cout<<"\n";					//换行
				print("如果一方赢了");		//提示
				col(6);						//颜色更改
				cout<<wincnt;				//提示
				col(1);						//颜色更改
				print("盘则那一方赢了全局");//提示
				cout<<"\n";					//换行
				break;						//跳出
			}
			case 2:{						//2级 
				fl.bk=3;					//设置变量
				wincnt=3; 					//设置变量
				print("双方可以撤");		//提示 
				col(6);						//颜色更改
				cout<<fl.bk;				//提示
				col(1);						//颜色更改
				print("次棋"); 				//提示
				cout<<"\n";					//换行
				print("如果一方赢了");		//提示
				col(6);						//颜色更改
				cout<<wincnt;				//提示
				col(1);						//颜色更改
				print("盘则那一方赢了全局");//提示
				cout<<"\n";					//换行
				break;						//跳出
			}
			case 3:{						//3级 
				fl.bk=0;					//设置变量
				wincnt=5; 					//设置变量
				print("双方可以撤");		//提示 
				col(6);						//颜色更改
				cout<<fl.bk;				//提示
				col(1);						//颜色更改
				print("次棋"); 				//提示
				cout<<"\n";					//换行
				print("如果一方赢了");		//提示
				col(6);						//颜色更改
				cout<<wincnt;				//提示
				col(1);						//颜色更改
				print("盘则那一方赢了全局");//提示
				cout<<"\n";					//换行
				break;						//跳出
			}
		} 
		if(dj!=1&&dj!=2&&dj!=3&&dj!=0){		//判断变量
			print("数值出错!!!");			//提示数值错误 
		}
		else{								//判断变量
			break;							//退出 
		}
		cout<<'\n';							//换行 
	}
	for(int i=0;i<=1;i++){					//循环人数 
		print("玩家");						//提示
		cout<<i+1;							//提示
		print("的姓名");					//提示
		col(3);								//颜色更改
		cin>>ren[i].name;					//获取名称 
		col(1);								//颜色更改
		ren[i].bk=fl.bk;					//设置变量
	}
	print("随机分配黑白棋");				//提示
	cout<<'\n';								//换行 
	if(r(1,0)){								//随机 
		print("玩家");						//提示
		col(6);								//颜色更改
		cout<<ren[0].name;					//提示
		col(1);								//颜色更改
		print("是黑棋,玩家");				//提示
		col(6);								//颜色更改
		cout<<ren[1].name;					//提示
		col(1);								//颜色更改
		print("是白棋");					//提示
		cout<<'\n';							//换行 
		bc=0;								//设置变量
		wc=1; 								//设置变量
		ren[0].color=1;						//设置变量
		ren[1].color=0; 					//设置变量
	}
	else{
		print("玩家");						//提示
		col(6);								//颜色更改
		cout<<ren[0].name;					//提示
		col(1);								//颜色更改
		print("是白棋,玩家");				//提示
		col(6);								//颜色更改
		cout<<ren[1].name;					//提示
		col(1);								//颜色更改
		print("是黑棋");					//提示
		cout<<'\n';							//换行 
		bc=1;								//设置变量
		wc=0;								//设置变量
		ren[0].color=0; 					//设置变量
		ren[1].color=1; 					//设置变量
	}
	Sleep(7500);							//停顿 
	cr();									//清屏
/*	for(int i=1;i<=7;i++){					//颜色测试 
		col(i);								//颜色测试
		cout<<"******************************\n";//颜色测试
	}*/
	while(1){								//一个回合
		rdcnt++;							//回合+1	
		pin(bc); 							//初始化 
		printqp(); 							//打印棋盘 
		rd(bc);								//回合下一棋 
		if(check(0)){						//判断黑棋五子连珠 
			win(bc);						//赢
			continue;						//跳出
		}
		space(5,"\n");						//间隔 
		pin(wc); 							//初始化
		printqp(); 							//打印棋盘 
		rd(wc);								//回合下一棋 
		if(check(0)){						//判断白棋五子连珠 
			win(wc);						//赢 
		}	
		cr();								//清屏 
	} 
}


//***********************其他函数************************** 


void pin(int wj){							//打印初始化数据 
	col(2);									//颜色更改
	space(16,"**********");					//间隔 
	col(1);									//颜色更改
	cout<<'\n';								//换行
	print("当前是第");						//提示 
	col(6);									//颜色更改
	cout<<rdcnt;							//提示
	col(1);									//颜色更改
	print("回合");							//提示
	cout<<'\n';								//换行 
	print("玩家");							//提示
	col(6);									//颜色更改
	cout<<ren[wj].name; 					//提示
	col(1);									//颜色更改
	print("下一棋"); 						//提示
	cout<<"\n";								//换行 
	print("玩家");							//提示
	col(6);									//颜色更改
	cout<<ren[wj].name;						//提示
	col(1);									//颜色更改
	print("可以撤");						//提示
	col(6);									//颜色更改
	cout<<ren[wj].bk;						//提示
	col(1);									//颜色更改
	print("次棋"); 							//提示
	cout<<"\n";								//换行
	print("玩家");							//提示
	col(6);									//颜色更改
	cout<<ren[wj].name;						//提示
	col(1);									//颜色更改
	print("已赢");							//提示 
	col(6);									//颜色更改
	cout<<ren[wj].bf;						//提示
	col(1);									//颜色更改
	print("盘"); 							//提示
	cout<<"\n";								//换行
	print("如果玩家");						//提示
	col(6);									//颜色更改
	cout<<ren[wj].name;						//提示
	col(1);									//颜色更改
	print("赢了");							//提示
	col(6);									//颜色更改
	cout<<wincnt;							//提示
	col(1);									//颜色更改
	print("盘则玩家");						//提示
	col(6);									//颜色更改
	cout<<ren[wj].name;						//提示
	col(1);									//颜色更改
	print("赢了全局");						//提示
	cout<<"\n";								//换行
	col(2);									//颜色更改
	space(16,"**********");					//间隔 
	col(1);									//颜色更改
	cout<<'\n';								//换行 
} 

bool check(int n){							//检查五子连珠
	n++;									//因为n传进是0,1 但棋盘标记是1,2 
	for(int i=1;i<=15;i++){					//遍历地图x 
		for(int j=1;j<=15;j++){				//遍历地图y 
			if(i<=11){						//x后边界 
				if(qp[i][j]==n&&qp[i][j+1]==n&&qp[i][j+2]==n&&qp[i][j+3]==n&&qp[i][j+4]==n){
				/*(-)横 
					ioooo
				*/
					return 1;				//五子连珠 
				}							//y后边界				 
				if(j<=11&&qp[i][j]==n&&qp[i+1][j+1]==n&&qp[i+2][j+2]==n&&qp[i+3][j+3]==n&&qp[i+4][j+4]==n){
				/*(\)左斜 
					i
					 o
					  o
					   o
					    o
				*/
					return 1;				//五子连珠 
				}
			}
			if(j<=11){						//y后边界
				if(qp[i][j]==n&&qp[i+1][j]==n&&qp[i+2][j]==n&&qp[i+3][j]==n&&qp[i+4][j]==n){
				/*(|)竖 
					i
					o
					o
					o
					o
				*/
					return 1;				//五子连珠 
				}							//x前边界
				if(i>=5&&qp[i][j]==n&&qp[i+1][j-1]==n&&qp[i+2][j-2]==n&&qp[i+3][j-3]==n&&qp[i+4][j-4]==n){
				/*(/)右斜 
					    i
					   o
					  o
					 o
					o
				*/
					return 1;				//五子连珠 
				}
			}
		}
	}
	return 0;								//没有五子连珠 
}

int r(int max,int min){						//随机数生成 
	return min+rand()%(max-min+1);			//随机数生成公式 
} 

void win(int wj){							//玩家胜利 
	qj++;									//棋局记录 
	qpcr();									//棋盘清空 
	col(2);									//颜色更改
	space(16,"**********");					//间隔 
	col(1);									//颜色更改
	cout<<'\n';								//换行 
	print("玩家");							//提示
	cout<<ren[wj].name;						//提示
	print("本局取得胜利!!!"); 				//提示
	cout<<'\n';								//换行 
	ren[wj].bf++;							//比分+1
	Sleep(15000); 							//停顿 
	rdcnt=0;								//回合清零 
	cr();									//清屏 
	if(ren[wj].bf==wincnt){					//判断变量
		cr();								//清屏 
		col(2);								//颜色更改
		space(16,"**********");				//间隔 
		cout<<'\n';							//换行 
		space(16,"**********");				//间隔 
		cout<<'\n';							//换行 
		col(1);								//颜色更改
		print("玩家");						//提示
		col(6); 							//颜色更改
		cout<<ren[wj].name;					//提示
		col(1);								//颜色更改
		print("取得全局胜利!!!!!");			//提示
		cout<<'\n';							//换行
		print("结算"); 						//结算 
		cout<<'\n';							//换行
		if(dj){								//判断变量
			print("难度"); 					//提示
			col(6);							//颜色更改
			cout<<dj;						//提示
			col(1);							//颜色更改
			print("级"); 					//提示
			cout<<'\n';						//换行
		}
		print("下了"); 						//提示
		col(6); 							//颜色更改
		cout<<qj;							//提示
		col(1); 							//颜色更改
		print("局"); 						//提示
		cout<<'\n';							//换行
		print("黑棋玩家是");				//提示
		col(6); 							//颜色更改
		cout<<ren[bc].name;					//提示
		col(1); 							//颜色更改
		print("玩家");						//提示
		cout<<'\n';							//换行
		print("白棋玩家是");				//提示
		col(6);								//颜色更改
		cout<<ren[wc].name;					//提示
		col(1);								//颜色更改
		print("玩家");						//提示
		cout<<'\n';							//换行
		print("最终玩家");					//提示
		col(6);								//颜色更改
		cout<<ren[0].name;					//提示
		col(1);								//颜色更改
		print("和玩家");					//提示
		col(6);								//颜色更改
		cout<<ren[1].name;					//提示
		col(1);								//颜色更改
		print("比分为");					//提示
		cout<<ren[0].bf<<':'<<ren[1].bf;	//提示
		Sleep(20000);						//停顿 
		exit(0);							//退出 
	} 
} 

void col(int n){							//颜色选择函数
    switch(n){								//判断变量
        case 1:{							//黑色
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),240);
            break;							//跳出
    	}
        case 2:{							//深蓝色
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),241); 
            break;							//跳出
    	}
        case 3:{							//深绿色
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),242);
            break;							//跳出
        }
        case 4:{							//浅蓝色
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),243);
            break;							//跳出
        }
        case 5:{							//深粉色 
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),244);
            break;							//跳出
		} 
        case 6:{							//紫色
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),245);
            break;							//跳出
    	}
        case 7:{							//黄色
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),246); 
            break;							//跳出
    	}
        case 8:{							//浅灰色
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),247);
            break;							//跳出
        }
        case 9:{							//深灰色
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),248);
            break;							//跳出
        }
        case 10:{							//浅蓝色
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),249);
            break;							//跳出
		} 
    }
}

void qpcr(){								//棋盘清空 
	for(int i=1;i<=15;i++){					//遍历地图x
		for(int j=1;j<=15;j++){				//遍历地图y
			qp[i][j]=0;						//清零 
		} 
	} 
} 

void printqp(){								//打印棋盘 
	cout<<'\n';								//换行 
	for(int i=0;i<=15;i++){	 				//数字循环 
		printf("%2d",i);					//提示
	}
	cout<<'\n';								//换行 
	for(int i=1;i<=15;i++){					//遍历地图x 
		printf("%2d",i);					//提示
		for(int j=1;j<=15;j++){				//遍历地图y 
			switch(qp[i][j]){				//判断变量
				case 0:{					//空 
					printf("  ");			//提示
					break;					//跳出
				}
				case 1:{					//黑棋 
					printf("●");			//提示
					break;					//跳出
				}
				case 2:{					//白棋 
					printf("○");			//提示
					break;					//跳出
				} 
			}
		} 
		cout<<"\n";							//换行 
	} 
} 

void space(short n,string a){				//循环输出字符 
	for(short i=1;i<=n;i++){				//循环n次 
		cout<<a;							//输出字符
	}
}

void goxy(short x,short y){					//光标移动函数
    COORD coord;							//使用头文件自带的坐标结构
    coord.X=x;								//X表示横坐标
    coord.Y=y;								//Y表示纵坐标
    HANDLE a;								//定义变量 
	a=GetStdHandle(STD_OUTPUT_HANDLE);		//获得标准输出句柄
    SetConsoleCursorPosition(a,coord);		//以标准输出的句柄为参数设置控制台光标坐标
}

void cr(){									//清屏 
    goxy(1,1);								//光标移动到1行1列 
	cout<<"\b";								//回格
    for(short i=1;i<=100;i++){				//循环100次 
        space(24,"       ");				//清屏 
        cout<<'\n';							//换行 
    }
    cout<<"\n";								//换行    
	goxy(1,1);								//光标移动到1行1列
	cout<<"\b";								//回格 
}

void print(string n){						//停顿性输出
	for(int i=0;i<n.length();i++){			//遍历字符串 
		cout<<n[i];							//输出单个字符 
		Sleep(10);							//停顿25毫秒 
	}
}

void rd(int n){								//回合 
	n++; 									//因为n传进是0,1 但棋盘标记是1,2
	int xz;									//定义 
	bool flag=1; 							//定义
	col(2);									//颜色更改
	space(8,"********************");		//间隔
	col(1);									//颜色更改
	cout<<"\n";								//换行 
	while(1){								//输入循坏(防止输入错误)
		flag=0;								//设置变量
		if(ren[n-1].bk==0||q[0][0]==0||q[1][0]==0){//判断变量
			print("你只能下棋");			//提示
			cout<<"\n";						//换行 
			xz=1;							//设置变量
		}
		else{								//判断变量
			print(" 1.下棋");				//提示 
			cout<<"\n";						//换行 
			print(" 2.悔棋");				//提示
			cout<<"\n";						//换行 
			cin>>xz;						//输入选择
			if(xz!=1&&xz!=0&&xz!=2){
				print("数值出错!!!");		//提示数值错误 
				cout<<"\n";					//换行
				continue;					//跳出
			}
		}
		switch(xz){							//判断变量
			case 1:{						//判断变量
				while(1){					//输入循坏(防止输入错误)
					int x,y;				//定义变量 
					print("哪一行?");		//提示
					col(3);					//颜色更改
					cin>>x;					//录入数据
					col(1);					//颜色更改
					if(x<1||x>15){			//判断变量
						print("数值出错!!!");//提示数值错误 
						cout<<"\n";			//换行 
						continue;			//跳出
					}
					print("哪一列?");		//提示
					col(3);					//颜色更改
					cin>>y;					//录入数据
					col(1);					//颜色更改
					if(y<1||y>15){			//判断变量
						print("数值出错!!!");//提示数值错误 
						cout<<"\n";			//换行 
						continue;			//跳出
					}
					if(qp[x][y]!=0){		//已被下过 
						print("已被其他棋子下过");//提示 
						cout<<"\n";			//换行 
						continue;			//跳出
					}
					q[0][2]=q[1][2];		//设置变量
					q[0][0]=q[1][0];		//设置变量
					q[0][1]=q[1][1];		//设置变量
					q[1][0]=x;				//设置变量
					q[1][1]=y;				//设置变量
					q[1][2]=n;				//设置变量
					qp[x][y]=n;				//设置变量
					break; 					//跳出
				} 
				break;						//跳出
			}
			case 2:{						//判断变量
				if(MessageBox(NULL,"你确定要悔棋","五子棋",MB_YESNO)==IDNO||ren[n-1].bk==0){//弹窗判断 
					flag=0; 				//设置变量
				}
				else{
					ren[n-1].bk--;			//设置变量
					qp[q[0][0]][q[0][1]]=qp[q[1][0]][q[1][1]]=0;//设置变量
					q[0][0]=q[0][1]=q[1][0]=q[1][1]=0;//设置变量
					if(n!=q[0][2]){
						q[0][2]=q[1][2]=0;	//设置变量
						break;				//跳出
					}
					q[0][2]=q[1][2]=0;		//设置变量
					pin(n-1); 				//初始化 
					printqp(); 				//打印棋盘 
					while(1){				//输入循坏(防止输入错误)
						int x,y;			//定义变量 
						print("哪一行?");	//提示
						col(3);				//颜色更改
						cin>>x;				//录入数据
						col(1);				//颜色更改
						if(x<1||x>15){		//判断变量
							print("数值出错!!!");//提示数值错误 
							cout<<"\n";		//换行 
							continue;		//跳出
						}
						print("哪一列?");	//提示
						col(3);				//颜色更改
						cin>>y;				//录入数据
						col(1);				//颜色更改
						if(y<1||y>15){		//判断变量
							print("数值出错!!!");//提示数值错误 
							cout<<"\n";		//换行 
							continue;		//跳出
						}
						if(qp[x][y]!=0){	//已被下过 
							print("已被其他棋子下过");//提示 
							cout<<"\n";		//换行 
							continue;		//跳出
						}
						q[1][0]=x;			//设置变量
						q[1][1]=y;			//设置变量
						q[1][2]=n;			//设置变量
						qp[x][y]=n;			//设置变量
						break; 				//跳出
					} 
				} 
				break;						//跳出
			}
		}
		break;								//跳出
	}
} 

void hc(){									//隐藏光标
/*CONSOLE_CURSOR_INFO结构体包含控制台光标的信息,
DWORD dwSize光标百分比厚度(1~100)和BOOL bVisible光标是否可见*/
	CONSOLE_CURSOR_INFO cursor_info={1,0};
/*SetConsoleCursorInfo用来设置指定的控制台光标的大小和可见性。*/
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}

​

如需代码 私信我

戈思越在2021-05-13 07:47:55追加了内容

请给我建议

戈思越在2021-05-13 07:48:47追加了内容

建议最好的采纳


0
已采纳
朱小川
朱小川
缔造者
缔造者

下错的时候一直输出数值错误for循环里有问题

0
0
张恩泽
张恩泽
高级天翼
高级天翼

话说这个号是你的小号还是别人的号【doge】

0
0
0
0
朱小川
朱小川
缔造者
缔造者

下错的时候一直输出数值错误for循环里有问题

朱小川在2021-05-13 13:25:21追加了内容

不好意思,卡了

0
朱小川
朱小川
缔造者
缔造者

下错的时候一直输出数值错误for循环里有问题

我要回答