五子棋实训报告(电子版)

合集下载

五子棋课程实训报告

五子棋课程实训报告

一、设计内容与设计要求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系统的手机项目实战,紧跟当前时代电子通信业的发展,让学生学习当前主流的新技术,扩展学生们的视野,为即将大学毕业的我们进入社会求职开辟了一条新道路。

c五子棋实验报告doc

c五子棋实验报告doc

c五子棋实验报告篇一:五子棋对战实验报告实验项目五子棋网络对战和聊天实验日期XX0406实验报告要求:一、实验目的:学习和使用socket编程,熟练软件开发二、实验原理:使用socket进行网络通信,java作为编程语言三、实验要求:编写五子棋程序可以实现联机网络对战,并且可以进行聊天四、实验步骤、结果(程序+注释+截图)及分析:首先拟定编程语言与开发方案,选择java语言,考虑到java可以跨平台运行,然后决定把这个程序拆分为客户端、服务器两个部分,每个部分再分成5个小的部分实现不同功能。

1、然后考虑使用java的swing包,创建ClientChessPanel类负责棋盘部分,包括判断输赢,使用数组chesses[i][j]记录棋盘上棋子的分布,对数组进行不同的赋值表示网格节点上无棋、黑棋、白棋;使用playChessHandler作为鼠标单击事件,单击事件调用Clientskt中的函数传送棋子坐标以及输赢信息。

drawChess函数画棋子,drawGrids画网格,gameOver判断棋盘棋子分布,输赢情况。

importjavax.swing.*;importjava.awt.*;;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();//放一颗棋子if(x=0 && 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:你输了");ClientMyDialog(skt.chat,"你赢了");;}currColor=currColor==1?2:1; //切换棋子的颜色}}}};public int round(float a){ //获得接近a的网格节点坐标float f=a/space;returnMath.round(f);}publicClientChessPanel(intspace,intgrids,Clientskts kt){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 for(int j=0;j chesses[i][j]=0;}//画一颗棋子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,r adius*2);}//画网格private void drawGrids(Graphics g){g.setColor(Color.DARK_GRAY);for(inti=0;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=0 && 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;i for(int j=0;j if(chesses[i][j]==gameOver){five++;for(in(本文来自:小草范文网:c五子棋实验报告)t k=1;k if(chesses[i][j+k]==gameOver){five++;if(five==5){return true;}}else{five=1;k=5;}}for(int k=1;k if(chesses[i+k][j]==gameOver){ five++;if(five==5){return true;}}else{five=1;k=5;}}for(int k=1;k if(chesses[i+k][j+k]==gameOver){five++;if(five==5){return true;}}else{five=1;k=5;}}for(int k=1;k4;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); //必须先调用父类的方法drawGrids(g); //画网格for(inti=0;i for(int j=0;j if(chesses[i][j]!=0)drawChess(g,i,j,chesses[i][j]); //画棋子}}2、ClientComponentPopupMenu类主要负责聊天的部分,使用JTextField并且对其添加单击事件以及鼠标事件,可以实现文本的剪贴、复制粘贴等功能。

崔钊 五子棋实训报告

崔钊 五子棋实训报告

《java语言程序设计》实训报告实训题目: 五子棋游戏制作专业:软件技术班级:15软件(1)班姓名:崔钊指导教师:邓衍青2016年6月11日目录一、实训目的: (1)二、实训题目描述和要求 (1)2.1实训题目描述: (1)2.2实训题目要求: (1)三、实训报告内容: (2)3.1需求分析: (2)3.2需求设计: (3)3.3详细设计 (4)四、游戏的测试 (16)五、结论 (21)六、参考书目: (22)一、实训目的:在制作五子棋游戏过程中,增加学生对java和Eclipse的熟练使用,增加对java语言的运用,让我们学到用到的知识来掌握熟练度!二、实训题目描述和要求2.1实训题目描述:五子棋的娱乐性强、规则简单、易学、流行性广,普通人不需长时间专门训练即可自如行棋,因此极受大众喜欢·五子棋规则为:1.棋盘:采用像围棋盘一样的棋盘,本系统采用18路的棋盘·2.下法:两人分别执黑白两色棋子,轮流在棋盘上选择一个无子的交叉点落子,无子的交叉点又被称为空点·3.输赢判断:黑、白双方有一方的五个棋子在横、竖或斜方向上连接成一线即为该方赢·2.2实训题目要求:1.设计功能明确。

2.熟悉JAVA开发环境,掌握JAVA程序的编译和运行。

