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
0
0
0
0
0
0
0