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

合集下载

五子棋课程实训报告

五子棋课程实训报告

一、设计内容与设计要求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; //该种盘面状态所得到的分数}二、评分规则对于下子的重要性评分,需要从六个位置来考虑当前棋局的情况,分别为:-,¦,/,\,//,\\实际上需要考虑在这六个位置上某一方所形成的子的布局的情况,对于在还没有子的地方落子以后的当前局面的评分,主要是为了说明在这个地方下子的重要性程度,设定了一个简单的规则来表示当前棋面对机器方的分数。

五子棋程序实习报告

五子棋程序实习报告

一、实习背景随着计算机技术的不断发展,编程已成为现代生活的重要组成部分。

为了提高自己的编程技能,培养自己的实际动手能力,我选择了五子棋程序设计作为实习项目。

五子棋是一种古老的中国传统棋类游戏,具有极高的趣味性和挑战性。

通过本次实习,我学习了Java编程语言,掌握了五子棋游戏的算法和实现方法,提高了自己的编程水平。

二、实习目标1. 熟练掌握Java编程语言的基本语法和常用类库;2. 掌握五子棋游戏的设计和实现方法;3. 学会使用面向对象编程思想进行程序设计;4. 培养自己的团队协作和沟通能力。

三、实习内容1. 系统设计在系统设计阶段,我首先分析了五子棋游戏的规则和特点,明确了游戏的基本功能,包括:棋盘显示、落子、判断胜负、悔棋等。

然后,我设计了五子棋游戏的基本架构,包括以下几个模块:(1)棋盘模块:负责棋盘的显示和落子操作;(2)落子模块:负责实现玩家的落子操作;(3)判断胜负模块:负责判断游戏是否结束,以及判断胜负;(4)悔棋模块:负责实现玩家的悔棋操作。

2. 算法设计五子棋游戏的算法主要包括以下几个部分:(1)棋盘表示:使用二维数组表示棋盘,每个元素代表一个棋子,其中0表示空位,1表示玩家1的棋子,2表示玩家2的棋子;(2)落子算法:根据玩家的落子位置,在棋盘上放置对应的棋子;(3)判断胜负算法:从落子位置开始,向四个方向(上、下、左、右)查找连续的五个相同的棋子,如果找到,则判断为胜利;(4)悔棋算法:撤销上一步的落子操作,将棋盘恢复到上一步的状态。

3. 编码实现在编码实现阶段,我按照设计文档和算法要求,使用Java编程语言完成了五子棋游戏的基本功能。

具体实现如下:(1)棋盘模块:使用JFrame创建一个窗口,使用JPanel绘制棋盘,使用鼠标监听器实现落子操作;(2)落子模块:在棋盘模块的基础上,增加一个方法,用于处理玩家的落子操作;(3)判断胜负模块:编写一个方法,用于判断游戏是否结束,以及判断胜负;(4)悔棋模块:编写一个方法,用于撤销上一步的落子操作。

五子棋游戏实验报告

五子棋游戏实验报告
思路:保存棋局的功能即把内存中与棋局相关的数据(棋局名称、棋子位置、棋子颜色、棋局状态(即棋局是否结束))存入外存中,以便以后能够恢复棋局。保存的实现用两种技术实现:文件和数据库。
采用数据库技术实现棋局保存:
数据库设计:
数据表字段:棋局名、x坐标、y坐标、该点状态值、下棋状态。
每条记录表示棋盘上一个存储的点的信息。
1、一定要认真听讲做笔记,这是提高效率最快的方法,就像老师说的。
有了上机课,我才能真正懂得听课的重要性,其实有些课件虽然老师为了学生能够及时的进行自我复习传上去一些,但有些东西终归是老师上课讲的,而并没有写入课件的。所以,当真正自己写的时候,一遍一遍的被程序提示出错,内心其实很着急,因为老师只有一个,而且也不会围着你团团转,所以这时候,请教同学是唯一的方法,但是这唯一的方法也不是时时都能发挥作用,同学也有不会,还是需要老师。其实我知道,大部分的问题都是上课老师已经讲过的,只是自己没听。或者是一知半解,经常写丢一些重要程序,导致程序一直无法运行。比如我经常把退出子过程exit sub弄丢,自己当时没觉得它很重要,虽然老师讲过如果没有这个,后边的程序会很麻烦。当时,我也只是那么一听,没在意,后来编程黑白子竖方向赢棋时没把它加上,之后麻烦就出现了,我的黑白子一直都没法完成竖方向赢棋总是有一个方向没法判断,起初老师告诉我看看是否有算法上的错误,但是,我找了一节多课(我承认我这个人太固执,必须要知道为什么错了,才会做下一步),我觉得我的算法一定没问题,但是不明白为什么错,后来在读别人的程序时,才发现是我的exit sub没写,造成的,只有退出我上一个的子过程,这个过程才能正常运行。所以可见没听老师的话,是多么可怕,尤其还是在我也没听他讲课的前提下……根本不懂代码意思,乱删改造成的后果。所以,不管是在哪里,学知识是对任何事情在打基础。做每一步都要问一句问什么,凡是都有原因。