3.掌握JAVA基本编程技术和方法。

4.实训上交内容:实训报告一份,电子版本实训报告一份,源程序代码。

5.游戏界面要如下图所示:三、实训报告内容:3.1需求分析:程序流程我们看到本程序由4个基本功能模块构成,各模块的详细分析如下:1.初始化FiveChessFrame类过try {bgImage = ImageIO.read(new File("E:/帅志文/image/background.jpg"));} catch (IOException e) {e.printStackTrace();}}加载背景图片,然后再背景图上通过:paint方法中的for(int i= 0; i< 19; i++) {g2.drawLine(10, 70 + 20 * i, 370, 70 + 20 * i);g2.drawLine(10 + 20 * i, 70, 10 + 20 * i, 430);}语句绘制一个18*18的网格棋盘,每次下棋后通过调用repaint方法来初始化程序。

五子棋程序实习报告

五子棋程序实习报告

五子棋程序实习报告一、实习背景及目的近期,我通过五子棋程序的实习,深入了解了五子棋的规则和算法,并成功编写了一个五子棋程序。

本次实习的目的是为了提高我的编程能力和逻辑思维能力,同时了解人工智能在棋类游戏中的应用。

二、五子棋规则及算法分析五子棋是一种两人对弈的棋类游戏,游戏的目标是在棋盘上形成连续的五个棋子。

棋盘通常为15×15的网格,每个玩家轮流在空格中放置自己的棋子。

五子棋的算法主要包括两种:一种是基于搜索的算法,如极大极小值搜索和启发式搜索;另一种是基于机器学习的算法,如蒙特卡洛树搜索和深度学习。

三、程序设计及实现在本次实习中,我选择了基于极大极小值搜索的五子棋算法,并使用Python语言进行程序设计。

程序的主要功能包括棋盘的显示、玩家的输入和计算机的智能下棋。

首先,我使用类来表示棋盘,每个棋盘对象包含一个15×15的二维数组,用于存储棋子的位置。

同时,我还定义了一个常量类,用于存储棋子的颜色和空格的表示。

接下来,我实现了一个玩家输入的类,玩家可以通过该类来选择下棋的位置。

为了简化输入过程,我使用了一个简单的文本界面,玩家只需输入坐标即可。

最后,我实现了一个计算机下棋的类,该类使用了极大极小值搜索算法。

具体实现过程如下:1. 将棋盘划分为多个可能的获胜区域,例如横线、竖线和斜线。

2. 对于每个获胜区域,计算计算机和玩家在该区域获胜的概率。

3. 使用极大极小值搜索算法,选择最优的落子位置。

四、实习心得通过本次五子棋程序的实习,我对五子棋的规则和算法有了更深入的了解,同时也提高了我的编程能力和逻辑思维能力。

在程序设计过程中,我遇到了很多问题,如棋盘的表示、搜索算法的实现等,通过查阅资料和不断调试,我最终成功解决了这些问题。

此外,通过本次实习,我也了解到了人工智能在棋类游戏中的应用。

目前,深度学习等算法在棋类游戏中取得了显著的成果,例如AlphaGo在围棋领域的突破。

未来,我相信人工智能将在更多棋类游戏中发挥重要作用。

五子棋游戏实验报告

五子棋游戏实验报告

五子棋游戏实验报告五子棋游戏实验报告引言:五子棋是一种古老而受欢迎的策略游戏,它不仅能够锻炼思维能力,还能培养耐心和决策能力。

为了进一步了解五子棋游戏对人类思维和决策的影响,我们进行了一项实验。

本实验旨在探究五子棋游戏对玩家的思维策略、决策效率和情绪状态的影响。

实验设计:参与实验的被试共计50人,他们被随机分为两组。

每个被试都需要进行五子棋游戏,其中一组被试在游戏前接受了一段时间的训练,而另一组则没有。

我们通过观察被试的行为和采集数据来分析五子棋游戏对思维和决策的影响。

实验过程:实验开始前,我们向所有被试提供了五子棋游戏的规则和基本策略。

然后,我们对训练组进行了一段时间的训练,让他们熟悉游戏规则和各种常见的战术。

接下来,两组被试开始进行五子棋游戏,每个被试有15分钟的时间来下棋。

实验结果:通过对被试的行为和数据的分析,我们得出了以下结论:1. 思维策略:在游戏中,训练组的被试表现出更加深思熟虑的思维策略。

他们更善于预测对手的下一步,并采取相应的防守或进攻策略。

