C++五子棋编写控制台版CMD命令框版简单五子棋游戏适合初学者学习代码有详细注释.docx
《C++五子棋编写控制台版CMD命令框版简单五子棋游戏适合初学者学习代码有详细注释.docx》由会员分享,可在线阅读,更多相关《C++五子棋编写控制台版CMD命令框版简单五子棋游戏适合初学者学习代码有详细注释.docx(37页珍藏版)》请在冰点文库上搜索。
C++五子棋编写控制台版CMD命令框版简单五子棋游戏适合初学者学习代码有详细注释
jieC++五子棋Ver2.1程序+代码[带AI、悔棋等]【控制台版】
这是用C++编写的一个简单五子棋游戏,带AI(电脑)、悔棋等功能。
支持单人游戏(与电脑对战)和双人对战。
使用的C++知识也很简单,只需要懂基本的语法,不需要用到API。
这个游戏不是图形界面的。
是DOS版或者说控制台版的。
游戏的运行界面如下:
这其实是第三版,添加了悔棋,修复AI[电脑]的几个BUG,以及悔棋的一个小问题。
当然了,若是还有什么BUG可以指出,我们的QQ:
775904764,有问题也可以找我。
代码如下:
//--------------------------------------------------------------------------//
//简单五子棋(控制台版)代码[Ver2.1]
//修复了AI越界的问题,简化评分函数,修复输赢判断函数的BUG。
//AI评分函数规则有部分改变,代码也更加简练。
//新增悔棋功能,仅与AI对战时可用,新增重新开始功能。
//修复悔棋的一个小BUG,修复AI随机落子部分的定义错误。
//作者:
落叶化尘QQ:
775904764
//--------------------------------------------------------------------------//
#include"五子棋类.h"
#include
#include
usingnamespacestd;
staticconstcharch[11][4]={"┌","┬","┐","├","┼","┤","└","┴","┘","○","●"};//可供选用的字符,输出棋盘或者棋子用
staticintRecord[15][15]={0};//记录棋子
staticintScore[15][15]={0};//评分
staticintSum=0,Renum=0;
intmain()
{
intDefault[15][15]={0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,//空棋盘
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
6,7,7,7,7,7,7,7,7,7,7,7,7,7,8};
intvalue[15][15]={0};
FiveChessStart;
do
{
Start.StartGame(value,Default);//开始游戏
}
while(Start.Continue);//若是要退出就修改这个值
return0;
}
//------------------------------开始游戏------------------------------------------//
voidFiveChess:
:
StartGame(intvalue[][15],intDefault[][15])
{
Empty(value,Default);//初始化棋盘ad
ExWhile=true;
while(ExWhile)
{
Choice=MainMenu();//调用主菜单,并把用户选择的值储存在Choice里
switch(Choice)
{
case1:
flag=1;ExWhile=false;break;//把标志设置为1,与AI对战
case2:
flag=2;ExWhile=false;break;//把标志设置为2,双人对战
case3:
Select=Introduce();ExWhile=Select;Continue=false;break;//游戏说明函数
case4:
Select=Coder();ExWhile=Select;Continue=false;break;//作者介绍函数
case5:
Exit();ExWhile=false;Continue=false;break;//退出游戏函数
default:
cin.fail();cin.clear();cin.sync();cout<<"输出错误,请重新输入!
\n";system("pause>nul2>nul");ExWhile=true;break;//其它
}
}
if(flag==1)//如果标志等于1,说明为单人游戏
{
Single(value);
}
elseif(flag==2)//如果标志等于2,说明为双人游戏
{
Double(value);
}
flag=0;
}
//------------------------清空棋盘或初始化棋盘-----------------------------------//
voidFiveChess:
:
Empty(intvalue[][15],intDefault[][15])//清空棋盘
{
for(inti=0;i<15;i++)
{
for(intj=0;j<15;j++)
{
value[i][j]=Default[i][j];
}
}
}
voidFiveChess:
:
Exit()//退出游戏
{
system("cls");
cout<<"┌—————————————————————————┐\n";
cout<<"│感谢您使用:
简单五子棋Ver2.1│\n";
cout<<"││\n";
cout<<"│[游戏制作]:
落叶化尘│\n";
cout<<"│[联系QQ]:
775904764│\n";
cout<<"│[联系邮箱]:
lxhdjwg@│\n";
cout<<"│[简单说明]:
游戏结束界面,谢谢您的使用!
│\n";
cout<<"└—————————————————————————┘\n";
cout<<"感谢您的使用,谢谢!
按任意键退出游戏...\n";
system("pause>nul2>nul");
}
boolFiveChess:
:
Introduce()//游戏介绍
{
system("cls");
cout<<"┌—————————————————————————┐\n";
cout<<"│简单五子棋Ver2.1[游戏介绍界面]│\n";
cout<<"││\n";
cout<<"│[单人游戏]:
玩家和AI(人工智能)对战,AI智商不高。
│\n";
cout<<"││\n";
cout<<"│[双人游戏]:
可以两个玩家一起对战,可能不是很方便。
│\n";
cout<<"││\n";
cout<<"│[游戏方法]:
输入XY坐标落子,输入双-1悔棋。
│\n";
cout<<"││\n";
cout<<"│[特别提示]:
若游戏中想突然退出,按Ctrl+C即可中断。
│\n";
cout<<"││\n";
cout<<"└—————————————————————————┘\n";
cout<<"是否返回?
[Y-返回N-退出]:
";
charchoice;
cin>>choice;
if(choice=='N'||choice=='n')
{
cout<<"感谢您的使用,谢谢!
按任意键退出游戏...\n";
system("pause>nul2>nul");
returnfalse;
}
else
{
returntrue;
}
}
boolFiveChess:
:
Coder()//作者介绍
{
system("cls");
cout<<"┌—————————————————————————┐\n";
cout<<"│简单五子棋Ver2.1[作者介绍界面]│\n";
cout<<"││\n";
cout<<"│[游戏制作]:
落叶化尘│\n";
cout<<"│[联系QQ]:
775904764│\n";
cout<<"│[联系邮箱]:
lxhdjwg@│\n";
cout<<"│[简单介绍]:
游戏制作简陋,还请见谅^_^!
│\n";
cout<<"│[附加说明]:
作者正在努力学习C++中,嘿嘿~│\n";
cout<<"└—————————————————————————┘\n";
cout<<"是否返回?
[Y-返回N-退出]:
";
charchoice;
cin>>choice;
if(choice=='N'||choice=='n')
{
cout<<"感谢您的使用,谢谢!
按任意键退出游戏...\n";
system("pause>nul2>nul");
returnfalse;
}
else
{
returntrue;
}
}
//-------------------------------选择主菜单-----------------------------//
intFiveChess:
:
MainMenu()
{
system("cls");//清屏
system("title五子棋游戏By--落叶化尘QQ:
775904764");//修改窗口标题
system("color3f");//定义窗口颜色
system("modeconcols=56lines=20");//设置窗口大小
cout<<"┌—————————————————————————┐\n";
cout<<"│简单五子棋Ver2.1│\n";
cout<<"│[1]、单人游戏│\n";
cout<<"││\n";
cout<<"│[2]、双人游戏│\n";
cout<<"││\n";
cout<<"│[3]、游戏介绍│\n";
cout<<"││\n";
cout<<"│[4]、关于作者│\n";
cout<<"││\n";
cout<<"│[5]、退出│\n";
cout<<"└—————————————————————————┘\n";
cout<<"请选择:
";
intselect;
cin>>select;
returnselect;//返回用户选择的值
}
//--------------------------------胜利界面--------------------------------//
voidFiveChess:
:
Victory(intNum)
{
system("modeconcols=56lines=20");//设置窗口大小
system("cls");
if(Num==1)
{
system("color1f");
cout<<"┌—————————————————————————┐\n";
cout<<"│恭喜玩家1[黑棋]获得胜利!
│\n";
cout<<"││\n";
cout<<"│[胜利玩家]:
玩家1│\n";
cout<<"│[所属棋子]:
黑色│\n";
cout<<"│[祝福话语]:
不错哦^_^!
恭喜您获得了胜利!
│\n";
cout<<"││\n";
cout<<"└—————————————————————————┘\n";
}
elseif(Num==2)
{
system("color2f");
cout<<"┌—————————————————————————┐\n";
cout<<"│恭喜玩家2[白棋]获得胜利!
│\n";
cout<<"││\n";
cout<<"│[胜利玩家]:
玩家2│\n";
cout<<"│[所属棋子]:
白色│\n";
cout<<"│[祝福话语]:
恭喜您获得了胜利,再接再厉哈^_^!
│\n";
cout<<"││\n";
cout<<"└—————————————————————————┘\n";
}
elseif(Num==3)
{
system("color3f");
cout<<"┌—————————————————————————┐\n";
cout<<"│恭喜您,获得了胜利│\n";
cout<<"││\n";
cout<<"│[胜利玩家]:
自己│\n";
cout<<"│[所属棋子]:
黑色│\n";
cout<<"│[祝福话语]:
不错哦,打败了AI,恭喜!
│\n";
cout<<"││\n";
cout<<"└—————————————————————————┘\n";
}
elseif(Num==4)
{
system("color5f");
cout<<"┌—————————————————————————┐\n";
cout<<"│非常遗憾,您输了!
│\n";
cout<<"││\n";
cout<<"│[胜利玩家]:
AI(电脑)│\n";
cout<<"│[所属棋子]:
白色│\n";
cout<<"│[祝福话语]:
加油吧,下次一定要把AI打败哦!
│\n";
cout<<"││\n";
cout<<"└—————————————————————————┘\n";
}
else
{
system("color5f");
cout<<"┌—————————————————————————┐\n";
cout<<"│势均力敌——平局│\n";
cout<<"││\n";
cout<<"│[胜利玩家]:
无[平局]│\n";
cout<<"│[所属棋子]:
黑色或白色│\n";
cout<<"│[祝福话语]:
棋盘居然被走满了,不错不错~!
│\n";
cout<<"││\n";
cout<<"└—————————————————————————┘\n";
}
cout<<"是否返回主界面?
[Y-返回N-退出]:
";
charchoice;
cin>>choice;
if(choice=='N'||choice=='n')
{
cout<<"感谢您的使用,谢谢!
按任意键退出游戏...\n";
system("pause>nul2>nul");
Continue=false;
}
else
{
Continue=true;
}
}
//----------------------------悔棋-------------------------------//
voidFiveChess:
:
Retract(int&x1,int&y1,int&x2,int&y2,intvalue[][15])
{
if(Sum>=1)
{
Sum--;
}
if((x1==-1)&&(y1==-1)&&(x2==-1)&&(y2==-1))
{
cout<<"当前无法悔棋,棋盘上没有棋子!
";
system("pause>nul");
}
elseif(Renum>=6)
{
cout<<"悔棋超过6次,为了公平,您不能再次悔棋!
";
system("pause>nul");
}
else
{
Renum++;
if(x1==0&&y1==0){value[x1][y1]=0;Record[x1][y1]=0;}
elseif(x1==0&&y1==14){value[x1][y1]=2;Record[x1][y1]=0;}
elseif(x1==14&&y1==0){value[x1][y1]=6;Record[x1][y1]=0;}
elseif(x1==14&&y1==14){value[x1][y1]=8;Record[x1][y1]=0;}
elseif(x1==14&&(y1>0&&y1<14)){value[x1][y1]=7;Record[x1][y1]=0;}
elseif(y1==14&&(x1>0&&x1<14)){value[x1][y1]=5;Record[x1][y1]=0;}
elseif(x1==0&&(y1>0&&y1<14)){value[x1][y1]=1;Record[x1][y1]=0;}
elseif(y1==0&&(x1>0&&x1<14)){value[x1][y1]=3;Record[x1][y1]=0;}
else{value[x1][y1]=4;Record[x1][y1]=0;}
if(x2==0&&y2==0){value[x2][y2]=0;Record[x2][y2]=0;}
elseif(x2==0&&y2==14){value[x2][y2]=2;Record[x2][y2]=0;}
elseif(x2==14&&y2==0){value[x2][y2]=6;Record[x2][y2]=0;}
elseif(x2==14&&y2==14){value[x2][y2]=8;Record[x2][y2]=0;}
elseif(x2==14&&(y2>0&&y2<14)){value[x2][y2]=7;Record[x2][y2]=0;}
elseif(y2==14&&(x2>0&&x2<14)){value[x1][y2]=5;Record[x2][y2]=0;}
elseif(x2==0&&(y2>0&&y2<14)){value[x2][y2]=1;Record[x2][y2]=0;}
elseif(y2==0&&(x2>0&&x2<14)){value[x2][y2]=3;Record[x2][y2]=0;}
else{value[x2][y2]=4;Record[x2][y2]=0;}
cout<<"每盘最多允许悔棋6次,且最多只能回到上一步!
";
system("pause>nul");
}
}
//-----------------------------判断用户输入的坐标合法性-------------------------//
intFiveChess:
:
Position(int*x,int*y,intvalue[][15])
{
if(cin.fail()||*x<0||*x>=15||*y<0||*y>=15)
{
cin.clear();
cin.sync();
return1;//返回1表示不在范围内或者输入的不是数字
}
elseif(value[*x][*y]==9||value[*x][*y]==10)
{
return2;//存在棋子
}
else
{
return0;//返回0表示坐标正常
}
}
//---------------------------判断该哪个玩家先走----------------------------//
intFiveChess:
:
NextPlayer(intvalue[][15])
{
inti,j;
intplayer1=0,player2=0;
for(i=0;i<15;i++)
{
for(j=0;j<15;j++)
{
if(value[i][j]==10)
{
player1++;//统计棋盘上面黑子的个数
}
elseif(value[i][j]==9)
{
player2++;//统计棋盘上白子的个数
}
}
}
if(player1>player2||player1{
return2;//该玩家2走了(白子)
}
else
{
return1;//该玩家1走了(黑子)
}
}
//---------------------------判断棋子落在这点,是否胜利或者平局-----------------------------------------//
intFiveChess:
:
Win(int*x,int*y,intChessNum,intvalue[][15])
{
inti,j,k;//返回-1:
平局返回0:
没有谁胜利返回1:
传递过来ChessNum号的那一方胜利
intnumber=0;
Sumchess=0;
for(i=-1;i<=1;i++)
{
for(j=-1;j<=1;j++)//循环8次,分别计算这个点的8个方向是否构成5连
{
if(i!
=0||j!
=0)//i或者j等于0,不就代表的是ChessNum的值嘛
{
for(k=1;k<5;k++)//循环4次
{//这是不越界判断//存在棋子数目+1
if(*x+k*i>=0&&*x+k*i<=14&&*y+k*j>=0&&*y+k*j<=14&&value[*x+k*i][*y+k*j]==ChessNum){number++;}//如果这个点有棋子
else{break;}//没有棋子就跳出
}
for(k=-1;k>-5;k--)//与上面相对的方向的判断
{
if(*x+k*i>=0