问题标题: 酷町堂:五子棋双人1.0版

1
0
已解决
朱瑾文
朱瑾文
中级守护
中级守护

我是朱瑾文,之前用戈斯月的号发了五子棋双人测试版,我用了373分钟,更新了五子棋双人。

主要更新:

1.修改测试版的BUG
  (1)输入错误循环
  (2)清屏不彻底
2.新增保存棋盘和读取棋盘功能
代码:



//**************************头文件***************************
 
//以下为加快代码  
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize(2)
//以上为加快代码 
#include<iostream>							//cincout
#include<fstream>							//finfout
#include<cstring>							//char[]
#include<string>							//string
#include<windows.h>							//system Sleep Beep
#include<cstdio>							//printf
#include<stdlib.h>							//随机函数rand 
#include<time.h>							//时间访问
#include<cmath>								//数学函数 
//#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/*白棋玩家*/,ms[2]/*判断是否读入数据*/,q[2][3]/*前一、二步*/;
 
 
//***********************函数提前定义************************

void col(int n);							//颜色选择函数
void goxy(short x,short y);					//光标移动函数,X表示横坐标,Y表示纵坐标。
void space(short n,string a);				//循环输出字符 
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();								//打印棋盘 
long long scann();							//输入数字

 
//*************************主函数****************************
 
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();									//隐藏光标
	system("cls");							//清屏
	cout<<'\n';								//换行 
	while(1){
		col(2);								//颜色更改
		space(8,"********************");	//间隔
		col(1);								//颜色更改
		int xz,flag_=0;						//定义变量 
		print("请选择 1.新建游戏 2.棋盘记录");//提示
		col(3);								//颜色更改	
		xz=scann();							//输入变量 
		col(1);								//颜色更改
		if(xz<1||xz>2){						//输入错误
			print("输入错误!!!");			//提示 
			cout<<'\n';						//换行 
			continue;						//跳出 
		}
		switch(xz){							//多重判断 
			case 1:{						//新建游戏 
				while(1){					//输入循坏(防止输入错误) 
					print("请选择难度(1-3),越大越难,0为自定义");//提示
					col(3);					//颜色更改
					dj=scann();				//录入数据
					col(1);					//颜色更改
					switch(dj){				//判断变量 
						case 0:{			//随机
							while(1){		//输入循坏(防止输入错误)					
								print("双方可以撤几次棋?");//提示 
								col(3);		//颜色更改
								fl.bk=scann();//录入数据
								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){				//判断变量
						print("数值出错!!!");//提示数值错误 
						cout<<'\n';			//换行 
					}
					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);				//停顿 
				system("cls");				//清屏
				break;
			}
			case 2:{
				char fname[10001];			//定义保存的文件名
				col(1);						//颜色更改
				print("文件名:");			//提示 
				col(3);						//颜色更改
				cin>>fname;					//输入保存的文件名
				col(1);						//颜色更改
				strcat(fname,".ini");		//连接字符串 
				ifstream fin(fname);		//导入文件
				int cnt_=0; 
				ms[0]=1; 
				/*以下是输入代码*/
				for(int i=1;i<=15;i++){ 
					for(int j=1;j<=15;j++){
						fin>>qp[i][j];
						if(!qp[i][j]){
							cnt_++;
						}
					}
				}
				if(cnt_==225){				//文件为空 
					print("无此文件!!!");	//提示 
					cout<<'\n';				//换行 
					flag_=1;				//标记变量 
					break;					//跳出  
				}
				fin>>ren[0].name>>ren[0].bf>>ren[0].bk>>ren[0].color;//录入数据 
				fin>>ren[1].name>>ren[1].bf>>ren[1].bk>>ren[1].color;//录入数据 
				fin>>qj>>wincnt>>rdcnt>>bc>>wc;
				for(int i=0;i<2;i++){
					for(int j=0;j<3;j++){
						fin>>q[i][j];
					}
				}
				fin>>ms[1];
				break;
			}
		}
		if(flag_){							//判断标记 
			continue;						//跳出 
		}
		break;
	} 
	int _flag=0;							//定义标记变量 
	if(!(ms[0]&&ms[1]==wc)){					//判断标记 
		rdcnt++;							//回合+1	
		pin(bc); 							//初始化 
		printqp(); 							//打印棋盘 
		rd(!bc);							//回合下一棋 
		if(check(0)){						//判断黑棋五子连珠 
			win(bc);						//赢
			_flag=1;						//标记 
		}
	}
	while(1){								//一个回合
		if(!(_flag==1)){ 					//判断标记
			space(5,"\n");					//间隔 
			pin(wc); 						//初始化
			printqp(); 						//打印棋盘 
			rd(!wc);						//回合下一棋 
			if(check(0)){					//判断白棋五子连珠 
				win(wc);					//赢 
			}	
			system("cls");					//清屏 			
		} 
		_flag=0;
		rdcnt++;							//回合+1	
		pin(bc); 							//初始化 
		printqp(); 							//打印棋盘 
		rd(!bc);							//回合下一棋 
		if(check(0)){						//判断黑棋五子连珠 
			win(bc);						//赢
			_flag=1;						//标记 
		}
	} 
}
 
 
//***********************其他函数************************** 
 
 
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;								//回合清零 
	system("cls");							//清屏 
	if(ren[wj].bf==wincnt){					//判断变量
		system("cls");						//清屏 
		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 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";						//换行 
			print(" 3.保存棋盘");			//提示
			cout<<"\n";						//换行 
			xz=scann();						//输入选择
			if(xz!=1&&xz!=0&&xz!=2&&xz!=3){
				print("数值出错!!!");		//提示数值错误 
				cout<<"\n";					//换行
				continue;					//跳出
			}
		}
		switch(xz){							//判断变量
			case 1:{						//判断变量
				while(1){					//输入循坏(防止输入错误)
					int x,y;				//定义变量 
					print("哪一行?");		//提示
					col(3);					//颜色更改
					x=scann();					//录入数据
					col(1);					//颜色更改
					if(x<1||x>15){			//判断变量
						print("数值出错!!!");//提示数值错误 
						cout<<"\n";			//换行 
						continue;			//跳出
					}
					print("哪一列?");		//提示
					col(3);					//颜色更改
					y=scann();				//录入数据
					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);				//颜色更改
						x=scann();			//录入数据
						col(1);				//颜色更改
						if(x<1||x>15){		//判断变量
							print("数值出错!!!");//提示数值错误 
							cout<<"\n";		//换行 
							continue;		//跳出
						}
						print("哪一列?");	//提示
						col(3);				//颜色更改
						y=scann();			//录入数据
						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;						//跳出
			}
			case 3:{						//保存棋盘 
				char fname[10001];			//定义保存的文件名
				print("保存的文件名:");		//提示 
				col(3);						//颜色更改
				cin>>fname;					//输入保存的文件名
				col(1);						//颜色更改
				strcat(fname,".ini");		//连接字符串 
				ofstream fout(fname);		//导入文件 
				/*以下是输出代码*/
				for(int i=1;i<=15;i++){ 
					for(int j=1;j<=15;j++){
						fout<<qp[i][j]<<' '; 
					}
					fout<<'\n'; 
				}
				fout<<ren[0].name<<' '<<ren[0].bf<<' '<<ren[0].bk<<' '<<ren[0].color<<'\n';//录入数据 
				fout<<ren[1].name<<' '<<ren[1].bf<<' '<<ren[1].bk<<' '<<ren[1].color<<'\n';//录入数据 
				fout<<qj<<' '<<wincnt<<' '<<rdcnt<<' '<<bc<<' '<<wc<<'\n';
				for(int i=0;i<2;i++){
					for(int j=0;j<3;j++){
						fout<<q[i][j]<<' ';
					}
					fout<<'\n';
				}
				fout<<n;
				fout.close();
			}
		}
		if(xz==3){							//判断变量
			continue;						//跳出			
		}
		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);
}