相比之下,未训练组的被试更加随机地下棋,缺乏长远规划。

2. 决策效率:训练组的被试在游戏中做出决策的速度更快。

他们能够快速分析局势,并做出相应的反应。

而未训练组的被试则需要更多的时间来思考和决策。

3. 情绪状态:我们观察到训练组的被试在游戏过程中更加冷静和放松。

他们能够保持冷静的头脑,不受情绪的干扰。

相比之下,未训练组的被试在面对困难局面时更容易感到紧张和焦虑。

讨论:通过这项实验,我们发现五子棋游戏对思维和决策能力有着积极的影响。

训练组的被试在思考问题和做出决策时表现出更高的效率和准确性。

此外,他们还能够更好地控制情绪,保持冷静。

这些结果表明,五子棋游戏可以作为一种有效的训练工具来提升思维能力和决策能力。

然而,我们也发现这项实验存在一些局限性。

首先,实验样本较小,可能无法完全代表整个人群。

其次,实验时间较短,无法观察到长期训练对思维和决策能力的影响。

五子棋冯上实验报告

五子棋冯上实验报告

五子棋冯上实验报告一、实验目的和要求1.能够用编程语言实现一个简单的五子棋程序2.在实际系统中使用、实现人工智能的相关算法3.进一步加深对人工智能算法的理解二、五子棋的基本常识与原理1.五子棋的起源五子棋,是一种两人对弈的纯策略型棋类游戏,亦称“串珠"。

“连五子”:是中国民间非常熟知的一个古老棋种。

相传,它起源于四千多年前的尧帝时期,比困棋的历史还要悠久。

亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成困棋并在炎黄子孙后代中遍及开来。

五子棋发展于日本,流行于欧美。

容易上手,老少皆宜,而且趣味横生,引人入胜:不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为19X19,棋子放置于棋盘线交叉点上。

两人对局,各执一色,轮流下一子,先将横、整或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。

因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。

2.五子棋的基本常识与任何一种竞技棋一样,五子棋的每一局棋也分为三个阶段:开局,中局和残局。

五子棋的开始阶段称为开局,或称布局。

其开局阶段是十分短暂的,大约在七着与十几着之间。

在这一阶段的争夺中,双方的布局,应对将对以后的胜负起着极为关键的作用。

在开局阶段取得的形势好坏,主动与被动,先手与后手的优劣程度,往往直接影响中局的战斗。

因此积极处理好开局和开局向中局的过渡十分重要。

五子棋是从一至五,逐渐布子,发展连系,同时运用限制和反限制的智慧,在连子的过程中为自己的棋子争得相对的主动权和优势,逐步扩展优势,或者从劣势转化为优势,击溃对方的防线,最后连五取胜或抓禁手取胜或迫使对方投子认负。

3.五子棋比赛的相关规定(1)职业连珠规则a. 黑方先下子,白后下,从天元开始相互顺序落子。

b.最先在棋盘横向、整向、斜向形成连续的相同色五个棋子的一方为胜。

c. 黑棋禁手判负,白棋无禁手。

黑棋禁手包括“三三”(包括“四三三”)“四四”(包括“四四三”)“长连"。

五子棋实习报告百度文库

五子棋实习报告百度文库

一、实习背景随着科技的发展,我国的教育事业也在不断地推进。

为了更好地培养学生的创新精神和实践能力,我校开展了丰富多彩的课外实践活动。

其中,五子棋活动作为一种有益于学生身心健康、锻炼思维能力的活动,受到了广大师生的喜爱。

为了深入了解五子棋活动的开展情况,提高自身教学水平,我于本学期参加了五子棋实习活动。

二、实习目的1. 了解五子棋活动的起源、规则和发展历程,掌握五子棋的基本技巧。

2. 掌握五子棋教学的方法和策略,提高自身教学水平。

3. 通过实习活动,培养学生的团队协作精神、竞技意识和良好品质。

4. 丰富自己的业余生活,提高自己的综合素质。

三、实习过程1. 实习前期准备在实习开始前,我通过网络、书籍等多种途径,对五子棋进行了深入了解。

学习了五子棋的起源、规则、基本技巧等知识,为实习活动奠定了基础。

2. 实习阶段(1)参与教学活动在实习过程中,我担任了五子棋课程的助教,协助老师进行教学。

在老师的指导下,我了解了五子棋教学的基本流程,包括课堂导入、讲解规则、示范操作、学生练习、总结评价等环节。

(2)组织活动为了提高学生的兴趣,我组织了多次五子棋比赛。

