五子棋对战实验报告
- 格式:docx
- 大小:792.52 KB
- 文档页数:15
实验报告实验一五子棋游戏北方工业大学 2013级计算机技术米鹏一、实验原理及方法五子棋游戏开发借用Visual Studio 2012软件开发平台,选用C#语言进行编写。
整体程序主要分为三部分:界面操作部分、AI逻辑部分和棋子定点分析部分。
1、界面操作部分界面操作部分代码主要针对图像呈现、对应矩阵存储、下棋过程控制等可见的操作环节进编写。
同时负责整个程序的初始化工作。
图像呈现采用C#中Graphics进行绘制。
棋盘被划分为15行15列,每个划分出的小方格均为30*30的正方形,棋盘可操作的范围规定在(20,20)、(460,460)两点的确定的正方形区域内。
通过鼠标左击来确定下子地点。
程序会根据鼠标鼠标点击的位置进行计算,计算得到时对应矩阵的行列,之后再改变对应矩阵的内容后,在通过行列值乘以小方格边长计算得到在显示区域中的具体位置,再稍加变动后画到显示区域中。
以X点坐标为例,下面是计算X(Column)的流程图:在对应矩阵存储方面,后面AI逻辑和棋子分析所用到的矩阵都是来源这里。
同时AI 逻辑和棋子分析不能去修改对应矩阵内容。
图像呈现点的位置、重绘的根据都是来源这里。
在下棋过程控制方面采用信号亮的机制,当操作者下过后,根据信号AI会立即计算将要下点的位置同时改变信号亮变量。
当AI下过棋子后,由于信号亮的的限制就等待操作者去下棋,同时改变信号亮变量内容。
AI和操作者的所有下子、修改矩阵、显示棋子的过程都是统一的。
在每一盘游戏开始时程序会对一些重要的变量进行初始化这里包括矩阵、信号亮、第一步棋子颜色、呈现图像等内容进行初始化。
同时AI会在棋盘中央下第一子。
2、AI逻辑部分AI逻辑部分算是整个程序策略的灵魂。
其中的一些关键性判别的前后关系将影响AI 的下棋的结果。
同时加大和降低AI的难度也是这里。
下面是我设计的策略过程:从下棋者的考虑角度进行考虑,尽可能保证每一次下子都是有必要的、都是在情理当中的。
我所设计的策略并不是完整,漏洞在与没有考虑三棋子连续的情况。
一、设计内容与设计要求1.设计内容:在手机屏幕上设计一个五子棋游戏,屏幕有棋盘,可人与人对奕,人与机对弈。
双方交替下棋,如果某方在水平、垂直或45度方向有连续的5个棋子,就算胜利,结束比赛,提示游戏得到的分数。
2.设计要求:(1)论述课题的性质、内容以及本次课程实训的目的和要求。
(2)说明Android系统对计算机软、硬件环境的基本要求,对Android应用程序作简要的说明。
(3)界面设计和游戏操作设计:界面要求美观和友好(可使用图片资源文件),使用手机键盘上的2个方向键控制方向,按照手机上的操作习惯进行设计。
)游戏核心数据结构设计4(.主要是界面控制信息:五子棋的位置信息,双方已经下棋子的具体位置。
逻辑控制信息主要双方交替下棋。
下棋子和处理, 棋子只能下到棋盘的指定位置(棋盘的格子上)并不能下到已经有棋子位置,(5)胜负判断:双方每个已下点的3个方向判断它们是否构成五连、五连就胜利。
(6)编写代码、上机输入、调试、修改并运行通过。
(7)编写实训说明书。
说明书是总结性的技术文件,应全面叙述整个设计的内容及过程(可参考上述6条),发现的问题及解决方法等。
(8)源代码和参考书目应作为说明书的附录。
(9)说明书应采用A4纸张,文字说明不少于4000字。
说明书中应包括系统结构示意图。
进度安排二、第十五周星期一上午8:30——11:30,星期二下午2:30——5:00,星期三上午8:30——11:30,星期四上午8:30——11:30,第十六周星期一一天,星期二一天星期三上午8:30——11:30,星期四上午8:30——11:30,目录一、课程实训的目的及要求-------------------------------------------6二、游戏设计思路---------------------------------------------------7三、主要功能实现---------------------------------------------------9四、程序调试-------------------------------------------------------12五、程序源代码-----------------------------------------------------13六、总结-----------------------------------------------------------21七、课程设计评分表-------------------------------------------------22一、课程实训的目的及要求本次课程实训是专门针对大四学生的一次项目实践,当前3G移动互联网发展迅速,而Android系统已经成为当前时期移动终端设备的主流操作系统之一,在这样的条件下计算机与通信学院组织这次基于Android系统的手机项目实战,紧跟当前时代电子通信业的发展,让学生学习当前主流的新技术,扩展学生们的视野,为即将大学毕业的我们进入社会求职开辟了一条新道路。
人工智能基础(第2版)
实验四:博弈问题—五子棋实验
1.提交期限和方法
2.实验目的
熟悉和掌握博弈搜索算法的原理、实质和过程。
3.实验任务
1. 制作类似于如图所示五子棋系统实验程序。
2. 用你所熟悉的程序语言实现,可以B/S实现,也可以C/S实现。
4.提交要求
1、本次实验为个人任务,需独立完成,以纸质和电子档的形式把实验报告提交给学习
委员,再由学习委员在规定期限内提交给任课老师。
2、要求把所做的程序的演示图附加到实验报告上,代码不需要添加到实验报告上。
3、撰写实验报告
实验报告具体内容如下:
实验题目、实验目的、实验原理、实验条件、实验内容、实验步骤、程序代码、个人实验小结。
4、未按时提交实验报告者,每迟交一天扣1分,扣完为止。
经辅导员同意并签字的事病假时间不计入迟交范围。
凡被发现实验报告有抄袭者,本次成绩以零分记。
五子棋程序实习报告一、实习背景及目的近期,我通过五子棋程序的实习,深入了解了五子棋的规则和算法,并成功编写了一个五子棋程序。
本次实习的目的是为了提高我的编程能力和逻辑思维能力,同时了解人工智能在棋类游戏中的应用。
二、五子棋规则及算法分析五子棋是一种两人对弈的棋类游戏,游戏的目标是在棋盘上形成连续的五个棋子。
棋盘通常为15×15的网格,每个玩家轮流在空格中放置自己的棋子。
五子棋的算法主要包括两种:一种是基于搜索的算法,如极大极小值搜索和启发式搜索;另一种是基于机器学习的算法,如蒙特卡洛树搜索和深度学习。
三、程序设计及实现在本次实习中,我选择了基于极大极小值搜索的五子棋算法,并使用Python语言进行程序设计。
程序的主要功能包括棋盘的显示、玩家的输入和计算机的智能下棋。
首先,我使用类来表示棋盘,每个棋盘对象包含一个15×15的二维数组,用于存储棋子的位置。
同时,我还定义了一个常量类,用于存储棋子的颜色和空格的表示。
接下来,我实现了一个玩家输入的类,玩家可以通过该类来选择下棋的位置。
为了简化输入过程,我使用了一个简单的文本界面,玩家只需输入坐标即可。
最后,我实现了一个计算机下棋的类,该类使用了极大极小值搜索算法。
具体实现过程如下:1. 将棋盘划分为多个可能的获胜区域,例如横线、竖线和斜线。
2. 对于每个获胜区域,计算计算机和玩家在该区域获胜的概率。
3. 使用极大极小值搜索算法,选择最优的落子位置。
四、实习心得通过本次五子棋程序的实习,我对五子棋的规则和算法有了更深入的了解,同时也提高了我的编程能力和逻辑思维能力。
在程序设计过程中,我遇到了很多问题,如棋盘的表示、搜索算法的实现等,通过查阅资料和不断调试,我最终成功解决了这些问题。
此外,通过本次实习,我也了解到了人工智能在棋类游戏中的应用。
目前,深度学习等算法在棋类游戏中取得了显著的成果,例如AlphaGo在围棋领域的突破。
未来,我相信人工智能将在更多棋类游戏中发挥重要作用。
五子棋人机博弈实验报告目录一(课程设计目的............................................. 2 二(课程设计要求............................................. 2 三(课程设计内容............................................. 2 四(课程设计思想............................................. 2 五(系统实现 (2)设计平台 (2)数据结构设计 (3)程序流程图设计 (3)主要算法设计 (4)程序调试及运行结果.............................. 4 六(课程设计总结............................................. 5 七(参考资料................................................... 6 八(附录:五子棋博弈算法源代码 (7)1一( 课程设计目的通过上学期学习的《人工智能》学科,运用推理技术、搜索方法和决策规划和博弈树设计五子棋人机博弈系统,以此进一步深化对理论知识技术的了解,培养学生编程能力以及实践水平。
二(课程设计要求通过本次课程设计要求学生掌握以下内容:1.深入了解博弈树和alpha-beta剪枝算法。
2.设计出适合五子棋算法的启发式函数。
3.熟练掌握启发式的搜索方法。
三(课程设计内容本系统实现的是五子棋博弈算法,运用java语言实现了图形用户界面,方便用户使用。
算法采用了博弈算法和启发式函数进行搜索,人机对弈可自动判断输赢,结束后可重新开局。
四(课程设计思想本系统实现的是五子棋博弈算法,为了方便用户的使用,采用的是java图形用户界面技术。
为了记录棋盘的每一个下棋点,定义数组array[19][19]。
题目:在哪里?对五子棋游戏的保存功能和加载功能进行编写。
要求游戏保存后重新加载时能恢复到保存前的情况,并继续下棋和悔棋。
所需的保存数据:下子顺序、智能等级、下棋模式、棋型数据、下棋的历史数据、表示当前已经下了多少子的计数器。
这是题目吗?中文摘要:本次实验主要是设计“保存”与“加载”部分程序。
程序中要实现游戏的保存与加载,主要是通过文件流的运用。
编写保存语句,先定义、打开一个文件,用输出文件流,open函数打开文件,首先要判断该文件是否能正常打开,然后利用twzq.变量语句,把要保存的数据输出到文件中,其中输出棋型数据和历史数据时,则须运用到循环语句来实现,保存完毕后要用close 函数关闭文件。
加载则是保存的相反语句,运用输入文件流,getline函数从文件中读入数据。
摘要是实验报告的内容提要,只需简明、确切地记述实验报告重要内容,包括实验的目的、方法、结果和结论。
使人不阅读全文,就能获得必要的信息。
关键词:If_saveFile.open(ls_fileName); If_saveFile<< Twzq.*** If_saveFile.close();AfxMessageBox("***") return If_saveFile.getline>>前言?软件的开发过程1、程序源代码:void CMyDlg::OnSave(){CString ls_fileName;/*显示保存文件对话框CFileDialog(BOOL bOpenFileDialog, TRUE for FileOpen, FALSE for FileSaveAs LPCTSTR lpszDefExt = NULL, 默认扩展名LPCTSTR lpszFileName = NULL, 默认文件名称DWORD dwFlags = OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,打开方式LPCTSTR lpszFilter = NULL, 可供选择的文件类型和相应的扩展名,文件类型之间用|分割,结尾用||分割CWnd* pParentWnd = NULL);*/CFileDialog lcf_open(false,"wzq",NULL,OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,"wzq files(*.wzq)||",NULL);if (lcf_open.DoModal()==IDOK){/*数据保存在文件中,读写文件需要使用到输出文件流ofstream,使用的相关操作为: open函数打开文件供读写,写程序时需要检查文件是否能正常打开close函数写完关闭文件>>操作文件流输出如果需要显示提示信息,则使用AfxMessageBox函数*/ls_fileName = lcf_open.GetPathName();ofstream If_saveFile;If_saveFile.open(ls_fileName);if(!If_saveFile){AfxMessageBox("文件不能正常打开");return;}If_saveFile<<twzq.nturn<<endl;If_saveFile<<twzq.AItype<<endl;If_saveFile<<twzq.Model<<endl;int i,j,k;for(i=1;i<=15;i++){for(j=1;j<=15;j++)If_saveFile<<twzq.map[i][j]<<endl;}If_saveFile<<twzq.nowd2;for(k=1;k<= twzq.nowd2;k++){If_saveFile<<twzq.wzs[k].used<<endl;If_saveFile<<twzq.wzs[k].color<<endl;If_saveFile<<twzq.wzs[k].ix<<endl;If_saveFile<<twzq.wzs[k].iy<<endl;}If_saveFile.close();AfxMessageBox("保存成功!");}}/*按下"加载"这个按钮时,需要写的数据包括int nturn; //表示当前下子的顺序(只有在使用模式为2(两人对弈时才有效)//1-白子下,2-黑子下,0-不知道谁下)int AItype; //智能等级:0低预测6步1中预测10步2高预测16步int Model; //模式0人->机1机->人2对翌char map[15][15]; //储存棋盘地图(0-某点空,1-白子,2-黑子)//表示棋盘上某一个交叉点是否已经下过子//以下参数用于保存下棋历史记录int nowd2; //表示当前已经下了多少子的计数器wzsave wzs[225]; //对应棋盘的15行*15列这些数据全部可以通过twzq.****的格式来读写,如:读下子顺序的这个变量,程序可以这项写:twzq.nturn=1;*/void CMyDlg::OnLoad(){CString ls_fileName;/*显示打开文件对话框CFileDialog(BOOL bOpenFileDialog, TRUE for FileOpen, FALSE for FileSaveAs LPCTSTR lpszDefExt = NULL, 默认扩展名LPCTSTR lpszFileName = NULL, 默认文件名称DWORD dwFlags = OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,打开方式LPCTSTR lpszFilter = NULL, 可供选择的文件类型和相应的扩展名,文件类型之间用|分割,结尾用||分割CWnd* pParentWnd = NULL);*/CFileDialog lcf_open(true,"wzq",NULL,OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,"wzq files(*.wzq)||",NULL);if (lcf_open.DoModal()==IDOK){//取文件名称ls_fileName = lcf_open.GetPathName();//开始一个新游戏twzq.NewGame();/*从保存的文件中读数据,读文件需要使用到输入文件流ifstream,使用的相关操作为:open函数打开文件供读写,写程序时需要检查文件是否能正常打开close函数写完关闭文件getline函数从文件中读入一行数据>>操作从文件中读数据如果需要显示提示信息,则使用AfxMessageBox函数//设置悔棋按钮的状态CMyDlg::m_back.EnableWindow(twzq.getbackble());//重画屏幕twzq.draw();}系统测试情况新游戏:保存:加载:悔棋系统的优点与不足优点:该程序用较简洁的语言设计成一个五子棋游戏,利用循环语句、二维数组等将下棋中的数据保存起来并采用保存的逆过程来加载,并且能够悔棋。
电子科技大学数学科学学院2018-2019-2学期实验报告(实验)课程名称程序设计基础综合实验学生姓名:李寒雪学号:2015060101029 报告评分:指导教师:胡科实验地点:基础实验大楼227电子科技大学教务处制表实验报告1一、项目名称:主界面与棋盘设计二、实验学时:6 (3~4周)三、算法描述:c语言字符界面,菜单选项有:0.人人对弈1.人机对弈2.退出游戏3.游戏说明四、核心代码:int main(){int temp;while(1){std::cout << "0.人人对弈\n1.人机对弈\n2.退出游戏\n3.游戏说明\n";std::cin >> temp;if (temp == 0){PVP();}else if (temp == 1){PVC();}else if(temp == 2){break;}else if(temp == 3){std::cout << "五子棋游戏:率先连成五颗方为赢家\n";}elsestd::cout << "无此选项";}}五、实验结果(含运行界面截图):1、运行程序进入菜单选项界面2、选择0.人人对弈或者1.人机对弈进入对弈的字符棋盘界面,通过选择行列号来下子3、选择3.游戏说明展示游戏规则4、选择2.退出游戏,成功退出程序六、总结及体会:若用户在使用中出现其他选项应给与一定的提示信息。
实验报告2一、项目名称:移位与胜负判定二、实验学时:6 (4~5周)三、算法描述:在价值判定类中的成员函数isWin实现,对给定的参数当前落子坐标和棋盘对象进行判定,每次落子判定一次,每次判定需要遍历8个方向,由函数PVP和PVC调用,返回布尔量是否赢。
四、核心代码:bool Evaluator::isWin(int x, int y, ChessBoard::State state){for (int direction = Evaluator::Direction::Up; direction <= Evaluator::Direction::LeftDown; direction++){int sum = 0;int x_ = x;int y_ = y;while (true){next(x_, y_, (Evaluator::Direction)direction);if (!chessBoardRef.isBound(x_, y_) && chessBoardRef.getBoardState(x_, y_) == state) sum++; else break;}x_ = x;y_ = y;while (true){next(x_, y_, (Evaluator::Direction)(direction + 4));if (!chessBoardRef.isBound(x_, y_) && chessBoardRef.getBoardState(x_, y_) == state) sum++; else break;}sum++;if (sum == 5) return true;}return false;}五、实验结果(含运行界面截图):1、以人人对弈为例,最后一颗白方落子(5,5),连成五颗判定为赢,游戏结束,提示白方获胜。
小学五子棋社团活动报告
活动概述
本次小学五子棋社团活动旨在提高学生的思维能力、策略思考能力和团队合作能力。
活动时间为XX月XX日,地点为学校多功能厅。
活动内容
1. 五子棋教学:由俱乐部指导老师进行五子棋的基本规则和策略的讲解,帮助学生掌握游戏的基本技巧。
2. 团队对战:将学生分成若干小组,并组织小组之间的对战。
通过团队对战,培养学生之间的合作意识和团队精神。
3. 单人赛:在团队对战后,组织个人比赛。
通过个人比赛,激发学生竞争意识,提高个人棋艺水平。
4. 亲子活动:邀请学生家长一同参与活动,与孩子一起进行五子棋对战,增进亲子关系。
5. 奖项颁发:根据比赛成绩和表现,颁发优胜奖、进步奖等奖项,激励学生更好地参与活动。
活动效果
通过这次小学五子棋社团活动,学生们不仅提高了自己的棋艺水平,还增强了自己的思维能力和团队合作精神。
同时,活动也促进了家校合作,加强了学生与家长之间的沟通和亲子关系。
反馈意见
根据参与活动的学生反馈,他们对这次活动非常满意。
学生们表示通过这次活动,他们学到了很多关于五子棋的技巧和策略,并且感受到了团队合作的重要性。
学生们希望将来能够继续举办这样的活动。
总结与展望
通过本次小学五子棋社团活动,我们成功地提高了学生的思维能力、策略思考能力和团队合作能力。
活动得到了学生和家长的积极反馈,取得了良好的效果。
希望将来能够继续举办这样的活动,为学生们提供更多机会锻炼自己,展现自己的才华。
博弈五子棋实验报告实验内容:启发式搜索算法。
熟悉和掌握启发式搜索的定义、估价函数和算法过程,并求解博弈问题,理解求解流程和搜索顺序。
五子棋是一种受大众广泛喜爱的游戏,其规则简单,变化多端,非常富有趣味性和消遣性。
这里设计和实现了一个人-机对下的五子棋程序,采用了博弈树的方法,应用了剪枝和最大最小树原理进行搜索发现最好的下子位置。
介绍五子棋程序的数据结构、评分规则、胜负判断方法和搜索算法过程。
实验条件:实验平台:Windows 7,JDK6,eclipse 3.6算法思想:一、相关的数据结构关于盘面情况的表示,以链表形式表示当前盘面的情况,目的是可以允许用户进行悔棋、回退等操作。
CList StepList;其中Step结构的表示为:struct Step{int m; //m,n表示两个坐标值int n;char side; //side表示下子方};以数组形式保存当前盘面的情况,目的是为了在显示当前盘面情况时使用:char FiveArea[FIVE_MAX_LINE][FIVE_MAX_LINE];其中FIVE_MAX_LINE表示盘面最大的行数。
同时由于需要在递归搜索的过程中考虑时间和空间有效性,只找出就当前情况来说相对比较好的几个盘面,而不是对所有的可下子的位置都进行搜索,这里用变量CountList来表示当前搜索中可以选择的所有新的盘面情况对象的集合:CList CountList;其中类CBoardSituiton为:class CBoardSituation{CList StepList; //每一步的列表char FiveArea[FIVE_MAX_LINE][FIVE_MAX_LINE];struct Step machineStep; //机器所下的那一步double value; //该种盘面状态所得到的分数}二、评分规则对于下子的重要性评分,需要从六个位置来考虑当前棋局的情况,分别为:-,¦,/,\,//,\\实际上需要考虑在这六个位置上某一方所形成的子的布局的情况,对于在还没有子的地方落子以后的当前局面的评分,主要是为了说明在这个地方下子的重要性程度,设定了一个简单的规则来表示当前棋面对机器方的分数。
一、实验背景黑白棋,又称五子棋、连珠棋等,是一种两人对弈的策略型棋类游戏。
本实验旨在通过编程实现黑白棋游戏,并运用人工智能算法优化游戏策略,提高游戏水平。
二、实验目的1. 理解黑白棋游戏规则及基本策略。
2. 掌握人工智能在黑白棋游戏中的应用。
3. 通过优化算法,提高黑白棋游戏水平。
三、实验内容1. 黑白棋游戏规则黑白棋游戏规则如下:(1)棋盘为15×15的网格,每个网格可以放置一枚棋子。
(2)黑方先手,双方轮流在空白网格放置棋子,黑色棋子为“黑”,白色棋子为“白”。
(3)当任意一方在水平、竖直或两个对角线上形成连续的五个棋子时,该方获胜。
2. 人工智能算法本实验采用Minimax(最小-最大)算法进行人工智能策略优化。
Minimax算法是一种决策树搜索算法,用于解决二人零和博弈问题。
在黑白棋游戏中,Minimax算法通过模拟对手的走法,寻找最优的落子策略。
3. 优化算法为了提高游戏水平,我们对Minimax算法进行了以下优化:(1)棋子权重:将棋盘上的棋子按照位置赋予不同的权重,以反映棋子的重要程度。
例如,棋盘中心的棋子权重高于边缘棋子。
(2)22点权重:在棋盘的四个角落,我们赋予额外的权重,以鼓励在角落放置棋子。
(3)边线权重:棋盘边缘的棋子权重高于中间棋子,以反映棋子贴边的重要性。
(4)顶角权重:棋盘四个顶角的棋子权重最高,以鼓励在顶角放置棋子。
四、实验结果与分析1. 游戏效果通过优化后的Minimax算法,我们的黑白棋游戏水平得到了显著提高。
在与对手的对弈中,我们能够更好地判断棋局走势,制定合理的落子策略。
2. 优化效果分析(1)棋子权重:通过对棋子权重的优化,我们能够更好地把握棋局走势,避免在棋局后期陷入被动。
(2)22点权重:在棋局初期,我们倾向于在22点位置放置棋子,以占据有利地形。
(3)边线权重:在棋局中后期,我们注重在棋盘边缘放置棋子,以扩大棋局范围。
(4)顶角权重:在棋局的关键时刻,我们会在顶角位置放置棋子,以形成优势。
1 实验项目 五子棋网络对战和聊天 实验日期 20160406 实验报告要求: 一、 实验目的: 学习和使用socket编程,熟练软件开发 二、实验原理: 使用socket进行网络通信,java作为编程语言 三、实验要求: 编写五子棋程序可以实现联机网络对战,并且可以进行聊天 四、实验步骤、结果(程序+注释+截图)及分析: 首先拟定编程语言与开发方案,选择java语言,考虑到java可以跨平台运行, 然后决定把这个程序拆分为客户端、服务器两个部分,每个部分再分成5个小的部分实现不同功能。 1、然后考虑使用java的swing包,创建ClientChessPanel类负责棋盘部分,包括判断输赢,使用数组chesses[i][j]记录棋盘上棋子的分布,对数组进行不同的赋值表示网格节点上无棋、黑棋、白棋;使用playChessHandler作为鼠标单击事件,单击事件调用Clientskt中的函数传送棋子坐标以及输赢信息。drawChess函数画棋子,drawGrids画网格,gameOver判断棋盘棋子分布,输赢情况。 importjavax.swing.*; importjava.awt.*; importjava.awt.event.*; importChatOneToOneClient.Clientskt; classClientChessPanel extends JPanel{ private static final long serialVersionUID = 1L; private int space=20; //网格间的距离 private int grids=30; //棋盘的网格数 private int radius=space/2; //棋的半径 Clientsktskt; //当chesses[i][j]=0,表示网格节点(i,j)上无棋 //当chesses[i][j]=1,表示网格节点(i,j)上放白棋 //当chesses[i][j]=2,表示网格节点(i,j)上放黑棋 privateint[][] chesses=new int[grids+1][grids+1]; private intcurrColor=1; //当前棋的颜色
privateMouseListenerplayChessHandler=new MouseAdapter(){ public void mouseClicked(MouseEvent e){ if(skt.reMouseGo()){ int x=e.getX(); int y=e.getY(); //放一颗棋子 2
if(x<=grids*space && x>=0 && y<=grids*space && y>=0) if(chesses[round(x)][round(y)]==0){ chesses[round(x)][round(y)]=currColor; repaint(); //刷新图形 skt.dataout("x:"+String.valueOf(round(x))); skt.dataout("y:"+String.valueOf(round(y))); skt.setMouseGo(false); if(gameOver(currColor)){ skt.dataout("g:你输了"); skt.chat.clientDialog=new ClientMyDialog(skt.chat,"你赢了"); skt.chat.clientDialog.setVisible(true); } currColor=currColor==1?2:1; //切换棋子的颜色 } } } };
public int round(float a){ //获得接近a的网格节点坐标 float f=a/space; returnMath.round(f); } publicClientChessPanel(intspace,intgrids,Clientsktskt){ this.space=space; this.grids=grids; this.radius=space/2; this.skt=skt; setBackground(Color.BLUE); setSize(space*grids,space*grids);
addMouseListener(playChessHandler); startChess();
} public void startChess(){ clearGrids(); //清空棋盘 currColor=1; repaint(); //刷新图形 }
private void clearGrids(){ for(inti=0;i<=grids;i++) for(int j=0;j<=grids;j++) chesses[i][j]=0; 3
} //画一颗棋子 private void drawChess(Graphics g,intx,inty,int color){ g.setColor(color==1?Color.GREEN:Color.BLACK); g.fillOval(x*space-radius,y*space-radius,radius*2,radius*2); } //画网格 private void drawGrids(Graphics g){ g.setColor(Color.DARK_GRAY); for(inti=0;i<=grids;i++){ g.drawLine(0,i*space,grids*space,i*space); g.drawLine(i*space,0,i*space,grids*space); } } //接收对方下的棋坐标 public void paintChess(intx,int y){ if(x<=grids*space && x>=0 && y<=grids*space && y>=0){ if(chesses[x][y]==0){ chesses[x][y]=currColor; currColor=currColor==1?2:1; //切换棋子的颜色 skt.setMouseGo(false); skt.setMouseGo(true);
repaint(); //刷新图形 } } } //判断游戏是否结束 publicbooleangameOver(intgameOver){ int five=0;//用于判断是否有连续5个子 for(inti=0;ifor(int j=0;jif(chesses[i][j]==gameOver){ five++; for(int k=1;k<5&&jif(chesses[i][j+k]==gameOver){ five++; if(five==5){ return true; } } else{ five=1; k=5; } 4
} for(int k=1;k<5&&iif(chesses[i+k][j]==gameOver){ five++; if(five==5){ return true; } } else{ five=1; k=5; } } for(int k=1;k<5&&iif(chesses[i+k][j+k]==gameOver){ five++; if(five==5){ return true; } } else{ five=1; k=5; } } for(int k=1;k<5&&i4;k++){//左斜向比较 if(chesses[i+k][j-k]==gameOver){ five++; if(five==5){ return true; } } else{ five=1; k=5; } } } } five=0; } return false; } public void paintComponent(Graphics g){ //覆盖paintComponent()方法 super.paintComponent(g); //必须先调用父类的方法 5
drawGrids(g); //画网格 for(inti=0;i<=grids;i++) for(int j=0;j<=grids;j++) if(chesses[i][j]!=0) drawChess(g,i,j,chesses[i][j]); //画棋子 } }
2、ClientComponentPopupMenu类主要负责聊天的部分,使用JTextField并且对其添加单击事件以及鼠标事件,可以实现文本的剪贴、复制粘贴等功能。 importjava.awt.*; importjava.awt.event.*; importjava.awt.print.*; importjavax.swing.*; importjavax.swing.text.*;
public class ClientComponentPopupMenu extends JPopupMenu implements MouseListener,ActionListener{
private static final long serialVersionUID = 1L; public static ClientComponentPopupMenusharedInstance = null;
public static void installToComponent(JTextComponent c){ if(c instanceofJTextArea&& !(c instanceofJPasswordField)){ c.addMouseListener(ClientComponentPopupMenu.getSharedInstance()); } else if(c instanceofJTextField&& !(c instanceofJPasswordField)){ c.addMouseListener(ClientComponentPopupMenu.getSharedInstance()); } }
public static void uninstallFromComponent(JTextComponent c){ if(c instanceofJTextArea&& !(c instanceofJPasswordField)){ c.removeMouseListener(getSharedInstance()); } else if(c instanceofJTextField&& !(c instanceofJPasswordField)){ c.removeMouseListener(getSharedInstance()); } }