五子棋Java实验报告及五子棋JAVA语言课程设计报告_第1页
五子棋Java实验报告及五子棋JAVA语言课程设计报告_第2页
五子棋Java实验报告及五子棋JAVA语言课程设计报告_第3页
五子棋Java实验报告及五子棋JAVA语言课程设计报告_第4页
五子棋Java实验报告及五子棋JAVA语言课程设计报告_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

PAGE20五子棋JAVA实验报告一、实验目的和要求1、能够用编程语言实现一个简单的五子棋程序2、在实际系统中使用、实现人工智能的相关算法3、进一步加深对人工智能算法的理解二、五子棋的基本常识与原理1、五子棋的起源五子棋,是一种两人对弈的纯策略型棋类游戏,亦称“串珠”、“连五子”;是中国民间非常熟知的一个古老棋种。相传,它起源于四千多年前的尧帝时期,比围棋的历史还要悠久。亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子孙后代中遍及开来。五子棋发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。传统五子棋的棋具与围棋相同,棋子分为黑白两色,棋盘为19X19,棋子放置于棋盘线交叉点上。两人对局,各执一色,轮流下一子,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。因为传统五子棋在落子后不能移动或拿掉,所以也可以用纸和笔来进行游戏。2、五子棋的基本常识与任何一种竞技棋一样,五子棋的每一局棋也分为三个阶段:开局,中局和残局。五子棋的开始阶段称为开局,或称布局。其开局阶段是十分短暂的,大约在七着与十几着之间。在这一阶段的争夺中,双方的布局,应对将对以后的胜负起着极为关键的作用。在开局阶段取得的形势好坏,主动与被动,先手与后手的优劣程度,往往直接影响中局的战斗。因此积极处理好开局和开局向中局的过渡十分重要。五子棋是从一至五,逐渐布子,发展连系,同时运用限制和反限制的智慧,在连子的过程中为自己的棋子争得相对的主动权和优势,逐步扩展优势,或者从劣势转化为优势,击溃对方的防线,最后连五取胜或抓禁手取胜或迫使对方投子认负。3、五子棋比赛的相关规定(1)职业连珠规则a.黑方先下子,白后下,从天元开始相互顺序落子。b.最先在棋盘横向、竖向、斜向形成连续的相同色五个棋子的一方为胜。c.黑棋禁手判负,白棋无禁手。黑棋禁手包括“三三”(包括“四三三”)、“四四”(包括“四四三”)、“长连”。即黑棋只能以“四三”取胜。有关术语解释请见图示说明。d.如分不出胜负,则定为平局。对局中拔子、中途退场均判为负。e.五连与禁手同时形成,判胜。(2)比赛中的规定和特例a.对局开始前,双方猜子,大数减小数,单数交换,偶数不换。b.白棋第一手(即盘面第二着棋)应在天元为界自己一侧布子,主要以示尊重对方,之后双方可任意行子。c.对局中双方应遵守“职业连珠五子棋规则”,如出现争议,应由裁判判定。d.对局中掉子(棋子掉落在棋盘上)的一方判负。如遇推子或蹭子,以盘面第一落点为准。用手将棋子扶正不算违规。e.对局中应礼貌行棋,防止不正常声音、动作影响对方思考。f..比赛结束后,双方应将各自棋子放回原处。g.对局中如黑方出现禁手,白方应立即指出禁手点,黑方即负。如白方在黑方出现禁手后,又下一步白子,黑棋禁手则不成立了。h.比赛对局时间,双方分别为15分钟、1小时、2小时、5小时四个等级标准,超时判负。(3)特殊规定职业五子棋虽然对黑棋采取了种种限制,但黑子先行的优势依然很大。因此,在高段位的职业比赛中,又出现了三种特殊的规定。a.指定打法:是指比赛双方按照约定好的开局进行对弈,由白棋先行。b.三手可交换:是指黑棋下盘面第3手棋后,白方在下第四手之前,如感觉黑方棋形不利于己方,可提出交换,即执白棋一方变为执黑棋一方,而黑方不可以不换。c.五手两打法:是指黑棋在下盘面上关键的第5手棋时,必须下两步棋,让白棋在这两步棋中拿掉一粒棋子,然后再继续对弈。一般说来,白棋肯定拿掉对白方不利的一点,而保留对黑方较为不利的那点让黑方行棋。三、五子棋的系统设计1、系统用例模型设计五子棋系统应该具有选择玩家先落子还是电脑先落子的功能,应该具有开始游戏和重新开始的功能,当然了,必须具有在玩家指定位置落子的功能。以上描述,用用例图在图1中做进一步描述。这部分功能,主要通过界面与系统的交互来实现。图1五子棋系统的玩家用例图各个用例,简单描述如下:选择电脑先落子:选择后,在游戏过程中,由电脑执黑子,先落子;玩家执白子,于电脑后落子;选择玩家先落子:选择后,在游戏过程中,由玩家执黑子,先落子;电脑执白子,于玩家后落子;落子:原则上说,只要不违反禁手规则,在玩家鼠标点击最近的落子点落子,但是在本系统中,简单起见,没有考虑禁手规则;开始游戏:选择后,根据设定的电脑还是玩家先落子,开始游戏;重新开始:在游戏途中,可以选择重新开始,中断游戏并重新开始游戏。同时,五子棋系统本身应该具有棋盘绘制、棋势扫描、棋势排序、棋势评估、择位落子,以及胜负判定的功能,尤其是对于棋势排序、棋势评估和择位落子,这里是体现五子棋系统人工智能(AI)的关键之处。以上描述,用用例图在图2中进一步描述。图2五子棋系统的系统用例图各个用例,简单描述如下:棋盘绘制:绘制19*19的棋盘及相关按钮和选项,并负责电脑、玩家落子后棋子的具体绘制;棋势扫描:扫描目前棋盘上的所有八个方向上的落子情况,获取整个对弈双方的棋势;棋势排序:对获取的八个方向的棋势(实际上下合一,左右合一,左下右上合一,坐上右下合一,为四个方向),进行排序,便于进行棋势评估;棋势评估:分别对电脑和玩家的棋势进行评估,量化棋势;择位落子:比较电脑和玩家的棋势,若有利于玩家,则采取“守、堵”的策略,若有利于电脑,则采取“攻、走”的策略;胜负判定:每次电脑或是玩家落子后,判断胜负情况,若出现“五子连珠”,则“连珠”一方取胜,另一方失败,游戏结束。2、系统界面设计为了实现玩家的用例所需要的功能,同时又便于使用,五子棋系统的界面设计得比较简单,如图3所示。整体界面为一个19*19的棋盘,在f-06、f-14、j-10、n-06、n-14这五个位置画了一个小方块,以提醒玩家棋盘的中央位置,便于把握有利位置落子。在棋盘的右侧是一些控制和提醒选项、按钮和对弈状态标签。其中,选项有“我是老大我先来”和“让让电脑也无妨”两个。选择前者,则玩家先落子;选择后者,则电脑先落子。按钮有“人机对战,快冲啊”和“不行了?那重来吧”两个。单击前者,则游戏开始;单击后者,则中断游戏,重新开始。标签有“就不告诉你是谁赢了”和“就不告诉你这是第几步”两个。前者是在游戏分出胜负后,显示是黑方取胜还是白方取胜;后者是在游戏过程中,不论是电脑落子还是玩家落子,都提示现在是第几步落子。图3五子棋系统界面3、系统模块设计为了实现五子棋系统本身具有的功能,将系统分为这几个模块:五子棋主模块、棋势扫描模块、棋势排序模块、棋势评估模块以及随机落子模块。其中,五子棋主模块实现棋盘绘制、胜负判定的功能,以及对弈过程中对比双方棋势的择位落子模块。棋势扫描模块、棋势排序模块、棋势评估模块分别实现棋势扫描、棋势排序、棋势评估的功能;而随机落子模块则实现在前两步棋势尚未形成时,电脑紧邻玩家落子位置随机择位落子的功能,是用例图中择位落子功能的一部分。对应的,系统一共有五个类,分别对应五个模块;分别为:五子棋主模块Gobang类、棋势扫描StatusScan类、棋势排序StatusSort类、棋势评估StatusEvaluation类,以及随机落子RandomPlay类。类图如图4所示。其中Gobang类中的属性和方法并没有完全列出,只列出了主要的属性和方法;其余类基本列出了所有的属性和方法。具体细节将在第四部分“五子棋的实现与测试”一节讨论,这里不再赘述。图4五子棋系统的类图四、五子棋的实现与测试1、Gobang类的实现Gobang类是五子棋的核心类,棋盘绘制、棋子落子,响应事件的处理,游戏的控制和模式设置,胜负判定,以及对棋势扫描、排序、评估等的调用都在这里实现。Gobang类的类图如图5所示。图5Gobang类类图其中棋盘的绘制,有paint()和init()来实现,棋子落子由setQizi()来实现,响应事件的处理也在这个类中添加监视器并处理,而游戏的控制和设置在Game_start()和Game_rastart()中实现,游戏胜负的判定由Judge()方法和四个判定不同方向上是否五子连珠的Game_win_*()函数来实现。而最为重要的棋势扫描、排序和评估,则由其属性scanp、scanc、sort、evaluatep、evaluatec分别调用它们的方法来实现。随机落子由属性randomPlay调用其方法实现。2、StatusScan类的实现StatusScan类通过扫描目前棋盘上的所有八个方向上的落子情况,获取整个对弈双方的棋势。StatusScan类的类图如图6所示。图6StatusScan类类图其中三维数组shape为一个20*20*5的数组,用来存储所获取的整个对弈双方的棋势。当然了,在实际实现中,实例化了两个StatusScan类的对象scanp和scanc,这两个对象分别用来存储玩家的棋势和电脑的棋势。而statusScan()方法具体实现从棋盘上获取整个棋势的具体过程,参数chesspad存储棋盘上的详细落子情况,参数colour决定需要获取的是黑方的棋势还是白方的棋势。具体扫描时,对于棋盘(i,j)处,有上下、左右、左下右上、坐上右下八个方向,但是统计时,将上下、左右、左下右上、左上右下分别合一,则一共有四个结果,分别存储在shape[i][j][0]、shape[i][j][1]、shape[i][j][2]、shape[i][j][3]中。3、StatusSort类的实现StatusSort类对StatusScan类扫描得到的棋势进行排序,以便于做进一步的棋势评估。StatusSort类的类图如图7所示。图7StatusSort类类图其中,StatusSort类只有一个方法statusSort(),参数shape即为StatusScan类扫描获取的棋势数据,该方法主要是对shape中的棋势数据进行排序,使得shape数组满足以下条件:排序后的结果仍然存储在shape数组中。4、StatusEvaluation类的实现StatusEvaluate类对StatusSort类排序过的棋势进行评估,为对弈时电脑择位落子提供依据。StatusEvaluate类的类图如图8所示。图8StatusEvaluate类类图其中,StatusEvaluate类也只有一个方法statusEvaluate(),参数shape即为StatusSort类排序后的棋势,该方法主要是根据棋盘上每一个位置(i,j)的棋势数据shap[i][j][0]、shap[i][j][1]、shap[i][j][2]以及shap[i][j][3]的取值,计算该位置的棋势评估值,并保存在shap[i][j][4]中。此外,还要比较每一个位置的棋势评估值,将最大的评估值记录在属性max中,相应的位置坐标记录在max_x和max_y中。5、RandomPlay类的实现RandomPlay类主要是在前两步,棋势尚未形成,在玩家落子后,电脑紧邻玩家落子位置,随机落子。RandomPlay类的类图如图9所示。图9RandomPlay类类图其中,方法randomPlay()方法具体实现这一过程,属性chesspad存储目前棋盘上的落子情况,参数a、b即为玩家最近一次的落子位置。randomPlay()方法通过检测随机数的值,分别在紧邻玩家落子(a,b)处的正上、正下、正左、正右、左下、右上、左上以及右下八个位置中的一个位置落子,最终选取的电脑落子位置,存储在属性x、y之中。6、五子棋系统的测试运行系统后,选择“让让电脑也无妨”,单击“人机对战,快冲啊”,开始游戏。游戏过程中,能够正确显示相关的游戏信息,如图10所示。图10系统运行截图从图中,可以看到“就不告诉你是谁赢了”标签显示的胜负信息“五子连珠白棋赢了”;而“就不告诉你这是第几步”标签显示进度信息“这是第13步”。进一步生成了可执行文件五子棋.jar,如图11所示,可执行文件将与实验报告、源代码一并提交。图11系统生成的可执行五子棋文件五、分析与总结通过五子棋实验,从分析、设计、编程、调试,到最后运行成功,自己得到了很多的锻炼。*************************************

