C++五子棋编写(控制台版_CMD命令框版)【简单五子棋游戏_适合初学者学习_代码有详细注释】_第1页
C++五子棋编写(控制台版_CMD命令框版)【简单五子棋游戏_适合初学者学习_代码有详细注释】_第2页
C++五子棋编写(控制台版_CMD命令框版)【简单五子棋游戏_适合初学者学习_代码有详细注释】_第3页
C++五子棋编写(控制台版_CMD命令框版)【简单五子棋游戏_适合初学者学习_代码有详细注释】_第4页
C++五子棋编写(控制台版_CMD命令框版)【简单五子棋游戏_适合初学者学习_代码有详细注释】_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、jieC+五子棋Ver2.1程序+代码带AI、悔棋等【控制台版】这是用C+编写的一个简单五子棋游戏,带AI(电脑)、悔棋等功能。支持单人游戏(与电脑对战)和双人对战。使用的C+知识也很简单,只需要懂基本的语法,不需要用到API。这个游戏不是图形界面的。是DOS版或者说控制台版的。游戏的运行界面如下: 这其实是第三版,添加了悔棋,修复AI电脑的几个BUG,以及悔棋的一个小问题。当然了,若是还有什么BUG可以指出,我们的QQ:775904764,有问题也可以找我。代码如下:/-/ 简单五子棋(控制台版)代码Ver2.1/ 修复了AI越界的问题,简化评分函数,修复输赢判断函数的BUG。/ AI评分函

2、数规则有部分改变,代码也更加简练。/ 新增悔棋功能,仅与AI对战时可用,新增重新开始功能。/ 修复悔棋的一个小BUG,修复AI随机落子部分的定义错误。/ 作者:落叶化尘 QQ:775904764/-/#include "五子棋类.h"#include <time.h> #include <iostream>using namespace std; static const char ch114="","","","","","",&

3、quot;","","","","" /可供选用的字符,输出棋盘或者棋子用static int Record1515=0; /记录棋子static int Score1515=0; /评分static int Sum=0,Renum=0; int main() int Default1515= 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,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,

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 ;int value1515=0; FiveChess Start;do Start.StartGame(value,Default); /开始游戏while (Start.Continue); /若是要退出就修改这个值return 0; /-开始游戏-/void FiveChess:StartGame(int value15,int Default15)Empty(value,Default); /初始化棋盘adExWhile=true;while(ExWhile)Ch

6、oice=MainMenu(); /调用主菜单,并把用户选择的值储存在Choice里 switch(Choice) case 1:flag=1;ExWhile=false;break; /把标志设置为1,与AI对战 case 2:flag=2;ExWhile=false;break; /把标志设置为2,双人对战case 3:Select=Introduce();ExWhile=Select;Continue=false;break; /游戏说明函数 case 4:Select=Coder();ExWhile=Select;Continue=false;break; /作者介绍函数 case 5

7、:Exit();ExWhile=false;Continue=false;break; /退出游戏函数 default:cin.fail();cin.clear();cin.sync();cout<<"输出错误,请重新输入!n"system("pause>nul 2>nul");ExWhile=true;break; /其它 if (flag=1) /如果标志等于1,说明为单人游戏Single(value); else if (flag=2) /如果标志等于2,说明为双人游戏Double(value);flag=0;/-清空棋盘或

8、初始化棋盘-/void FiveChess:Empty(int value15,int Default15) /清空棋盘for (int i=0;i<15;i+) for (int j=0;j<15;j+) valueij=Defaultij;void FiveChess:Exit() /退出游戏system("cls");cout<<"n"cout<<" 感谢您使用:简单五子棋 Ver2.1 n"cout<<" n"cout<<"游戏制作:落叶

9、化尘 n"cout<<"联系Q Q : 775904764 n"cout<<"联系邮箱:lxhdjwg n"cout<<"简单说明:游戏结束界面,谢谢您的使用! n"cout<<"n"cout<<"感谢您的使用,谢谢!按任意键退出游戏.n"system("pause>nul 2>nul"); bool FiveChess:Introduce() /游戏介绍system("cls&quo