五子棋实验报告(含代码)

五子棋实验报告(含代码)

实验报告实验一五子棋游戏北方工业大学 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的难度也是这里。

下面是我设计的策略过程:从下棋者的考虑角度进行考虑,尽可能保证每一次下子都是有必要的、都是在情理当中的。

我所设计的策略并不是完整,漏洞在与没有考虑三棋子连续的情况。

五子棋课程设计实验报告

五子棋课程设计实验报告

C语言程序设计报告题目:五子棋班级:电气Q1041班人数:3人小组成员:周啸天、万广富、黄山奇指导老师:桂超目录第一章课程设计的目的和要求.........................................1.1课程设计的目的................................................1.2课程设计的要求................................................1.3课程设计的实验环境........................................... 第二章功能描述........................................................ 第三章总体设计........................................................3.1功能模块设计..................................................3.1.1任务执行流程图..........................................3.2数据结构设计...................................................3.2.1定义结构体...............................................322定义数组...................................................3.2.3全局变量.................................................3.3函数功能描述................................................... 第四章程序实现........................................................4.1源码分析.......................................................4.2运行结果及界面介绍............................................ 第五章后记............................................................第一章课程设计的目的和要求1.1 课程设计的目的1. 加深对C语言数据类型,运算,语句结构及其程序设计的基本方法理解和掌握;2. 熟练掌握流程图的绘制、程序设计文档的书写;3. 通过编写一个完整的程序,一方面可以检查我们这学期的学习情况,为以后的学习打下坚实的基础;4. 熟悉C语言游戏编程,掌握五子棋游戏开发的基本原理,从而为以后的程序开发奠定基础。

五子棋实验报告

五子棋实验报告

青岛理工大学《C语言程序设计》题目五子棋游戏程序设计指导教师:姓名:学号:班级:专业:地点:时间:一、内容五子棋的游戏规则对我们大家来说都很很清楚的。

只要某一方的棋子在一条直线上,棋子数先达到五或以上,则该方为胜者。

本人的五子棋小游戏程序实现了两个人对战的简单步骤和一些简单规则,能判断双方的输赢。

当一方的棋子数先达到五或以上的,则能判断这方为胜者。

而且能判别,当棋盘上的某一个位置有棋子时,能判断这个位置不能再落子了。

当某一方胜利了时可以选择是否再继续玩游戏。

在游戏还没有分出胜负时,也可以退出游戏。

进入游戏一方可以用“W”,“S”,“A”,“D”,“Z”分别来控制上下左右的方向和落子,则另一方则用“O”,“L”,“I”,“P”和空格来分别控制上下左右的方向和落子。

二、上机环境:操作系统:windows XP开发工具:Vc6.0三、函数调用图:四、各函数的说明:1.main()主函数2.void drawqipan()画棋盘3.void move gb() 移动光标4.void luozi() 下棋子5.void judgewin() 判断输赢6.void system() 系统函数五、算法描述void movegb() move luozi()V oid drawqipan() void judgewin()六程序运行效果图1、初始界面2、游戏界面3、可以中途退出七、体会这次程序设计让我感到我学习的知识是多么的有限。

所以我要更加的努力学习编程的知识。

可是这次编程的过程也让我收获不少,首先加固了我的知识点,也锻炼了我的调试能力。

其实这次也让我感觉到C语言也挺有趣的,让我对C语言的兴趣更加浓厚。