long long scann(){							//输入数字 
	string n;								//定义字符串 
	bool flag=1;							//定义标记变量 
	long long ans=-1;						//定义结果 
	cin>>n;									//输入字符串
	for(int i=0;i<n.length();i++){			//遍历字符串
		if(!(n[i]>=48||n[i]<=57)){			//判断是否是数字 
			flag=0;							//标记标记变量
			break;							//跳出 
		}
	}
	if(flag){								//判断标记变量 
		ans=0; 								//更改变量
		for(int i=0;i<n.length();i++){		//遍历字符串
			ans+=(n[i]-48)*pow(10,n.length()-i-1);//字符转数字 
		}
	} 
	return ans; 							//返回答案 
}

希望大家提出意见。

如果需要代码,请加我QQ

朱瑾文在2021-09-04 16:39:58追加了内容

//**************************头文件***************************
 
//以下为加快代码  
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize(2)
//以上为加快代码 
#include<iostream>                            //cincout
#include<fstream>                            //finfout
#include<cstring>                            //char[]
#include<string>                            //string
#include<windows.h>                            //system Sleep Beep
#include<cstdio>                            //printf
#include<stdlib.h>                            //随机函数rand 
#include<time.h>                            //时间访问
#include<cmath>                                //数学函数 
//#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/*白棋玩家*/,ms[2]/*判断是否读入数据*/,q[2][3]/*前一、二步*/;
 
 
//***********************函数提前定义************************