10、t;);cout<<"n"cout<<" 简单五子棋 Ver2.1游戏介绍界面 n"cout<<" n"cout<<"单人游戏:玩家和AI(人工智能)对战,AI智商不高。n"cout<<" n"cout<<"双人游戏: 可以两个玩家一起对战,可能不是很方便。n"cout<<" n"cout<<"游戏方法:输入X Y坐标落子,输入双-1悔棋。 n&quo

11、t;cout<<" n"cout<<"特别提示:若游戏中想突然退出,按Ctrl+C即可中断。n"cout<<" n"cout<<"n"cout<<"是否返回?Y-返回 N-退出:"char choice;cin>>choice;if (choice='N'|choice='n')cout<<"感谢您的使用,谢谢!按任意键退出游戏.n" system("

12、pause>nul 2>nul"); return false;elsereturn true;bool FiveChess:Coder() /作者介绍 system("cls");cout<<"n"cout<<" 简单五子棋 Ver2.1作者介绍界面 n"cout<<" n"cout<<"游戏制作:落叶化尘 n"cout<<"联系Q Q : 775904764 n"cout<<&q

13、uot;联系邮箱:lxhdjwg n"cout<<"简单介绍:游戏制作简陋,还请见谅_! n" cout<<"附加说明:作者正在努力学习C+中,嘿嘿 n" cout<<"n"cout<<"是否返回?Y-返回 N-退出:"char choice;cin>>choice;if (choice='N'|choice='n')cout<<"感谢您的使用,谢谢!按任意键退出游戏.n" syst

14、em("pause>nul 2>nul"); return false; elsereturn true;/-选择主菜单-/int FiveChess:MainMenu() system("cls"); /清屏system("title 五子棋游戏 By-落叶化尘 QQ:775904764"); /修改窗口标题system("color 3f"); /定义窗口颜色system ("mode con cols=56 lines=20"); /设置窗口大小cout<<&quo

15、t;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、

16、退出 n"cout<<"n"cout<<"请选择:"int select;cin>>select; return select; /返回用户选择的值/-胜利界面-/void FiveChess:Victory(int Num)system ("mode con cols=56 lines=20"); /设置窗口大小system("cls");if (Num=1)system("color 1f"); cout<<"n"

17、 cout<<" 恭喜玩家1黑棋获得胜利! n"cout<<" n"cout<<"胜利玩家:玩家1 n"cout<<"所属棋子: 黑色 n"cout<<"祝福话语:不错哦_!恭喜您获得了胜利! n"cout<<" n"cout<<"n"else if (Num=2)system("color 2f");cout<<"n"c

18、out<<" 恭喜玩家2白棋获得胜利! n"cout<<" n"cout<<"胜利玩家:玩家2 n"cout<<"所属棋子: 白色 n"cout<<"祝福话语:恭喜您获得了胜利,再接再厉哈_! n"cout<<" n"cout<<"n"else if(Num=3)system("color 3f");cout<<"n"co

19、ut<<" 恭喜您,获得了胜利 n"cout<<" n"cout<<"胜利玩家:自己 n"cout<<"所属棋子: 黑色 n"cout<<"祝福话语:不错哦,打败了AI,恭喜! n"cout<<" n"cout<<"n"else if(Num=4)system("color 5f");cout<<"n"cout<&l

20、t;" 非常遗憾,您输了! n"cout<<" n"cout<<"胜利玩家:AI(电脑) n"cout<<"所属棋子: 白色 n"cout<<"祝福话语:加油吧,下次一定要把AI打败哦! n"cout<<" n"cout<<"n"elsesystem("color 5f");cout<<"n"cout<<" 势均

21、力敌平局 n"cout<<" n"cout<<"胜利玩家:无平局 n"cout<<"所属棋子: 黑色或白色 n"cout<<"祝福话语:棋盘居然被走满了,不错不错! n"cout<<" n"cout<<"n"cout<<"是否返回主界面?Y-返回 N-退出:"char choice;cin>>choice;if (choice='N'|

22、choice='n')cout<<"感谢您的使用,谢谢!按任意键退出游戏.n" system("pause>nul 2>nul"); Continue=false;elseContinue=true;/-悔棋-/void FiveChess:Retract(int &x1,int &y1,int &x2,int &y2,int value15)if (Sum>=1) Sum-;if (x1=-1)&&(y1=-1)&&(x2=-1)&&a