实验报告实验名称:实验3访问控制学员:闫慧宁学号:09060100培养类型:军人硕士研究生年级:研一专业:计算机科学与技术所属学院:计算机学院指导教员:任江春职称:讲师实验室:103-南201实验日期:2010春国防科学技术大学训练部制

六、附录附录1在网上查阅资料时,看到这个帖子,作者将自己的五子棋心得以一种非常有趣的形式展现出来:前序、四个对联、后记;乐一乐的同时,也有不小的收获,一并附于此,作为五子棋实验的一个意外收获。前序区区字奴,小小网虫,痴四书,迷五子,乐此不疲。于联众蒙诸友赐教,学得棋技少许,术语若干,不胜心痒,试以韵笔题之,略有小得。是以联句做文,集成发贴,唯愿感者留其言,评者留其论,亦酬伤神,亦慰呕心。之一黑子落,白子落,棋乐陶陶任蹉跎,胜,能如何?败,能如何?方寸纹枰自淡泊,心平气和。先手措,后手措,棋道漫漫细求索,得,有什么?失,有什么?过去未来共斟酌,知足常乐。横批:以和为贵之二纵驰奔,横驰奔,各施韬略斗奇阵,连,可生根?跳,可生根?优劣一子变风云,三思谨慎。阴线纹,阳线纹,各藏玄机备异军,冲,可细寻?活,可细寻?胜负一瞬转乾坤,五星怡神。横批:心正棋明之三直指路,斜指路,世事如棋万千途,求,是何苦?弃,是何苦?烦恼岁月忘沉浮,难得糊涂。攻式促,守式促,人生如棋无尽处,逞,几时悟?馁,几时悟?坎坷光阴等闲度,漫卷诗书。横批:宁静致远之四老棋迷,小棋迷,相欢一线牵万里,聚,谈何易?散,谈何易?网络现实两依依,珍重友谊。新棋友,旧棋友,三五知音遍神州,逢,曾记否?别,曾记否?游戏人生两悠悠,真情永久。横批:乐在棋中后记未虑平仄,难对词性,非诗非赋,亦联亦词,笔随心动,疏漏百出。吾虽无才,但喜交雕文之友,亦拜一字之师,盼观添花妙笔,求闻回春妙方,可畅胸怀,可足平生。《Java语言程序设计》课程设计报告学院:信息科学技术学院班级:软件技术2班姓名:学号:指导教师:课设时间:20**-03-17至20**-03-26二OXX年三月二十六日