并且C语言编程也不是想象中的那么难,因而也让我的心里障碍减少了很多。

八、参考文献:谭浩强.C程序设计(第三版).清华大学出版社,2005九、程序清单#include<stdio.h>#include <conio.h> #include<windows.h> #define play1up 'w'#define play1down 's' #define play1left 'a' #define play1right 'd' #define play2up 'o'#define play2down 'l' #define play2left 'i'#define play2right 'p' #define play1lq 'z'#define play2lq ' ' #define N 20#define playnext 'q'#define exit 'e'int m=1;int p[N][N];/*记录棋盘落子情况*/char q[N][N];/*记录棋盘交叉点棋子种类*/ struct zuobiao{int x;int y;}weizhi;void gotoxy(int x, int y) /*建立坐标函数*/ {COORD c;c.X=x;c.Y=y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);}void drawqipan()/*建立棋盘*/{int i,j;for(i=0;i<N;i++){for(j=0;j<N;j++){ p[i][j]=0;q[i][j]='o';printf("十");}printf("\n");}}void movegb(char press)/*光标的移动*/{switch(press){caseplay1up:if(weizhi.y>-1)weizhi.y--;if(weizhi.y<0)weiz hi.y=19;break;/*玩家1光标向下移动*/caseplay1down:if(weizhi.y<20)weizhi.y++;if(weizhi.y>19 )weizhi.y=0;break;/*玩家1光标向上移动*/caseplay1left:if(weizhi.x>-1)weizhi.x--;if(weizhi.x<0)wei zhi.x=19;break;/*玩家1光标向左移动*/caseplay1right:if(weizhi.x<20)weizhi.x++;if(weizhi.x>19) weizhi.x=0;break;/*玩家1光标向右移动*/caseplay2up:if(weizhi.y>-1)weizhi.y--;if(weizhi.y<0)weiz hi.y=19;break;/*玩家2光标向上移动*/caseplay2down:if(weizhi.y<20)weizhi.y++;if(weizhi.y>19 )weizhi.y=0;break;/*玩家2光标向下移动*/caseplay2left:if(weizhi.x>-1)weizhi.x--;if(weizhi.x<0)wei zhi.x=19;break;/*玩家2光标向左移动*/caseplay2right:if(weizhi.x<20)weizhi.x++;if(weizhi.x>19)weizhi.x=0;break;/*玩家2光标向右移动*/}gotoxy(2*weizhi.x,weizhi.y);}void luozi(char press){static t=0;/*代表坐标交叉点有无棋子的状态*/ if(press==play1lq)if(t==0&&p[weizhi.x][weizhi.y]==0){printf("●");gotoxy(2*weizhi.x,weizhi.y);q[weizhi.x][weizhi.y]=press;p[weizhi.x][weizhi.y]=1;t=1;}if(press==play2lq)if(t==1&&p[weizhi.x][weizhi.y]==0){printf("○");gotoxy(2*weizhi.x,weizhi.y);q[weizhi.x][weizhi.y]=press;p[weizhi.x][weizhi.y]=1;t=0;}}void judgewin(char press)//判断输赢{int i,count1,count2=0,count3=0;struct zuobiao p;for(i=0;i<4;i++){for(count1=4;count1>=-4;count1--){ switch(i){case0:p.x=weizhi.x-count1;p.y=weizhi.y;break;//从左往右判断是否有五子连续在一直线上case1:p.x=weizhi.x;p.y=weizhi.y+count1;break;// 从上往下判断是否有五子连续在一直线上case2:p.x=weizhi.x-count1;p.y=weizhi.y+count1;break; // 从左上往右下判断是否有五子连续在一直线上case3:p.x=weizhi.x-count1;p.y=weizhi.y-count1;break; //从左下往右上判断是否有五子连续在一直线上}if(p.x>=0&&p.y>=0){if(q[p.x][p.y]==play1lq){ count2++;count3=0;}if(q[p.x][p.y]==play2lq){count3++;count2=0;}}}if(count2>=5){gotoxy(20,20);printf("the side of ●wins\n");printf("do you want to play again?\nplease do Q!");break;}else count2=0;if(count3>=5){gotoxy(20,20);printf("the side of ○wins\n");printf("do you want to play again?\nplease do Q!");break;}else count3=0;}}void main()//主函数{char press;system("COLOR 2f");//背景颜色和前景颜色drawqipan();gotoxy(0,0);while(m){press=getch();movegb(press);switch(press){case play1lq:case play2lq:luozi(press);judgewin(press);break; caseplaynext:system("cls");drawqipan();gotoxy(0,0);break ;case exit : m=0;break;default :break;}}}。