void col(int n);                            //颜色选择函数
void goxy(short x,short y);                    //光标移动函数,X表示横坐标,Y表示纵坐标。
void space(short n,string a);                //循环输出字符 
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();                                //打印棋盘 
long long scann();                            //输入数字

 
//*************************主函数****************************
 
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();                                    //隐藏光标
    system("cls");                            //清屏
    cout<<'\n';                                //换行 
    while(1){
        col(2);                                //颜色更改
        space(8,"********************");    //间隔
        col(1);                                //颜色更改
        int xz,flag_=0;                        //定义变量 
        print("请选择 1.新建游戏 2.棋盘记录");//提示
        col(3);                                //颜色更改    
        xz=scann();                            //输入变量 
        col(1);                                //颜色更改
        if(xz<1||xz>2){                        //输入错误
            print("输入错误!!!");            //提示 
            cout<<'\n';                        //换行 
            continue;                        //跳出 
        }
        switch(xz){                            //多重判断 
            case 1:{                        //新建游戏 
                while(1){                    //输入循坏(防止输入错误) 
                    print("请选择难度(1-3),越大越难,0为自定义");//提示
                    col(3);                    //颜色更改
                    dj=scann();                //录入数据
                    col(1);                    //颜色更改
                    switch(dj){                //判断变量 
                        case 0:{            //随机
                            while(1){        //输入循坏(防止输入错误)                    
                                print("双方可以撤几次棋?");//提示 
                                col(3);        //颜色更改
                                fl.bk=scann();//录入数据
                                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){                //判断变量
                        print("数值出错!!!");//提示数值错误 
                        cout<<'\n';            //换行 
                    }
                    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);                //停顿 
                system("cls");                //清屏
                break;
            }
            case 2:{
                char fname[10001];            //定义保存的文件名
                col(1);                        //颜色更改
                print("文件名:");            //提示 
                col(3);                        //颜色更改
                cin>>fname;                    //输入保存的文件名
                col(1);                        //颜色更改
                strcat(fname,".ini");        //连接字符串 
                ifstream fin(fname);        //导入文件
                int cnt_=0; 
                ms[0]=1; 
                /*以下是输入代码*/
                for(int i=1;i<=15;i++){ 
                    for(int j=1;j<=15;j++){
                        fin>>qp[i][j];
                        if(!qp[i][j]){
                            cnt_++;
                        }
                    }
                }
                if(cnt_==225){                //文件为空 
                    print("无此文件!!!");    //提示 
                    cout<<'\n';                //换行 
                    flag_=1;                //标记变量 
                    break;                    //跳出  
                }
                fin>>ren[0].name>>ren[0].bf>>ren[0].bk>>ren[0].color;//录入数据 
                fin>>ren[1].name>>ren[1].bf>>ren[1].bk>>ren[1].color;//录入数据 
                fin>>qj>>wincnt>>rdcnt>>bc>>wc;
                for(int i=0;i<2;i++){
                    for(int j=0;j<3;j++){
                        fin>>q[i][j];
                    }
                }
                fin>>ms[1];
                break;
            }
        }
        if(flag_){                            //判断标记 
            continue;                        //跳出 
        }
        break;
    } 
    int _flag=0;                            //定义标记变量 
    if(!(ms[0]&&ms[1]==wc)){                    //判断标记 
        rdcnt++;                            //回合+1    
        pin(bc);                             //初始化 
        printqp();                             //打印棋盘 
        rd(!bc);                            //回合下一棋 
        if(check(0)){                        //判断黑棋五子连珠 
            win(bc);                        //赢
            _flag=1;                        //标记 
        }
    }
    while(1){                                //一个回合
        if(!(_flag==1)){                     //判断标记
            space(5,"\n");                    //间隔 
            pin(wc);                         //初始化
            printqp();                         //打印棋盘 
            rd(!wc);                        //回合下一棋 
            if(check(0)){                    //判断白棋五子连珠 
                win(wc);                    //赢 
            }    
            system("cls");                    //清屏             
        } 
        _flag=0;
        rdcnt++;                            //回合+1    
        pin(bc);                             //初始化 
        printqp();                             //打印棋盘 
        rd(!bc);                            //回合下一棋 
        if(check(0)){                        //判断黑棋五子连珠 
            win(bc);                        //赢
            _flag=1;                        //标记 
        }
    } 
}
 
 
//***********************其他函数************************** 
 
 
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;                                //回合清零 
    system("cls");                            //清屏 
    if(ren[wj].bf==wincnt){                    //判断变量
        system("cls");                        //清屏 
        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 print(string n){                        //停顿**输出
    for(int i=0;i<n.length();i++){            //遍历字符串 
        cout<<n[i];                            //输出单个字符 
        Sleep(25);                            //停顿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";                        //换行 
            print(" 3.保存棋盘");            //提示
            cout<<"\n";                        //换行 
            xz=scann();                        //输入选择
            if(xz!=1&&xz!=0&&xz!=2&&xz!=3){
                print("数值出错!!!");        //提示数值错误 
                cout<<"\n";                    //换行
                continue;                    //跳出
            }
        }
        switch(xz){                            //判断变量
            case 1:{                        //判断变量
                while(1){                    //输入循坏(防止输入错误)
                    int x,y;                //定义变量 
                    print("哪一行?");        //提示
                    col(3);                    //颜色更改
                    x=scann();                    //录入数据
                    col(1);                    //颜色更改
                    if(x<1||x>15){            //判断变量
                        print("数值出错!!!");//提示数值错误 
                        cout<<"\n";            //换行 
                        continue;            //跳出
                    }
                    print("哪一列?");        //提示
                    col(3);                    //颜色更改
                    y=scann();                //录入数据
                    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);                //颜色更改
                        x=scann();            //录入数据
                        col(1);                //颜色更改
                        if(x<1||x>15){        //判断变量
                            print("数值出错!!!");//提示数值错误 
                            cout<<"\n";        //换行 
                            continue;        //跳出
                        }
                        print("哪一列?");    //提示
                        col(3);                //颜色更改
                        y=scann();            //录入数据
                        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;                        //跳出
            }
            case 3:{                        //保存棋盘 
                char fname[10001];            //定义保存的文件名
                print("保存的文件名:");        //提示 
                col(3);                        //颜色更改
                cin>>fname;                    //输入保存的文件名
                col(1);                        //颜色更改
                strcat(fname,".ini");        //连接字符串 
                ofstream fout(fname);        //导入文件 
                /*以下是输出代码*/
                for(int i=1;i<=15;i++){ 
                    for(int j=1;j<=15;j++){
                        fout<<qp[i][j]<<' '; 
                    }
                    fout<<'\n'; 
                }
                fout<<ren[0].name<<' '<<ren[0].bf<<' '<<ren[0].bk<<' '<<ren[0].color<<'\n';//录入数据 
                fout<<ren[1].name<<' '<<ren[1].bf<<' '<<ren[1].bk<<' '<<ren[1].color<<'\n';//录入数据 
                fout<<qj<<' '<<wincnt<<' '<<rdcnt<<' '<<bc<<' '<<wc<<'\n';
                for(int i=0;i<2;i++){
                    for(int j=0;j<3;j++){
                        fout<<q[i][j]<<' ';
                    }
                    fout<<'\n';
                }
                fout<<n;
                fout.close();
            }
        }
        if(xz==3){                            //判断变量
            continue;                        //跳出            
        }
        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);
}

long long scann(){                            //输入数字 
    string n;                                //定义字符串 
    bool flag=1;                            //定义标记变量 
    long long ans=-1;                        //定义结果 
    cin>>n;                                    //输入字符串
    for(int i=0;i<n.length();i++){            //遍历字符串
        if(!(n[i]>=48||n[i]<=57)){            //判断是否是数字 
            flag=0;                            //标记标记变量
            break;                            //跳出 
        }
    }
    if(flag){                                //判断标记变量 
        ans=0;                                 //更改变量
        for(int i=0;i<n.length();i++){        //遍历字符串
            ans+=(n[i]-48)*pow(10,n.length()-i-1);//字符转数字 
        }
    } 
    return ans;                             //返回答案 
}
 


0
0
0
0
0
0
王泽轩
王泽轩
资深天翼
资深天翼

做得很好!!!!!!!

0
0
陈俊霖
陈俊霖
新手天翼
新手天翼

采纳我,紧急求助,我就差3个豆就能换头像了

0
0
0
0
0
包思远
包思远
新手启示者
新手启示者

@朱瑾文   @朱瑾文   

0
0
我要回答