目录一、设计要求…………2二、设计步骤…………22.1程序流程图………….…………...22.2程序的功能分配……….………...3三、设计正文…………63.1创建棋盘类……….63.2判断输赢功能实现……………….93.3测试结果………9四、心得体会…………...12五、参考文献…………...12附录(源代码)……….13一、课程设计要求设计一个15╳15围棋棋盘,由两玩家交替进行对战,并可以实现以下功能:1.选择落子的先后顺序2.重置棋盘3.刷新重新开始4.退出提示并且规定退出者判为负,但退出过程中要有提示。以防不小心点错了。最后判断某一方是否为五子连珠。实现一个简单的多用户五子棋的游戏程序,包括如下两个界面(1)选择对弈桌(执黑、执白)。(2)在游戏界面,有开始,退出(游戏未结束、点退出自动判负);二、设计步骤2.1程序流程图2.2程序的功能分配a.棋盘的绘制publicvoiddraw_qipan(GraphicsG)//画棋盘15*15{ G.setColor(Color.lightGray); G.fill3DRect(10,10,300,300,true); G.setColor(Color.black); for(inti=1;i<16;i++){ G.drawLine(20,20*i,300,20*i); G.drawLine(20*i,20,20*i,300); }}b.添加按钮Buttonb1=newButton("开始"); Buttonb2=newButton("重置游戏"); LabellblWin=newLabel(""); CheckboxckbHB[]=newCheckbox[3]; Buttonexist=newButton("退出"); publicvoidinit(){ ckbHB[0]=newCheckbox("执白",ckgHB,false); ckbHB[1]=newCheckbox("执黑",ckgHB,false); ckbHB[2]=newCheckbox("观看",ckgHB,false); }c.鼠标棋子的触发事件publicvoidmouseClicked(MouseEvente){ Graphicsg=getGraphics(); intx1,y1; x1=e.getX(); y1=e.getY(); if(e.getX()<20||e.getX()>300||e.getY()<20||e.getY()>300){ return; } if(x1%20>10){ x1+=10; } if(y1%20>10){ y1+=10; } x1=x1/20*20; y1=y1/20*20; set_Qizi(x1,y1); m*=(-1);}d.按钮的触发事件publicvoidactionPerformed(ActionEvente){ Graphicsg=getGraphics(); if(e.getSource()==b1){ Game_start(); } else{ Game_re(); } if(e.getSource()==exist){ Game_re(); lblWin.setText(Get_qizi_color(color_Qizi)+"输了!"); intGame_Start=0; }e.判断落子的位置及画出相应的黑白棋子publicvoidset_Qizi(intx,inty)//落子{ if(intGame_Start==0)//判断游戏未开始{ return; } if(intGame_Body[x/20][y/20]!=0){ return; } Graphicsg=getGraphics(); if(color_Qizi==1)//判断黑子还是白子{ g.setColor(Color.black); color_Qizi=0; } else{ g.setColor(Color.white); color_Qizi=1; } g.fillOval(x-10,y-10,20,20); intGame_Body[x/20][y/20]=color_Qizi+1;}f.判断胜负if(Game_win_1(x/20,y/20))//判断输赢1{ lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0; } if(Game_win_2(x/20,y/20))//判断输赢2{ lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0; } if(Game_win_3(x/20,y/20))//判断输赢3{ lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0; } if(Game_win_4(x/20,y/20))//判断输赢4{ lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0; }}三、设计正文3.1创建棋盘类PublicclassWcyChessextendsAppletimplementsActionListener,MouseListener,MouseMotionListener,ItemListener{ intcolor_Qizi=0;//旗子的颜色标识0:白子1:黑子 intintGame_Start=0;//游戏开始标志0未开始1游戏中 intintGame_Body[][]=newint[16][16];//设置棋盘棋子状态 intm=-1; Buttonb1=newButton("开始"); Buttonb2=newButton("重置游戏"); LabellblWin=newLabel(""); CheckboxckbHB[]=newCheckbox[3]; Buttonexist=newButton("退出"); CheckboxGroupckgHB=newCheckboxGroup(); NetchatClientchat=newNetchatClient(); publicvoidinit(){ setLayout(null); addMouseListener(this); add(b1); b1.setBounds(330,50,80,30); b1.addActionListener(this); add(b2); b2.setBounds(330,90,80,30); b2.addActionListener(this); ckbHB[0]=newCheckbox("执白",ckgHB,false); ckbHB[0].setBounds(320,20,60,30); ckbHB[1]=newCheckbox("执黑",ckgHB,false); ckbHB[1].setBounds(380,20,60,30); ckbHB[2]=newCheckbox("观看",ckgHB,false); add(ckbHB[0]); add(ckbHB[1]); add(ckbHB[2]); ckbHB[0].addItemListener(this); ckbHB[1].addItemListener(this); add(lblWin); lblWin.setBounds(330,180,80,30); lblWin.setBackground(Color.red); lblWin.setText("胜利者!");//没有显示? ckbHB[2].setBounds(440,20,60,30); add(exist); exist.setBounds(330,130,80,30); exist.addActionListener(this);// add(chat);chat.setBounds(20,500,300,300); chat.frame(); chat.setVisible(true); Game_start_csh(); setSize(500,600); setVisible(true); } publicvoiditemStateChanged(ItemEvente){ if(ckbHB[0].getState())//选择黑子还是白子{ color_Qizi=0; } else{ color_Qizi=1; } } publicvoidmousePressed(MouseEvente){} publicvoidmouseClicked(MouseEvente){ Graphicsg=getGraphics(); intx1,y1; x1=e.getX(); y1=e.getY(); if(e.getX()<20||e.getX()>300||e.getY()<20||e.getY()>300){ return; } if(x1%20>10){ x1+=10; } if(y1%20>10){ y1+=10; } x1=x1/20*20; y1=y1/20*20; set_Qizi(x1,y1); m*=(-1); } publicvoidactionPerformed(ActionEvente){ Graphicsg=getGraphics(); if(e.getSource()==b1){ Game_start(); } else { Game_re(); } if(e.getSource()==exist){ Game_re(); lblWin.setText(Get_qizi_color(color_Qizi)+"输了!"); intGame_Start=0; } } publicvoidmouseEntered(MouseEvente){} publicvoidmouseExited(MouseEvente){} publicvoidmouseReleased(MouseEvente){} publicvoidmouseDragged(MouseEvente){} publicvoidmouseMoved(MouseEvente){} publicvoidpaint(Graphicsg){ draw_qipan(g);}3.2判断输赢功能实现if(Game_win_1(x/20,y/20)){//判断输赢1 lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0;}if(Game_win_2(x/20,y/20)){//判断输赢2 lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0;} if(Game_win_3(x/20,y/20))//判断输赢3{ lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0;} if(Game_win_4(x/20,y/20))//判断输赢4{ lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0;}3.3测试结果a.进入游戏界面游戏开始的界面有三个选择项,用户可以选择相应的角色,选择完毕后点击开始进入游戏。b.选择角色,开始下棋首先达到五个棋子连在一块的赢了,并在红色区域显示谁赢了!c.下完后,重新开始下完一盘后游戏停止,点击重新开始,界面回到初始界面,选择角色继续游戏.d.游戏中点退出,自动判输在下棋的过程当中谁中途退出,即点击退出,系统自动判断谁输