五子棋游戏实践报告

五子棋游戏实践报告

计算机实习报告姓名:班级:学号:小班序号:指导老师:题目:五子棋游戏平台:MFC基于对话框程序邮箱:五子棋游戏实验报告一.功能说明1.1总体功能说明五子棋是一种两人对弈的纯策略型棋类游戏,起源于中国古代的传统黑白棋种之一。

本次实验,我设计的是人机对弈游戏,棋盘规格为14*14,棋子放置于方格内,当某一方有五个棋子连成一条直线时,即为获胜者。

游戏者在完成一局后可以在界面上选择重新开始进行下一次游戏。

1.2用户界面该界面可以为游戏界面,可直接点击开始进行五子棋游戏,游戏者开始可以点击任意方格放置第一枚棋子,计算机也会随之放置棋子的,游戏会随着游戏者和计算机交替下棋而进行的。

游戏结束后,可以选择重新开始进行下一轮游戏,也可以点击结束离开游戏界面。

1.3使用方法通过在某一点点击鼠标选择你想要放置棋子的位置,来达到五子连珠的效果。

一局结束后,游戏者可以选择重新开始进行下一次游戏。

二.程序设计说明2.1 总体设计框架工程项目的主要框架式基于基于对话框的MFC平台,当工程创建成功之后,基类CDialog和派生类类CAboutDlg,CMyDlg已经创建成功。

从整个程序上来看可以分成以下几个主要的板块。

一,游戏机界面的设计:通过创建了按钮并设置属性来完成按钮所实现的功能。

二,实现加载位图和相应鼠标点击来设计游戏画面:通过CBitmap函数来加载bmp图片素材,当鼠标指向棋盘内显示手拿黑白棋子的位图,游戏者通过点击鼠标左键来放置棋子。

三,找出所有五子连珠的结果,并用数组标记出来。

四,计算计算机放置棋子的位置:通过评定计算机和游戏者的赢得可能性谁比较大,来选定计算机是防守还是进攻;然后计算计算机的最佳落子点,即权值最大点。

五,显示游戏界面:每当放置一个棋子,如果双方都没有赢,就显示当前页面。

如果任意一方获胜,则停止游戏,成一条线的棋子显示为红色,弹出对话框显示游戏结束。

程序执行流程:2.2 关键算法描述算法1:设置鼠标左键单击落下棋子。

五子棋实验报告

五子棋实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

五子棋实训报告

五子棋实训报告

五子棋实训报告五子棋实训报告篇一:(3)棋子的绘制与存储棋子的绘制用实心圆模式,颜色为黑色及白色两种。

棋子在内存中的存储方式:因为表示各个棋子的数据类型都相同,所以考虑用数组存储,因为棋盘是二维的,因此棋子用二维数组a存储。

