中级守护
我是朱瑾文,之前用戈斯月的号发了五子棋双人测试版,我用了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; //返回答案
}
高级天翼