23、mp;(y2=-1)cout<<"当前无法悔棋,棋盘上没有棋子!"system("pause>nul");else if (Renum>=6)cout<<"悔棋超过6次,为了公平,您不能再次悔棋!"system("pause>nul");else Renum+;if (x1=0&&y1=0)valuex1y1=0;Recordx1y1=0;else if (x1=0&&y1=14)valuex1y1=2;Recordx1y1=0;else i

24、f (x1=14&&y1=0)valuex1y1=6;Recordx1y1=0;else if (x1=14&&y1=14)valuex1y1=8;Recordx1y1=0;else if (x1=14&&(y1>0&&y1<14)valuex1y1=7;Recordx1y1=0;else if (y1=14&&(x1>0&&x1<14)valuex1y1=5;Recordx1y1=0;else if (x1=0&&(y1>0&&y1&l

25、t;14)valuex1y1=1;Recordx1y1=0;else if (y1=0&&(x1>0&&x1<14)valuex1y1=3;Recordx1y1=0;else valuex1y1=4;Recordx1y1=0;if (x2=0&&y2=0)valuex2y2=0;Recordx2y2=0;else if (x2=0&&y2=14)valuex2y2=2;Recordx2y2=0;else if (x2=14&&y2=0)valuex2y2=6;Recordx2y2=0;else if (

26、x2=14&&y2=14)valuex2y2=8;Recordx2y2=0;else if (x2=14&&(y2>0&&y2<14)valuex2y2=7;Recordx2y2=0;else if (y2=14&&(x2>0&&x2<14)valuex1y2=5;Recordx2y2=0;else if (x2=0&&(y2>0&&y2<14)valuex2y2=1;Recordx2y2=0;else if (y2=0&&(x2&

27、gt;0&&x2<14)valuex2y2=3;Recordx2y2=0;else valuex2y2=4;Recordx2y2=0;cout<<"每盘最多允许悔棋6次,且最多只能回到上一步!"system("pause>nul");/-判断用户输入的坐标合法性-/int FiveChess:Position(int *x,int *y,int value15) if (cin.fail()|*x<0|*x>=15|*y<0|*y>=15) cin.clear(); cin.sync();

28、return 1; /返回1表示不在范围内或者输入的不是数字 else if (value*x*y=9|value*x*y=10)return 2; /存在棋子else return 0; /返回 0 表示 坐标正常 /-判断该哪个玩家先走-/int FiveChess:NextPlayer(int value15) int i,j;int player1=0,player2=0; for (i=0;i<15;i+)for (j=0;j<15;j+)if (valueij=10)player1+; /统计棋盘上面黑子的个数else if (valueij=9)player2+; /

29、统计棋盘上白子的个数if (player1>player2|player1<player2) return 2; /该玩家2走了(白子)else return 1; /该玩家1走了(黑子)/-判断棋子落在这点,是否胜利或者平局-/int FiveChess:Win(int *x,int *y,int ChessNum,int value15) int i,j,k; /返回-1:平局 返回0:没有谁胜利 返回1:传递过来ChessNum号的那一方胜利 int number=0;Sumchess=0; for (i=-1;i<=1;i+)for (j=-1;j<=1;j+)

30、 /循环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-)

31、/与上面相对的方向的判断 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; /没有棋子就跳出if(number>=4) /如果>=4就说明5连了,返回ChessNum表示传递过来的这个玩家得下子点能构成5个,胜利了 return 1; else number=0; /清空统计 for (i=0;i<15;i+) /棋盘是否满了for(j

32、=0;j<15;j+)if (valueij=9|valueij=10)Sumchess+; /统计黑子和白子的总个数if (Sumchess>=225) return -1; /棋盘满了else return 0; /没胜利也没和棋/-绘制棋盘、落子函数-/void FiveChess:PrintBord(int *x,int *y,int value15,int player) system("cls"); int i,j;if (player=1) value*x*y=9; /黑棋else if (player=2) value*x*y=10; /白棋co

33、ut<<" 0 1 2 3 4 5 6 7 8 9 10 1 2 3 4n" /输出参考坐标for (i=0;i<15;i+) if(i!=0) cout<<" "<<i%10; elsecout<<" 0"for (j=0;j<15;j+) cout<<chvalueij; cout<<"n" /-双人对战-/void FiveChess:Double(int value15) cout<<"您选择了双人对战

34、模式,请按任意键继续!"system("pause>nul 2>nul"); system("cls");system ("mode con cols=43 lines=20"); system("color 3f");system("title 五子棋-双人对战模式");PrintBord(&x,&y,value,-1); /先绘制个空棋盘ExWhile=true; /退出循环用的memset(Record,0,sizeof(Record); /先把记录落

35、子的数组清0while(ExWhile)int play=NextPlayer(value); /先得到该哪个玩家走棋了cout<<"请(玩家"<<play<<")输入坐标用空格隔开:"cin>>x>>y;Check=Position(&x,&y,value); /检测坐标合法性if (Check=0) /坐标没问题 PrintBord(&x,&y,value,play); /再绘制落子棋盘Recordxy=play; /记录这个点,1表示黑子,2表示白子cout

36、<<"玩家"<<play<<"的棋子落在了:X:"<<x<<" Y:"<<y<<"n"Check1=Win(&x,&y,play,Record); /检测是否有一方胜利或者和棋 if (Check1=-1) /和棋 cout<<"游戏棋盘满啦,还没分出胜负,都很厉害哈!n"cout<<"本次游戏结束,按任意键继续." system("pause

37、>nul 2>nul"); Victory(5); /跳转胜利界面ExWhile=false; else if(Check1=1) /当前玩家paly胜利cout<<"恭喜玩家"<<play<<"获得胜利!n"cout<<"本次游戏结束,按任意键继续." system("pause>nul 2>nul");Victory(play); /跳转胜利界面ExWhile=false; else /没谁胜利ExWhile=true; /不退出

38、循环else if(Check=1)cout<<"输入范围错误,请重新输入!n"ExWhile=true;elsecout<<"您输入的坐标已经存在棋子,请重新输入!n"ExWhile=true;/-与AI对战-/void FiveChess:Single(int value15) cout<<"您选择了与AI对战的模式,请按任意键继续!"system("pause>nul 2>nul"); system("cls");system ("

39、mode con cols=43 lines=20"); system("color 3f");system("title 五子棋-与AI的对战模式");PrintBord(&x,&y,value,-1); /先绘制个空棋盘ExWhile=true; /退出循环用的Sum=0,Renum=0; memset(Record,0,sizeof(Record); /先把记录落子的数组清0int x1=-1,y1=-1,x2=-1,y2=-1;while(ExWhile) ExWhile1=true;cout<<"

40、请玩家输入坐标双(-1)为悔棋:" cin>>x>>y;Check=Position(&x,&y,value);if (x=-1)&&(y=-1) /悔棋Retract(x1,y1,x2,y2,value);PrintBord(&x,&y,value,-1); /绘制落子棋盘ExWhile=true; else if (Check=0) /坐标没问题 valuexy=9;Recordxy=1; /记录这个点,1表示黑子,2表示白子x1=x;y1=y; /记录当前坐标悔棋用Sum+;if (Win(&x,&

41、amp;y,1,Record)=0) Robot(&x,&y,&Sum,value); /调用AI函数PrintBord(&x,&y,value,2); /绘制落子棋盘x2=x;y2=y; /记录当前坐标悔棋用cout<<"玩家棋子数:"<<Sum<<" 电脑的棋子落在了X:"<<x<<" Y:"<<y<<"n"/cout<<"玩家坐标:"<<x1&

42、lt;<" "<<y1<<"电脑坐标:"<<x2<<" "<<y2<<endl;if (Win(&x,&y,2,Record)=1)cout<<"非常遗憾,您输了,AI获得了胜利!n"cout<<"本次游戏结束,按任意键继续."system("pause>nul 2>nul");Victory(4); /跳转胜利界面ExWhile=false;else if(Win(&x,&y,2,Record)=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论