a{ setTitle{ Objet obj = e.getSoure }toolbar = ne JPanel{ } publi int getX{ } publi intgetY{ } publi Color getColor{ } return olor; return ;return x; this.x = x; this. = ; this.olor = olor;篇四:实习报告-五子棋信息工程学院201X年毕业实习报告班级:计科XX 姓名:XXX实习地点:XXXXXX 实习12周-19周一、实习目的1. 夯实专业基础,提高动手能力。

把专业知识应用于实践,找出专业薄弱环节加强巩固。

3. 了解就业单位的计算机技术的应用情况、需求情况和发展方向及前景,培养实践能力、分析问题和解决问题的能力以及综合运用所学基础知识和基本技能的能力,同时也增强了适应社会的能力和就业竞争力。

4. 挖掘自身潜力,寻找自身不足,通过实践对未来做出合理规划。

二、实习任务在MElipse的平台上运用java语言,学习开发一个常用小游戏:五子棋。

三、实习计划5. 基础夯实,联系实践。

在信息高速发展的今天,计算机科学技术的重要性也在人们的日常生活中日益突显。

不管是从事理论教学还是从事软件的设计和开发,基础都是最有力的保障。

思想决定行动,认识决定成败。

没有正确的思想作为指导,行动就会陷入盲目和被动。

缺乏正确的认识基础,前途就会迷茫,方向就会迷失,机会就会丧失。

所以说,理论学习是我增强行动自觉的重要保证。

人常说:“经济基础决定上层建筑”专业基础对我来说就是经济基础,而上层建筑就是我们所从事的相关工作。

但是只拥有专业基础还是不行的,所以,我必须要把理论应用于实践。

五子棋游戏实验报告

五子棋游戏实验报告

五子棋游戏实验报告
一、实验介绍
本次实验选用 Python 语言,利用 PyGame 包来实现五子棋游戏的编程。

Python 是一种面向对象的脚本语言,有着优美的语法,能够让编码
者更加简单地操作和编写代码;而 PyGame 包是一种用于编写游戏的 SDK,能够容易地实现包括行走,操控,碰撞,声音等游戏功能。

二、实验内容
1.程序设计
(1)程序设计思想
首先,建立一个窗口,设置窗口的标题,宽,高,背景色,是否可见,是否最大化等属性,确定棋盘的大小,添加棋子,设置棋子的位置,绘制
棋盘,定义棋子的移动规则,定义判断胜负的函数,并编写相应的绘制函数。

(2)程序结构
程序的主要结构分为五部分:初始化、参数设定、棋子移动、胜负判
断和显示结果。

其中,初始化部分主要是载入 PyGame 包、设置屏幕的外
观等;参数设定是用来控制棋子的颜色、大小等;棋子移动部分主要是定
义每次移动棋子的策略;胜负判断是用来判断游戏结果;最后,显示结果
用来将游戏结果显示在屏幕上。

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

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

《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表示下的是黑棋还是白棋。

五子棋游戏报告

五子棋游戏报告

三、系统设计

白棋位置 是否超时 提示有棋 一方获胜 是否超时 判断是否有棋 黑棋是否获胜 白棋是否获胜 白方棋子 判断是否有棋 黑方棋子 提示有棋 黑棋位置


3.2流程图说明 本程序定义了各种操作函数,各种状态判断,思想明确, 思路清晰。各种判断选择了不同路径,因此输出的结果也 不一样。程序中“循环”的利用非常直接和清晰,双方交 替下棋,因此循环往复,最终决出胜负。分析中,也考虑 了很多种情况,针对各个情况均作出了相对措施和解决方 案。 程序采用循环进行双方交换下棋,并进行了多种判断。首 先判断下棋方是否超时,若一方超时,则判定另一方获胜。 若未超时,则继续进行。然后判断“黑”棋是否获胜,若 “黑”棋获胜,则输出黑方获胜;否则“白”棋下子,再 判断“白”棋是否获胜,若胜,输出白方获胜,若不是就 转入超时判断,若没超时会继续“黑”棋子下子,若是就 输出黑方获胜。如此循环往复…
五子棋游戏报告
一、需求分析 二、功能描述 三、系统设计 四、运行结果
一、需求分析
1.1总体分析 基于本游戏,首先得为整个棋盘建立一张表格 用以记录棋子信息,我们使用一个19*19的二 维数组allchess[19][19](15*15是五子棋棋盘 的大小),数组的每一个元素对应棋盘上的一 个交叉点,用0表示空位,1表示黑子,2表示 白子,这张表也是今后分析的基础。

1.2初始化 首先,建立盘面数组allchess[19][19],然后初 始化显示器、鼠标、键盘输入输出设备并在屏 幕上画出棋盘。 1.3主循环控制模块 控制下棋顺序,当轮到某方下棋时,负责将 程序转到相应的模块中去,主要担当一个调度 者的角色。

1.4玩家下子 当轮到玩家下时,您通过键盘或鼠标在棋盘上 落子,程序会根据该点的位置,在 allchess[19][19]数组的相应的地方记录“1” 或“2”,以表示该点是黑子或白子。 1.5胜负判断 无须多言,当一方的五个棋子横向、纵向或斜 向连成一线,该方即获胜。
  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相关方法与概念的理解。

相关文档
最新文档