五子棋游戏的设计与实现.doc_第1页
五子棋游戏的设计与实现.doc_第2页
五子棋游戏的设计与实现.doc_第3页
五子棋游戏的设计与实现.doc_第4页
五子棋游戏的设计与实现.doc_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

五子棋游戏的设计与实现学生姓名: 学生学号: 院(系): 计算机学院 年级专业: 计算机科学与技术 指导教师: 助教 二一年六月I摘 要现在网上不乏五子棋的游戏程序,其中很多不仅功能全面,算法也很不错。五子棋的设计与实现不经能够让我们把所学到编程知识和算法知识在实践中通过锻炼而得到提高,还能让我们学到很多现今软件的编程方式,软件工程的实现步骤,利于我们以后走入社会,服务于社会。五子棋程序的设计与实现包括程序界面的实现,算法的建模以及实现,附加功能的设计与实现。本此课程设计为了提高难度特意把人工智能函数分离出来独立形成一个类,这样便于以后扩从时建立成DLL(动态链接库),便于算法的追加以及修改完善。为了尽量完善程序,设计时添加了一些附加功能:修改姓名、战绩统计、保存和打开棋局、网络对战、聊天以及查看聊天记录。本程序采用了VC里的MFC(微软基础类)设计,界面直接采用了可视化的所见即所得方式建立。关键词 五子棋,动态链接库,微软基础类,所见即所得2ABSTRACTRenju is no shortage of games online, many of which not only features a comprehensive, operator France is also very good.Design and implementation of Go-Moku not been able to compile we have learned Range of knowledge and knowledge in practice algorithms have been enhanced through training, but also let us Learned many ways the current software programming, software engineering, implementation steps, help me Into society after they serve the community.Backgammon program, including program interface design and implementation of the realization of the modeling algorithm to And the realization of the design and implementation of additional features.The difficulty of this course is designed specifically to enhance the separation of the artificial intelligence function, independent Form a class, it is easy to build into the future when expansion from the DLL (dynamic link library), it On the additional and revised and improved algorithm.To try to improve the program, designed to add some additional features: Modify the name,Record statistics, save and open chess game, online play, chat, and view the recorded chatsRecorded.This procedure uses a VC in the MFC (Microsoft Foundation Classes) design, the interface can be used directly As the establishment of a WYSIWYG way.Key words Gobang, DLL, MFC, WYSIWYG攀枝花学院本科毕业设计(论文)目 录目 录摘 要IABSTRACTII1 绪论12 需求分析23 软件构架33.1软件构架图34 详细设计44.1 棋盘类-Ctable44.1.1成员变量说明44.1.2成员函数说明54.2 游戏类-CGame94.2.1成员变量说明94.2.2成员函数说明94.3 人工智能类-CIA104.3.1成员变量说明104.3.2成员函数说明104.3.3人工智能算法详细说明124.4 建立游戏类-CServer264.4.1成员函数说明264.5 加入游戏类-CClient274.5.1成员变量说明274.5.2成员函数说明284.6 聊天类-CChat304.6.1成员变量说明304.6.2成员函数说明304.7 聊天记录类-CChatRecord354.8 更改姓名类-CName354.8.1成员函数说明354.8.2成员函数说明354.9 战绩统计类-CStat364.9.1成员函数说明364.10 主窗口设计CFiveDlg374.10.1触发机制374.10.2触发函数384.10.3成员函数说明395 消息机制455.1消息机制的架构455.2各种消息说明455.2.1落子消息MSG_PUTSTEP465.2.2悔棋消息MSG_BACK465.2.3同意悔棋消息MSG_AGREEBACK465.2.4拒绝悔棋消息MSG_REFUSEBACK465.2.5和棋消息MSG_DRAW475.2.6同意和棋消息MSG_AGREEDRAW475.2.7拒绝和棋消息MSG_REFUSEDRAW475.2.8认输消息MSG_GIVEUP485.2.9聊天消息MSG_CHAT485.2.10对方信息消息MSG_INFORMATION495.2.11再次开局消息MSG_PLAYAGAIN495.2.12同意再次开局消息MSG_AGREEAGAIN49结 论50参考文献51致 谢52攀枝花学院课程设计(论文)消息机制1 绪论1.1 课题背景近来随着计算机的快速发展,各种棋类游戏被纷纷请进了电脑,使得那些喜爱下棋,又常常苦于没有对手的棋迷们能随时过足棋瘾。而且这类软件个个水平颇高,大有与人脑分庭抗礼之势。其中战胜过国际象棋世界冠军-卡斯帕罗夫的“深蓝”便是最具说服力的代表。其它像围棋的“手淡”、象棋的“将族”等也以其优秀的人工智能深受棋迷喜爱;而我们今天将向大家介绍的是五子棋的算法。五子棋是我们中国发明的,距离现在已经有四千多年的历史了,据说比围棋的历史还要长,在我国古代的一个朝代南北朝时期传到了与我国接壤的朝鲜,后来又传到了我国一衣带水的近邻日本。日本把五子棋的规则进行了改进,后来五子棋就风靡了欧洲和美洲,走向了全世界,从将来的走向来看,五子棋的规则还在继续完善,相信五子棋将会获得更大的发展。1988年8月8日五子棋的世界组织国际连珠联盟在北欧的瑞典成立。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”,它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。1.2开发环境及运行环境1.2.1开发环境Intel Pentium D 2.66GHz,2G内存,500G硬盘Microsoft Windows XP ProfessionalMicrosoft Visual C+ 20081.2.2运行环境Intel Pentium 3及以上处理器,64M以上内存,4G以上硬盘Microsoft Windows 9X/NT/XP/Vista/Win7操作系统800*600或以上的屏幕分辨率42 需求分析由于是毕业课程设计,不同于简单的算法研究,所以在功能方面需要尽量完善。所以基本需求是:1 程序需要有完善的32位程序界面,需要达到用鼠标进行下子操作的程度,而不是在DOS中通过划线函数而形成的程序棋盘界面,然后五子棋的基本功能,悔棋、和棋、投降。2 在功能方面基本上需要能进行单机和网络两种游戏方式,单机即为人机对弈模式,网络则为人人对弈模式。3 在单机模式下需要能够保存棋局,以便以后能通过打开棋局继续未结束的游戏。4 由于需要进行网络对战,所以需要有建立和加入还有断开网络的功能。5 为了能实时交换信息,网络功能里不仅需要有游戏所需的传送对战信息外,还加上聊天功能。6 由于有聊天功能,所以加上一个查看聊天信息的功能。7 棋盘能够显示步骤,能更改玩家姓名,能显示迄今为止的战绩统计。8 基本的关于以及帮助信息。3 软件构架3.1软件构架图软件构架如下图3.1: :表示交互 :表示调用建立游戏类加入游戏类聊天类人工智能类双人游戏类单人游戏类战绩统计类更改姓名类查看聊天记录类棋盘类主界面用户打开帮助文档关于类游戏类图3.1 软件架构攀枝花学院课程设计(论文)消息机制4 详细设计4.1 棋盘类-Ctable4.1.1成员变量说明 棋子图像m_iml:用于载入和调用棋子图片。 玩家棋子颜色m_color:用于指向玩家所选择的棋子的颜色。 聊天消息数ChatNum:用于网络聊天的计算聊天消息的块长度,以便能把长消息传送给对方。 字符串SView、m_Myname、m_EnemynameSView用于存放将要显示的对方消息,m_Myname、m_Enemyname分别用于存放自己和敌人姓名。 游戏模式指针m_pGame这个CGame类的对象指针是CTable类的核心内容。它所指向的对象实体决定了CTable在执行一件事情时候的不同行为,具体的内容请参见“游戏模式”一节。 网络连接标志m_bConnected用来表示当前网络连接的情况,在网络对弈游戏模式下客户端连接服务器的时候用来判断是否连接成功;事实上,它也是区分当前游戏模式的唯一标志。 棋盘等待标志m_bWait与m_bOldWait由于在玩家落子后需要等待对方落子,m_bWait标志就用来标识棋盘的等待状态。当m_bWait为TRUE时,是不允许玩家落子的。在网络对弈模式下,玩家之间需要互相发送诸如悔棋、和棋这一类的请求消息,在发送请求后等待对方回应时,也是不允许落子的,所以需要将m_bWait标志置为TRUE。在收到对方回应后,需要恢复原有的棋盘等待状态,所以需要另外一个变量在发送请求之前保存棋盘的等待状态做恢复之用,也就是m_bOldWait。等待标志的设置,由成员函数SetWait和RestoreWait完成。 网络套接字m_sock和m_conn在网络对弈游戏模式下,需要用到这两个套接字对象。其中m_sock对象用于做服务器时的监听之用,m_conn用于网络连接的传输。 棋盘数据m_data这是一个15*15的二位数组,用来保存当前棋盘的落子数据。其中对于每个成员来说,0表示落黑子,1表示落白子,-1表示无子。 布尔变量ComputerFrist、PlayerFrist、FlagOverComputerFrist和PlayerFrist用于保存棋局时确定谁先手,以便打开棋局时能准确还原棋局。FlagOver用于确定消息传送时是否被传完的结束标志,如果结束了则看聊天窗口状态是否为打开,如果是则则直接显示否则写入临时聊天文件。 整型变量ComputerStepNum、PlayerStepNumComputerStepNum和PlayerStepNum用于计算玩家和敌人的步骤数,然后在主窗口的IDC_STEP_ME,IDC_STEP_ENEMY静态框中分别予以显示。 SaveStepNum用于保存和打开棋局,其数据结构为:typedef struct int ComputerIA;BOOL WhoFrist;Ctep Step225;SaveStepStruct;ComputerIA为电脑智能等级WhoFrist为谁先手Step225为步骤详情,其结构为:typedef struct m_Ctepint x;int y;int color;Ctep;x为横坐标y为纵坐标color为棋子颜色。 TCHAR变量View用于网络传送姓名以及聊天信息。4.1.2成员函数说明 CTable包含绝大多数初始化:1) 初始化玩家姓名。2) 初始化图像列表。3) 载入黑、白棋子掩码位图。4) 初始化电脑智能等级。5) 初始化游戏模式。6) 初始化双方步数。7) 初始化谁先手。8) 初始化步骤保存。9) 初始化聊天消息块长度。 CTable包含一些显示方面的初始化,从程序配置文件中读入玩家姓名,读入战绩统计,清空棋盘。 Draw这无疑是很重要的一个函数,它根据参数给定的坐标和颜色绘制棋子。绘制的详细过程如下:1) 将给定的棋盘坐标换算为绘图的像素坐标。2) 根据坐标绘制棋子位图。3) 如果先前曾下过棋子,则利用R2_NOTXORPEN将上一个绘制棋子上的最后落子指示矩形擦除。4) 在刚绘制完成的棋子四周绘制最后落子指示矩形。 SetMenuState设置菜单状态,主要用于网络连接,主要是把单机模式下的功能给屏蔽。 SetWait设置等待状态。 RestoreWait还原等待状态。 SetGameMode这个函数通过传入的游戏模式参数对m_pGame指针进行了初始化,代码如下:void CTable:SetGameMode( int nGameMode ) if ( 1 = nGameMode ) m_pGame = new COneGame( this ); else m_pGame = new CTwoGame( this ); m_pGame-Init();这之后,就可以利用OO的继承和多态特点8来使m_pGame指针使用相同的调用来完成不同的工作了,事实上,COneGame:Init和CTwoGame:Init都是不同的。 Clear在每一局游戏开始的时候都需要调用这个函数将棋盘清空,也就是棋盘的初始化工作。在这个函数中,主要发生了这么几件事情:1) 将m_data中每一个落子位都置为无子状态(-1)。2) 按照传入的参数设置棋盘等待标志m_bWait,以供先、后手的不同情况之用。3) 使用delete将m_pGame指针所指向的原有游戏模式对象从堆上删除。 SetColor、GetColor设置玩家棋子颜色,获取玩家棋子颜色。 Win这是游戏中一个极其重要的算法,用来判断当前棋盘的形势是哪一方获胜。其详细内容请参见“主要算法”一节。 SetData设置棋盘数据,并绘制棋子,其中包括:1) 把棋子存入全局棋盘列表。2) 把步骤存入SaveStep。3) 修改显示的步数。4) 调用画棋子函数。 Accept、Connect、Receive本程序的套接字派生自MFC的CAsyncSocket类6,CTable的这三个成员函数就分别提供了对套接字7回调事件OnAccept、OnConnect、OnReceive的实际处理,其中尤以Receive成员函数重要,它之中包含了对所有网络消息(参见“消息机制”一节)的分发处理。 OnPaint每当WM_PAINT消息触发时,都需要对棋盘进行重绘。OnPaint作为响应绘制消息的消息处理函数使用了双缓冲技术,减少了多次绘图可能导致的图像闪烁问题。这个函数主要完成了以下工作:1) 装载棋盘位图并进行绘制。2) 根据棋盘数据绘制棋子。3) 绘制最后落子指示矩形。 Startplay该函数相当于一个初始化的汇总,根据不同的情况,给以不同的初始化方式。如果为网络连接状态,着设置按钮状态后发送再来一次的请求。否则判断现在的先手状态,如果为电脑先手,则设置电脑的棋子为黑子,并初始化单机游戏开始下棋,否则设置玩家为先手,初始化单机游戏,等待玩家落子。 Back、DrawGame、GiveUp调用CGame里的悔棋函数,由于先前就初始化了CGame的状态,此时调用可根据实际情况调用CGame里单人或双人游戏下的悔棋操作。和棋与认输操作,由于和棋和认输按钮只在网络对战时才生效,所以这里只写了网络对战时的操作情况,即发送和棋和认输消息。 Over在对方落子之后,仍然需要做一些判断工作,这些工作与OnLButtonUp中的类似,在此不再赘述。 InitSaveStep初始化保存步骤结构函数的数据。 Open、Save打开棋局,打开先前保存的*.wzq文件,并直接把这个文件的数据赋值给数据结构TempOpenStep,读入完成后,把TempOpenStep里的数据进行判断之后根据判断初始化棋盘,之后再把TempOpenStep里的棋子步骤写入棋盘,并设置等待状态为False,让玩家可以落子。保存棋局,把先前保存入数据结构SaveStep里的数据加上现在的IA情况以及谁先手的情况一起写入文件。 SaveChatRecord保存聊天记录,没发送或接受一句聊天记录都把它加上发送消息的玩家的姓名以及时间,一起写入文件末尾。 OnLButtonUp作为棋盘唯一响应的左键消息,也需要做不少的工作:1) 如果棋盘等待标志m_bWait为TRUE,则直接发出警告声音并返回,即禁止落子。2) 如果点击时的鼠标坐标在合法坐标(0, 0)(14, 14)之外,亦禁止落子。3) 如果走的步数大于1步,方才允许悔棋。4) 进行胜利判断,如胜利则修改UI状态并增加胜利数的统计。5) 如未胜利,则向对方发送已经落子的消息。6) 落子完毕,将m_bWait标志置为TRUE,开始等待对方回应。4.2 游戏类-CGameCGame类采用构造函数的方法,当CTable调用它时同时把CTable类指针传给CGame,以便获得现在的实时数据,同时CGame继承出两个派生类:COneGame,CTowGame,他们分别对不同的游戏模式进行控制与操作。4.2.1成员变量说明 *m_pTable;以类CTable定义的指针,指向CTable,以便调用里面的函数,以便获得实时的期盘信息。 *m_pIA;以类CIA定义的指针,指向CIA,以便调用里面的算法函数。 list m_StepList;C+自带的List结构函数,用于实现游戏步骤。 IfStart;布尔值,用于判断游戏是否刚刚开始,如果是则第一步下在(7,7)位置,如果玩家先走且下在了(7,7)电脑则下在(8,8)位置,同时把IfStart设为false。 m_step;结构函数,用于保存棋子的坐标以及颜色信息。4.2.2成员函数说明 COneGame:Init()单人游戏的初始化包括以下信息:1) 设置网络状态为false。2) 设置棋局是否结束为false。3) 设置敌人姓名为计算机。4) 如果电脑先手则抢占(7,7)位置,并设置棋局是否刚刚开始的状态为false。5) 否则如果玩家先手则设置棋局是否刚刚开始的状态为true。然后初始化m_pIA指针指向CIA类。 COneGame:SendStep()单人游戏的发送步骤,其实此继承函数是用于为电脑计算出最优位置,其主要算法如下:如果是电脑先走则第一步下在(7,7)位置,如果玩家先走且下在了(7,7)电脑则下在(8,8)位置,同时把IfStart设为false。如果已经不是第一步了则调用人工智能类计算出最优步骤并赋值给结构函数m_step,并调用Receive函数以获取对方落子位置。 COneGame:ReceiveMsg()由于不是网络连接,这里直接获取m_step的值,赋值给消息接受结构指针变量pMsg。 COneGame:Back()单机游戏的悔棋操作,由于是与电脑下棋,不需要设置对方是否同意悔棋,这里直接悔棋,其中算法包括:1) 悔电脑的第一步棋,同时修改电脑的棋子步骤数减一。2) 悔玩家的第二步棋,同时修改玩家的棋子步骤数减一。3) 为了让显示正确,这里调用一下Invalidate系统函数,相当于电脑的刷新功能。4) 为了保证程序的正确运行,这里强制只能电脑步骤大于零时才能悔棋。 CTwoGame:Init()双人对战的初始化,由于网络对战的初始化把所需要的都已经完成了,这里不进行任何操作。 CTwoGame:SendStep()这里首先赋值给信息结构函数指针msg后马上调用CAsyncSocket里的Send功能把棋子步骤发送给对战方。 CTwoGame:ReceiveMsg()调用CAsyncSocket里的Receive函数,并把值赋给信息结构函数指针pMsg,同时判断如果网络接受错误,则弹出提示信息。 CTwoGame:Back()双人游戏的悔棋操作,首先使棋盘和按钮失效,然后发送悔棋消息。4.3 人工智能类-CIA4.3.1成员变量说明 m_iaTable以类CTable定义的指针,指向CTable,以便调用里面的函数,以便获得实时的期盘信息。 BestStep以Ctep定义的结构变量,用于存储经过计算选择出的最高分数的位置。4.3.2成员函数说明 GetTable用于复制期盼数据,以免以后对期盼数据操作时,因未知错误改变了棋盘数据,此功能主要是为了保证数据的完整性。GetTableQX获得棋表数据下的棋型信息,其主要算法如下:循环遍历棋表,如果发现空位,则遍历此位置的上下左右撇拉八个方向的棋型数据,并把所得的信息分别存入数组m_ComputerQQX15154,m_PlayerQQX15154,用于后面判分。遍历方向如下图:图4.1GiveScore给m_ComputerQQX15154里的数据进行判分。GivePlayScore给m_PlayerQQX15154里的数据进行判分。GetBestStep获取电脑的最优位置。InitTableSC初始化棋表分数,把棋表里的分数全部设为0。ClearQX清空棋型表,把棋型表里的的值全部初始化为0.IAChoose算法选择:包括初级人工智能、中级人工智能、高级人工智能。其详细算法如下:void CIA:IAChoose()switch(m_iaTable-ComputerIA)case 1: CJIA ();break;case 2: ZJIA();break;case 3: GJIA();break;CJIA,ZJIA,GJIA初级人工智能、中级人工智能、高级人工智能的详细实现。由于时间以及能力的限制,现在只实现了初级人工智能,后面的中级人工智能、高级人工智能,用于以后的功能扩充。4.3.3人工智能算法详细说明首先得为整个棋盘建立一张表格用以记录棋子信息,我们使用一个15*15的二维数组 TempTable1515 (15*15是五子棋棋盘的大小),数组的每一个元素对应棋盘上的一个交叉点,用-1表示空位、0代表黑子、1代表白子;这张表也是今后分析的基础。在此之后还要为电脑和玩家双方分别建立棋型表m_ComputerQX15154和m_PlayerQX15154,用来存放棋型数据,就是刚才所说的重要程度,比如用20代表“冲四”的点,用15代表“活三”的点,那么在计算重要性时,就可以根据2015得出前者比后者重要,下子时电脑便会自动选择“冲四”的点。那为什么棋型表要使用三维数组呢?因为棋盘上的每一个点都可以与横、竖、左斜、右斜四个方向的棋子构成不同的棋型,所以一个点总共有4个记录;这样做的另一个好处是可以轻易判断出复合棋型,例如:如果同一点上有2个15就是双三、有一个15和一个20就是四三。详细步骤:初始化:1) 首先,建立盘面数组TempTable1515、对战双方的棋型表m_ComputerQX15154和m_PlayerQX15154。2) 同时建立ScoreTableComputer1515,ScoreTablePlayer1515数组分别用于存放电脑和玩家的的棋表分数。3) 再建立ComputerStep2,PlayerStep2,分别用于存放循环时计算出的最高分数位置。复制棋型表到TempTable:GetTable(TempTable);void CIA:GetTable(int Table1515)for(int i=0;i15;i+)for(int j=0;jm_dataij;获取现在双方的棋表:GetTableQX(m_ComputerQX,m_PlayerQX,TempTable);/用于获双方在一张棋盘表里的棋型表/void CIA:GetTableQX(int m_ComputerQQX15154,int m_PlayerQQX15154,int Table1515)int flagL,flagR;int CountBlankL,CountBlankR;int CountL,CountR;int m,n;int Ccolor,Pcolor;Ccolor = 1-m_iaTable-GetColor();Pcolor = m_iaTable-GetColor();/清空棋型表(初始化棋型表)ClearQX(m_ComputerQQX,m_PlayerQQX);for(int i=0;i15;i+)for(int j=0;j15;j+)/如果是空位if(-1 = Tableij)/记录Computer横向/CountL = 0;CountR = 0;CountBlankL= 0;CountBlankR= 0;flagL = 0;flagR = 0;for(m=1;m=0)if( Ccolor = Tablei-mj)if(0=CountBlankL)CountL+; else flagL=1;else if(-1 = Tablei-mj)if(0=flagL)CountBlankL+;else break; for(n=1;n6;n+)/向右边查找if( (i+n)15 )if(Ccolor = Tablei+nj)if(0=CountBlankR)CountR+;else flagR=1;else if(-1 = Tablei+nj)if(0=flagR)CountBlankR+;else break;/把左边值全部*10加以区别m_ComputerQQXij0=CountBlankL * 10000 + CountBlankR * 100 + CountL * 10 + CountR;/记录Player横向/初始化四个值CountL = 0;CountR = 0;CountBlankL= 0;CountBlankR= 0;flagL = 0;flagR = 0;for(m=1;m=0)if( Pcolor = Tablei-mj)if(0=CountBlankL)CountL+;else flagL=1;else if(-1 = Tablei-mj)if(0=flagL)CountBlankL+;else break; for(n=1;n6;n+)/向右边查找if( (i+n)15 )if(Pcolor = Tablei+nj)if(0=CountBlankR)CountR+;else flagR=1;else if(-1 = Tablei+nj)if(0=flagR)CountBlankR+;else break;m_PlayerQQXij0 = CountBlankL * 10000 + CountBlankR * 100 + CountL * 10 + CountR;/记录Computer纵向/初始化四个值CountL = 0;CountR = 0;CountBlankL= 0;CountBlankR= 0;flagL = 0;flagR = 0;for(m=1;m=0)if( Ccolor = Tableij-m)if(0=CountBlankL)CountL+;else flagL=1;else if(-1 = Tableij-m)if(0=flagL)CountBlankL+;else break; for(n=1;n6;n+)/向下边查找if( (j+n)15 )if( Ccolor = Tableij+n)if(0=CountBlankR)CountR+;else flagR=1;else if(-1 = Tableij+n)if(0=flagR)CountBlankR+;else break;m_ComputerQQXij1 = CountBlankL * 10000 + CountBlankR * 100 + CountL * 10 + CountR;/记录Player纵向/初始化四个值CountL = 0;CountR = 0;CountBlankL= 0;CountBlankR= 0;flagL = 0;flagR = 0;for(int m=1;m=0)if( Pcolor = Tableij-m)if(0=CountBlankL)CountL+;else flagL=1;else if(-1 = Tableij-m)if(0=flagL)CountBlankL+;else break; for(int n=1;n6;n+)/向下边查找if( (j+n)15 )if( Pcolor = Tableij+n)if(0=CountBlankR)CountR+;else flagR=1;else if(-1 = Tableij+n)if(0=flagR)CountBlankR+;else break;m_PlayerQQXij1 = CountBlankL * 10000 + CountBlankR * 100 + CountL * 10 + CountR;/记录Computer/向/初始化四个值CountL = 0;CountR = 0;CountBlankL= 0;CountBlankR= 0;flagL = 0;flagR = 0;for(int m=1;m6;m+)/向上边查找if( (i+m)=0 ) if( Ccolor = Tablei+mj-m)if(0=CountBlankL)CountL+;else flagL=1;else if(-1 = Tablei+mj-m)if(0=flagL)CountBlankL+;else break; for(int n=1;n=0 & (j+n)15 )if( Ccolor = Tablei-nj+n)if(0=CountBlankR)CountR+;else flagR=1;else if(-1 = Tablei-nj+n)if(0=flagR)CountBlankR+;else break;m_ComputerQQXij2 = CountBlankL * 10000 + CountBlankR * 100 + CountL * 10 + CountR;/记录Player/向/初始化四个值CountL = 0;CountR = 0;CountBlankL= 0;CountBlankR= 0;flagL = 0;flagR = 0;for(int m=1;m6;m+)/向上边查找if( (i+m)=0 ) if( Pcolor = Tablei+mj-m)if(0=CountBlankL)CountL+;else flagL=1;else if(-1 = Tablei+mj-m)if(0=flagL)CountBlankL+;

温馨提示

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

评论

0/150

提交评论