在比赛中,我负责裁判工作,确保比赛的公平、公正。

同时,我还负责记录比赛结果,为优秀选手颁发奖品。

(3)课后辅导在课后,我主动为学生提供辅导,解答他们在学习中遇到的问题。

通过辅导,我发现学生们在五子棋学习过程中,普遍存在以下问题:① 规则理解不透彻;② 棋力水平参差不齐;③ 团队协作意识薄弱。

针对这些问题,我制定了相应的辅导方案,帮助学生提高棋艺。

3. 实习总结在实习过程中,我逐渐掌握了五子棋教学的方法和策略。

以下是我总结的一些经验:(1)注重规则讲解在五子棋教学中,首先要让学生了解游戏规则,这是提高棋艺的基础。

(2)因材施教针对学生的不同水平,制定相应的教学计划。

对于基础较差的学生,要注重基础知识的讲解;对于基础较好的学生,要引导他们进行实战演练。

(3)培养学生的团队协作意识在五子棋比赛中,鼓励学生互相学习、共同进步。

博弈五子棋实验报告

博弈五子棋实验报告

博弈五子棋实验报告实验内容:启发式搜索算法。

熟悉和掌握启发式搜索的定义、估价函数和算法过程,并求解博弈问题,理解求解流程和搜索顺序。

五子棋是一种受大众广泛喜爱的游戏,其规则简单,变化多端,非常富有趣味性和消遣性。

这里设计和实现了一个人-机对下的五子棋程序,采用了博弈树的方法,应用了剪枝和最大最小树原理进行搜索发现最好的下子位置。

介绍五子棋程序的数据结构、评分规则、胜负判断方法和搜索算法过程。

实验条件:实验平台: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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《JA V A程序设计》实训报告课程名称:JA V A程序设计专业:计算机应用技术班级:11计算机应用班小组成员:巨敏石丽涛张娅雯李延尚文学董丁喜周致远指导老师:武文廷目录一.实训目的 (1)二. 实训题目和要求2.1实训题目描述 (1)2.2实训要求 (1)三.实训报告内容3.1五子棋主框架 (1)3.2棋盘、棋子及说明信息 (1)3.3对弈算法相关问题设计 (1)四.实训中的部分代码 (2)五.五子棋源程序代码 (3)六. 总结 (17)一、实训目的本次实训,学生可以将理论知识与具体实践相结合,巩固对JA VA相关方法和概念的理解。

通过实训单机版五子棋游戏的编程,掌握JA V A语言编程的基础知识并能熟练运用,熟悉累声明与对象的使用,运用JA V Aswing编写单机版五子棋游戏,并实现其功能。

通过本次实训,可以开拓思维,增强编程思想,为深入学习JA VA打下良好的基础。

二、实训题目描述和要求2.1实训题目描述实训题目:JA V A五子棋单机版游戏。

描述:通过JA V A的swing组件,实现五子棋简单的双人对弈,并通过内部条件判断实现输赢的双方的下棋过程。

2.2实训要求(1)五子棋游戏的主窗口也就是游戏界面的实现(2)棋子黑白色的设置及判定(3)完成判断某一横行是否练成五子及所有方向是否练成五子的功能(4)几个简单按钮的实现,“重新开始”“悔棋”“退出”按钮(5)菜单栏的实现,“重新开始”“悔棋”“退出”菜单项三、实训报告内容3.1主框架编写一个startCheesJFrame类,主要用来显行主窗体界面,包括工具条面板、菜单栏项。

设置界面关闭事件。

并编写一个内部类MyItemListener来监听按钮和菜单栏的单机事件。

3.2棋盘、棋子(1)编写point类,包括棋子的X/Y索引,颜色。

定义构造函数和相应的get方法。

(2)编写ChessBoard类,设置棋盘背景颜色为橘黄色(3)在主框架类中创建ChessBoard对象,并添加到主框架中(4)编写mousePressed方法来进行绘制棋盘和棋子3.3对弈算法相关问题设计(1)编写mousePressed方法的内容,预定义isBlack表示下的是黑棋还是白棋。

PointCount表示当前棋子的个数。

(2)添加相应的判断:不能画到棋盘外,下过的地方不能再下(需要辅助方法find point)。

(3)添加胜利的判断iswin,添加标记变量gameOver。

在mousePressed方法的最前面调用加入gameOver 的判断,在mousePressed方法的最后调用iswin,返回true则给出消息提示,gameOver设置为tuer。