四、课程设计心得体会通过此次课程设计,将我本学期所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很到问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。它还让我学会了在网上查阅那些无限的资料。由于自己的分析设计和程序经验不足,该系统设计和实现过程中,还有许多没有完善的地方,比如用户界面设计不够美观,异常出错处理比较差等多方面问题,这些都有待进一步完善和提高。对于文中出现的不足和系统中出现的问题敬请老师指导。五、参考文献1.吴其庆编著.Java程序设计实例教程.北京:冶金工业出版社2.柳西玲.许斌编著.Java语言应用开发基础.北京:清华大学出版社3.丁振凡Java语言实用教程:北京邮电大学出版社附录(源代码)import.*;importjava.io.*;importjava.applet.*;importjava.awt.*;importjava.awt.event.*;importjava.applet.Applet;importjava.awt.Color;PublicclasswuziqiextendsAppletimplementsActionListener,MouseListener,MouseMotionListener,ItemListener{intcolor_Qizi=0;//旗子的颜色标识0:白子1:黑子intintGame_Start=0;//游戏开始标志0未开始1游戏中intintGame_Body[][]=newint[16][16];//设置棋盘棋子状态intm=-1;Buttonb1=newButton("开始");Buttonb2=newButton("重新开始");LabellblWin=newLabel(""); CheckboxckbHB[]=newCheckbox[3]; Buttonexist=newButton("退出"); CheckboxGroupckgHB=newCheckboxGroup(); publicvoidinit(){ setLayout(null); addMouseListener(this); add(b1); b1.setBounds(330,50,80,30); b1.addActionListener(this); add(b2); b2.setBounds(330,90,80,30); b2.addActionListener(this); ckbHB[0]=newCheckbox("执白",ckgHB,false); ckbHB[0].setBounds(320,20,60,30); ckbHB[1]=newCheckbox("执黑",ckgHB,false); ckbHB[1].setBounds(380,20,60,30); ckbHB[2]=newCheckbox("观看",ckgHB,false); add(ckbHB[0]); add(ckbHB[1]); add(ckbHB[2]); ckbHB[0].addItemListener(this); ckbHB[1].addItemListener(this); add(lblWin); lblWin.setBounds(330,180,80,30); lblWin.setBackground(Color.red); lblWin.setText("胜利者!");//没有显示? ckbHB[2].setBounds(440,20,60,30); add(exist); exist.setBounds(330,130,80,30); exist.addActionListener(this); Game_start_csh(); setSize(500,600); setVisible(true); } publicvoiditemStateChanged(ItemEvente){ if(ckbHB[0].getState())//选择黑子还是白子 { color_Qizi=0; } else { color_Qizi=1; } } publicvoidmousePressed(MouseEvente){} publicvoidmouseClicked(MouseEvente){ Graphicsg=getGraphics(); intx1,y1; x1=e.getX(); y1=e.getY(); if(e.getX()<20||e.getX()>300||e.getY()<20||e.getY()>300){ return; } if(x1%20>10){ x1+=10; } if(y1%20>10){ y1+=10; } x1=x1/20*20; y1=y1/20*20; set_Qizi(x1,y1); m*=(-1) } publicvoidactionPerformed(ActionEvente){ Graphicsg=getGraphics(); if(e.getSource()==b1){ Game_start(); } else{ Game_re(); } if(e.getSource()==exist){ Game_re();// color_Qizi=m; lblWin.setText(Get_qizi_color(color_Qizi)+"输了!"); intGame_Start=0; } } publicvoidmouseEntered(MouseEvente){} publicvoidmouseExited(MouseEvente){} publicvoidmouseReleased(MouseEvente){} publicvoidmouseDragged(MouseEvente){} publicvoidmouseMoved(MouseEvente){} publicvoidpaint(Graphicsg){ draw_qipan(g); } publicvoidset_Qizi(intx,inty){//落子 if(intGame_Start==0){//判断游戏未开始 return; } if(intGame_Body[x/20][y/20]!=0){ return; } Graphicsg=getGraphics(); if(color_Qizi==1){//判断黑子还是白子 g.setColor(Color.black); color_Qizi=0; } else{ g.setColor(Color.white); color_Qizi=1; } g.fillOval(x-10,y-10,20,20); intGame_Body[x/20][y/20]=color_Qizi+1; if(Game_win_1(x/20,y/20)){//判断输赢1 lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0; } if(Game_win_2(x/20,y/20)){//判断输赢2{ lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0; } if(Game_win_3(x/20,y/20)){//判断输赢3 lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0; } if(Game_win_4(x/20,y/20)){//判断输赢4 lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0; } } publicStringGet_qizi_color(intx) { if(x==0) { return"黑子"; } else { return"白子"; } } publicvoiddraw_qipan(GraphicsG){//画棋盘15*15 G.setColor(Color.lightGray); G.fill3DRect(10,10,300,300,true); G.setColor(Color.black); for(inti=1;i<16;i++){ G.drawLine(20,20*i,300,20*i); G.drawLine(20*i,20,20*i,300); } } publicvoidGame_start(){//游戏开始 intGame_Start=1; Game_btn_enable(false); b2.setEnabled(true); } publicvoidGame_start_csh(){//游戏开始初始化 intGame_Start=0; Game_btn_enable(true); b2.setEnabled(false); ckbHB[0].setState(true); for(inti=0;i<16;i++){ for(intj=0;j<16;j++){ intGame_Body[i][j]=0; } } lblWin.setText(""); } publicvoidGame_re(){//重新开始游戏 repaint(); Game_start_csh(); } publicvoidGame_btn_enable(booleane){//设置组件状态 b1.setEnabled(e); b2.setEnabled(e);

温馨提示

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

评论

0/150

提交评论