四、实训中的部分代码Private ChessBoard chessboard;Private JPanel toolbar;Private JButton shartButton;Private JButton backButton;Private JButton exiButton;Public class point{Private int x;Private int y;Private color color;Public static final int DIAMETER=30;Public point lint x, int y, color color{This. X=x;This.y=y;This . color=color;}Public startChess JFrame(){Set Title(“单机版五子棋”);chessboard=new chessboard();menuBar=new JMenuBar();sysMenu=new JMenu(“系统”);startMenuItem=new JMenuItem(“重新开始”);exitMenuItem=new JMenuItem(“退出”);backMenuItem=new JMenuItem(“悔棋”);sysMenu.add(startMenuItem);五、五子棋源程序代码//StartChessFrameimport javax.swing.*;import ;import java.awt.*;public class StartChessFrame extends JFrame {private ChessBoard chessBoard;private JPanel toolbarprivate JButton startButton, backButton, exitButton;private JMenuBar menuBar;private JMenu sysMenu;private JMenuItem startMenuItem, exitMenuItem, backMenuItem;public StartChessFrame() {setTitle("单机版五子棋");chessBoard = new ChessBoard();menuBar = new JMenuBar();sysMenu = new JMenu("系统");startMenuItem = new JMenuItem("重新开始");exitMenuItem = new JMenuItem("退出");backMenuItem = new JMenuItem("悔棋");sysMenu.add(startMenuItem);sysMenu.add(backMenuItem);sysMenu.add(exitMenuItem);MyItemListener lis = new MyItemListener();;backMenuItem.addActionListener(lis);exitMenuItem.addActionListener(lis);menuBar.add(sysMenu);setJMenuBar(menuBar);import ;public class Point {private int x;private int y;private Color color;public static final int DIAMETER = 30;public Point(int x, int y, Color color) {this.x = x;this.y = y;this.color = color;}public int getX() {return x;}public int getY() {return y;}public Color getColor() {return color;}}toolbar = new JPanel();startButton = new JButton("重新开始");backButton = new JButton("悔棋");exitButton = new JButton("退出");toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));toolbar.add(startButton);toolbar.add(backButton);toolbar.add(exitButton);startButton.addActionListener(lis);backButton.addActionListener(lis);exitButton.addActionListener(lis);add(toolbar, BorderLayout.SOUTH);add(chessBoard);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//setSize(800,800);pack();}private class MyItemListener implements ActionListener { public void actionPerformed(ActionEvent e) {Object obj = e.getSource();if (obj == || obj == startButton){"重新开始...");chessBoard.restartGame();} else if (obj == exitMenuItem || obj == exitButton) {System.exit(0);} else if (obj == backMenuItem || obj == backButton) {"悔棋...");chessBoard.goback();}}}public static void main(String[] args) {StartChessFrame f = new StartChessFrame();f.setVisible(true);}}//ChessBoardimport javax.swing.*;import java.awt.*;import ;import ;import ;public class ChessBoard extends JPanel implements MouseListener {public static final int MARGIN = 30;public static final int GRID_SPAN = 35;public static final int ROWS = 10;public static final int COLS = 10;Point[] chessList = new Point[(ROWS + 1) * (COLS + 1)];boolean isBlack = true;boolean gameOver = false;int chessCount;int xIndex, yIndex;public ChessBoard(){setBackground(Color.ORANGE);addMouseListener(this);addMouseMotionListener(new MouseMotionListener() {public void mouseDragged(MouseEvent e) {}public void mouseMoved(MouseEvent e) {int x1 = (e.getX() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;int y1 = (e.getY() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;if (x1 < 0 || x1 > ROWS || y1 < 0 || y1 > COLS || gameOver|| findChess(x1, y1))setCursor(new Cursor(Cursor.DEFAULT_CURSOR));elsesetCursor(new Cursor(Cursor.HAND_CURSOR));}});}public void paintComponent(Graphics g) {super.paintComponent(g);for (int i = 0; i <= ROWS; i++) {g.drawLine(MARGIN, MARGIN + i * GRID_SPAN, MARGIN + COLS* GRID_SPAN, MARGIN + i * GRID_SPAN);}for (int i = 0; i <= COLS; i++) {g.drawLine(MARGIN + i * GRID_SPAN, MARGIN, MARGIN + i * GRID_SPAN,MARGIN + ROWS * GRID_SPAN);}for (int i = 0; i < chessCount; i++) {int xPos = chessList[i].getX() * GRID_SPAN + MARGIN;int yPos = chessList[i].getY() * GRID_SPAN + MARGIN;g.setColor(chessList[i].getColor());g.fillOval(xPos - Point.DIAMETER / 2, yPos - Point.DIAMETER / 2,Point.DIAMETER, Point.DIAMETER);if (i == chessCount - 1) {g.setColor(Color.red);g.drawRect(xPos - Point.DIAMETER / 2,yPos - Point.DIAMETER / 2, Point.DIAMETER,Point.DIAMETER);}}}public void mousePressed(MouseEvent e) {if (gameOver)return;String colorName = isBlack ? "黑棋" : "白棋";xIndex = (e.getX() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;yIndex = (e.getY() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;if (xIndex < 0 || xIndex > ROWS || yIndex < 0 || yIndex > COLS)return;if (findChess(xIndex, yIndex))return;Point ch = new Point(xIndex, yIndex, isBlack ? Color.black: Color.white);chessList[chessCount++] = ch;repaint();if (isWin()) {String msg = String.format("恭喜,%s赢了!", colorName);JOptionPane.showMessageDialog(this, msg);gameOver = true;}isBlack = !isBlack;}public void mouseClicked(MouseEvent e) {}public void mouseEntered(MouseEvent e) {}public void mouseExited(MouseEvent e) {}public void mouseReleased(MouseEvent e) {}private boolean findChess(int x, int y) {for (Point c : chessList) {if (c != null && c.getX() == x && c.getY() == y)return true;}return false;}private boolean isWin() {int continueCount = 1;for (int x = xIndex - 1; x >= 0; x--) {Color c = isBlack ? Color.black : Color.white;if (getChess(x, yIndex, c) != null) {continueCount++;} elsebreak;}for (int x = xIndex + 1; x <= ROWS; x++) {Color c = isBlack ? Color.black : Color.white;if (getChess(x, yIndex, c) != null) {continueCount++;} elsebreak;}if (continueCount >= 5) {return true;} elsecontinueCount = 1;for (int y = yIndex - 1; y >= 0; y--) {Color c = isBlack ? Color.black : Color.white;if (getChess(xIndex, y, c) != null) {continueCount++;} elsebreak;}for (int y = yIndex + 1; y <= ROWS; y++) {Color c = isBlack ? Color.black : Color.white;if (getChess(xIndex, y, c) != null) {continueCount++;} elsebreak;}if (continueCount >= 5) {return true;} elsecontinueCount = 1;for (int x = xIndex + 1, y = yIndex - 1; y >= 0 && x <= COLS; x++, y--) {Color c = isBlack ? Color.black : Color.white;if (getChess(x, y, c) != null) {continueCount++;} elsebreak;}for (int x = xIndex - 1, y = yIndex + 1; y <= ROWS && x >= 0; x--, y++) { Color c = isBlack ? Color.black : Color.white;if (getChess(x, y, c) != null) {continueCount++;} elsebreak;}if (continueCount >= 5) {return true;} elsecontinueCount = 1;for (int x = xIndex - 1, y = yIndex - 1; y >= 0 && x >= 0; x--, y--) {Color c = isBlack ? Color.black : Color.white;if (getChess(x, y, c) != null) {continueCount++;} elsebreak;}for (int x = xIndex + 1, y = yIndex + 1; y <= ROWS && x <= COLS; x++, y++) { Color c = isBlack ? Color.black : Color.white;if (getChess(x, y, c) != null) {continueCount++;} elsebreak;}if (continueCount >= 5) {return true;} elsecontinueCount = 1;return false;}private Point getChess(int xIndex, int yIndex, Color color) {for (Point c : chessList) {if (c != null && c.getX() == xIndex && c.getY() == yIndex&& c.getColor() == color)return c;}return null;}public void restartGame() {for (int i = 0; i < chessList.length; i++)chessList[i] = null;isBlack = true;gameOver = false;chessCount = 0;repaint();}public void goback() {if (chessCount == 0)return;文档来源为:从网络收集整理.word版本可编辑.欢迎下载支持.chessList[chessCount - 1] = null;chessCount--;if (chessCount > 0) {xIndex = chessList[chessCount - 1].getX();yIndex = chessList[chessCount - 1].getY();}isBlack = !isBlack;repaint();}public Dimension getPreferredSize() {return new Dimension(MARGIN * 2 + GRID_SPAN * COLS, MARGIN * 2+ GRID_SPAN * ROWS);}}六、总结通过本次实训,我们小组成员可以将理论知识与具体实践相结合,巩固了对java相关方法与概念的理解。

相关文档
最新文档