java课程设计实验报告自娱自乐五子棋.docx
- 文档编号:4817869
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:22
- 大小:270.55KB
java课程设计实验报告自娱自乐五子棋.docx
《java课程设计实验报告自娱自乐五子棋.docx》由会员分享,可在线阅读,更多相关《java课程设计实验报告自娱自乐五子棋.docx(22页珍藏版)》请在冰点文库上搜索。
java课程设计实验报告自娱自乐五子棋
Java课程设计说明书
----五子棋小游戏
院系;管理学院
专业班级:
信管151
学生学号:
************
********************
********
日期2017.01.05
成绩:
指导老师签名:
批改日期:
课程设计的目的
学习任何知识得目的都是要将它运用到实践中去,所以我们要运用已有的知识,独立得将这个课程设计完成,只有这样,我们才能将知识变成本领,变成属于自己得东西,通过一个学习得学习,我们已经有可一定得Java基础,现在我们就要利用这些基础,来完成课程设计。
这次课程设计我主要研究了利用已学的Java知识编辑一个五子棋小游戏。
通过此次课程设计,来巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、JCreator等开发工具的运用,拓宽常用类库的应用。
课程设计思路
(1)棋盘界面设计
在对棋盘界面设计方面要考虑简洁友好,符合游戏者需求。
棋子的设计方面系统中设置了两种棋子颜色,yellow或者red, 游戏者可自行选择。
棋子怎样画出来,怎样使棋子按我们所想的方式来绘制出来是设计的主要难题。
运行时要求当每次点击鼠标的时候就在点击鼠标的地方画一个棋子,所以得定义一个棋子的类使点击鼠标时系统把棋子绘制出来。
这样主界面里的棋子就确定了,而且也确定了几个所需要的类。
可以先定义好这些类了。
有了以上的准备就可以把棋盘绘制出来了,下棋时每次在适当位置点击鼠标的时候就在所点击的位置上画出你这个角色的颜色,然后计算机会自动的下棋,计算机自动下棋要有一个控制变量来控制能不能下棋。
人可以随意的下子,可是计算机就要计算在哪个位置下子了。
这里由计算机下子的算法来确定,人人对战的话就不象单机游戏一样,要计算机来判断人下子之后计算机下那一个地方了,人人对战只要在双方下子的时候判断赢棋情况,当然还要同步的控制两个人下棋的顺序,这样的话就要用到线程了,各自都继承或实现线程类或接口,以便各自能随时单独控制接发消息。
(2)算法设计
对于五子棋游戏,无论人机对战,还是双人对战,都需要判断棋盘上是否存在五子连珠情况,这既是游戏名字的由来,也是游戏结束的标志。
判断五子连珠的原理是从横,竖,左斜线,右斜线4条线上判断是否存在5个相连的同类棋子。
对战一方落子后,在该处向8个方向检测连续的同类棋子,如果检测到直线方向上存在5个连续的同类棋子(包含本位置棋子),则判断为“连五”并结束检测循环。
基于检测结果,可以判断游戏是否结束,并根据获胜方的落子代码判断获胜方是谁。
由于不考虑禁手问题,在实现“连五”过程中,我们可以考虑完成“双四”,“四三”,“双三”,“冲四”,“活三”,“活四”来实现目的。
(3)五子棋规则
(1)本游戏可选择人与人对战模式。
(2)下法:
两人分别执黑白两色棋子,轮流在棋盘上选择一个无子的交叉点落子,无子的交叉点又被称为空点。
(3)输赢判断:
黑、白双方有一方的五个棋子在横、竖或斜方向上连接成一线即为该方赢。
程序流程图
黑方白方
胜利未分出胜利
程序的设计方法
程序中主要方法的说明
1.ChessPad() 的返回类型是初始化棋盘, 功能是设置棋盘颜色。
2. Void paint (Graphics g) 的返回类型是对棋子等图像进行初始化,功能是设置棋子大小,颜色等。
3.Public void mousePressed(MouseEvent e)的返回类型是鼠标的实践监听,功能是单击实践。
4.public void paint(Graphics g) 的返回类型是画出图像,功能是控制图像的大小范围。
5.public void mousePressed(MouseEvent e)的返回类型是处理按下鼠标的事件,功能是选中下棋的位置。
6.public void mouseReleased(MouseEvent e) 的返回类型是处理鼠标离开的事件,功能是本步下棋结束。
7.public void mouseExited(MouseEvent e) 的返回类型处理鼠标离开棋盘时,功能是鼠标离开组件不实现任何事件 。
8.public void mouseClicked(MouseEvent e) 的返回类型是处理发生单击的事件,功能是实现下棋以及重新开始游戏 。
程序中类及成员变量的说明
类表及其子类父类
1.ChessFrame 类的作用是创建五子棋游戏主窗体和菜单,父类是 JFrame 。
2.ChessModel 类的作用是实现了整个五子棋程序算法的核心 。
3. MainPanel 类的作用是构建一个面板,在该面板上画上棋盘;处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等) ,父类是JPanel 。
4.ChessWindowEvent 类的作用是事件响应 ,父类是WindowAdapter。
主要成员变量(属性)
1.Int i 的描述是控制棋子颜色。
2.Button Button 的描述是重新开局。
3.TextField text_1 的描述是请黑棋下子
4.TextField text_2 的描述是请白棋下子 。
5.TextField text_3的描述是这是第"+i+"步 。
java源文件及其功能
1.Chess的功能是本程序的主函数,初始化棋盘 。
2. Autoplay 的功能是实现电脑可以自动下棋 。
3. Scan 的功能是扫描整个棋盘记录连在一起的黑白棋子数 ,为判断胜负服务。
4. Sort 的功能是实现人与电脑有次序的下棋。
5.Judge的功能是判断人与人之间的胜负。
6. Evaluate 的功能是电脑估计 ,为电脑下棋提供帮助。
五子棋游戏中的注册监听
1.对角色选择按钮注册ActionListener监听,设置用户的角色。
定义黑子int类型 0,白子1。
2.对按钮开始、重置注册ActionListener监听,如果点击开始,用户进 入下棋状态,有一方赢了,棋盘上则不能再点击棋子。
点击重置,则开始新的一轮。
3.对鼠标注册mouseClicked监听,鼠标点击棋盘时获取下棋的位置。
4.class ServerThread implements Runnable{ }类监听线程,监听是否有客户端法过信息来。
(1)属性:
Vector threads 向量存储线程,Socket socket 服务端口,DataInputStream in 输入流,DataOutputStream out 输出流,int nid 用户ID。
(2)方法:
构造器public ServerThread(Socket socket,Vector threads),实现信息的输入、输出,和public void run()监听客户端是否发信息过来,当客户离开时向,其他客户发信息,把客户端的信息发给其他客户。
游戏整体设计
(1)五子棋的游戏主界面
五子棋主界面包括ChessBot.java,ChessMap.java,ChessPanel.java和Console.java四个文件。
ChessMap是该五子棋游戏的主运行类,其中有运行整个程序的main方法,该文件生成了ChessMap类的一个实例,从而生成了五子棋游戏的界面ChessMap类将所有的功能集中到菜单栏中,并通过调用其他模块来实现五子棋游戏的各个功能。
(2)机器人部分的设计
机器人部分的设计是由ChessBot.java类来实现的。
该java类首先导入了三个函数,分别是math,lang和awt。
该程序定义了棋盘的边长,棋盘的边长通过定义一个私有的int型变量来实现。
将机器人定义成一个方法,通过0和1来确定按下的棋子是机器人自己下的,还是敌人的棋子。
该ChessBot类中还包括了重开一局的方法,该方法通过for循环语句来实现,即重置棋子。
另外一个方法是悔棋,悔棋同样是通过for语句循环来实现,首先通过二维数组算出最后一步棋下的位置,然后通过Step--实现。
最后一个方法是计算当前位置type方是否有nn子相连,相连的情况。
当横向五子连珠,纵向五子连珠,左斜线五子连珠或者是右斜线五子连珠时,比赛结束,同时显示出获胜方的棋子颜色。
四种方向的连珠用for循环语句分别写出其二维数组也就是棋子的位置,从而进行判断棋子有几个棋子相连。
使用endfor语句结束for循环,利用return语句,重复判断棋子的位置以及是否连珠。
(3)五子棋面板的设计
首先导入awt等java包。
ChessPanel继承JPanel的属性类。
定义一系列的私有变量,如棋盘的背景位图,黑棋子的位图,白棋子的位图,以及插入棋子的位置。
该java包还调用了重开一局的方法,以及悔棋的方法。
public void showMousePos(Point p)是用来调试用,显示鼠标位置。
public Point addChess(int x,int y,int type)是调试下一步棋,参数为插入点像素坐标。
public Point addChess(int x,int y,int type,boolean isMatrix)实现的功能是算下一步棋,isMatrix位true参数为插入点棋格坐标,否则参数为插入点像素坐标。
当游戏结束的时候使用Graphics g调用方法,在游戏过程中如果是黑方或是白方获胜在棋盘中就会显示是哪方获胜。
设计结果与分析
当进入到游戏当中可以选择是哪个颜色的棋先出,选择好之后便可以单机开始进行下棋,如果在游戏过程中出现什么问题可以单机再来一局重新开始游。
五子棋游戏的主界面如图所示:
设计体会
通过这次课程设计,我进一步加深对基础理论的理解,扩大专业知识面,对收集资料、查阅文献、方案制定等实践方面得到了很好的锻练,促进对所学知识应用能力的提高。
同时我渐渐的复习了Java使用方法和编程语法,之后的编程过程也相对得心应手,基本完成了预期计划的要求。
在此感谢我的指导老师—原玥老师,她在课题的研究上不遗余力的给予指导。
她严谨的治学态度深深的影响了我,使我受益匪浅!
这个课设题对我来说有一定的挑战性,因为我自己也不知道自己到底学到了一个什么样的境界。
但可以肯定,这个课设题的要求绝对在我的能力范围以上。
之所以选择这个题目是想逼着自己去查更多的资料,学到更多的东西。
结果也确实是这样的,我在这次课设中学到了不少东西,也理解了许多原来不理解的东西。
尽管这个系统做的并不是那么的完善。
对于Java中的引用,初始化类等,开始我并不是非常的理解,知道就这么做就能实现相应的功能了,并没有很深刻的去理解它为什么要这么做。
但是真正的要用Java去做一个东西不理解它是不行的,而且其间这课设涉及到了Java 中的绝大多数的知识点,如Java图形用户界面设计、Java中的多线程程序设计、Java输入输出流,要应用这些东西更要求我去好好理解Java的这些规则。
经过了长时间的反复编写调试,课本和网上查阅相关资料相关文章,终于完成了整个课程设计。
在这个过程中,在把书本上的知识给系统的复习了一下的同时,同时也发现了自己的太多不足,对JAVA语言整体知识构架不够熟悉,不能灵活地运用所学的知识点。
自己的编程方式也不是太标准,经常出现代码写错而调试很久的低级错误情况出现。
在这次课程设计中,我明白了编写程序,不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。
还要熟悉常用的编程技巧和编程思想,不能只关心程序的运行结果,更要注重程序代码的结构,编程者更要有严谨地态度。
还有通过设计过程中大量地查阅网络文章,对一些关键知识点逐个地了解并解决相关问题
参考文献
[1]陈国君,陈磊,刘洋.Java2程序设计基础[M]北京:
清华大学出版社 2009
[2] 埃史尔,陈昊鹏.Java编程思想(第4版)[M].北京:
机械工业出版社 2007
[3] 李钟尉,马文强,陈丹丹.Java从入门到精通[M].北京:
清华大学出版社 2008
[4] Y.Daniel Liang,万波,郑海红,潘蓉.Java语言程序设计:
基础篇(原书第6版)[M].北京:
机械工业出版社 2008
[5] Ian F.Darwin,关丽荣,张晓坤.Java经典实例(第2版)[M].北京:
中国电力出版社 2009
[6]丁振凡.Java语言实用教程[M].北京:
北京邮电大学出版社 2005
[7]张广彬,孟红蕊,张永宝.Java课程设计案例精编[M].北京:
清华大学出版社 2005
附录:
程序源代码
importjava.awt.Checkbox;
importjava.awt.CheckboxGroup;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.ItemEvent;
importjava.awt.event.ItemListener;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjavax.swing.JButton;
importjavax.swing.JCheckBox;
importjavax.swing.JFrame;
importjavax.swing.JPanel;
publicclassFivCheseextendsJFrame{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
CheseGameCG;
FivChese(){
this.CG=newCheseGame();
addMouseListener(CG);
add(CG);
}
publicstaticvoidmain(String[]args){
FivChesefivechese=newFivChese();
fivechese.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fivechese.setSize(900,900);
fivechese.setTitle("雷晓设计的五子棋");
fivechese.setVisible(true);
fivechese.setResizable(true);
}
}
classCheseGameextendsJPanelimplementsMouseListener,ItemListener{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
int[][]map=newint[20][20];
Color[]color={Color.BLACK,Color.WHITE,Color.LIGHT_GRAY};
//棋子坐标
intx=-1;
inty=-1;
//判定是白棋还是黑棋
intflag=1;
//判定胜负
intwinner=3;
JButtonbtn1=newJButton("开始");//游戏开始
JButtonbtn2=newJButton("再来一局");//游戏重置
inti;
intj;
//确定白棋先还是黑棋先
CheckboxGroupcbg=newCheckboxGroup();
Checkboxchb1=newCheckbox("黑棋先开始",cbg,true);Checkboxchb2=newCheckbox("白棋先开始",cbg,false);
@Override
publicvoiditemStateChanged(ItemEventie){
//thrownewUnsupportedOperationException("Notsupportedyet.");
if(chb1.getState()){
flag=1;
}
else
{
flag=2;
}
}
classGameStartimplementsActionListener{
publicvoidactionPerformed(ActionEventae){
if(ae.getSource()==btn1)//str.equals("Start")
{
start();
repaint();
btn1.setEnabled(false);
btn2.setEnabled(true);
chb1.setEnabled(false);
chb2.setEnabled(false);
}
if(ae.getSource()==btn2){
start();
repaint();
chb1.setEnabled(true);
chb2.setEnabled(true);
}
}
}
CheseGame()
{
this.setLayout(null);
chb1.setBounds(650,50,100,30);
chb2.setBounds(650,100,100,30);
chb1.addItemListener(this);
chb2.addItemListener(this);
btn1.setBounds(650,150,100,30);
btn1.addActionListener(newGameStart());
btn2.setBounds(650,200,100,30);
btn2.addActionListener(newGameStart());
btn2.setEnabled(false);
this.add(btn1);
this.add(btn2);
this.add(chb1);
this.add(chb2);
}
voidstart()
{
for(inti=0;i<20;i++)
for(intj=0;j<20;j++)
map[i][j]=0;
winner=0;
}
Booleanwin(intx,inty)
{
intscore=1;
for(inti=x;i { if(i==19) break; if(map[i][y]! =map[++i][y]) break; score++; } for(inti=x;i>x-4;)//横向x-- { if(i==0) break; if(map[i][y]! =map[--i][y]) break; score++; } if(score>=5) returntrue; else score=1; for(intj=y;j { if(j==19) break; if(map[x][j]! =map[x][++j]) break; score++; } for(intj=y;j>y-4;)//纵向y-- { if(j==0) break; if(map[x][j]! =map[x][--j]) break; score++; } if(score>=5) returntrue; else score=1; for(inti=x;i for(intj=y;j { if(i==19||y==19){ i=x+4;break; } if(map[i][j]! =map[++i][++j]) { i=x+4; break; } score++; } for(inti=x;i>x-4;)//斜向x--、y-- for(intj=y;j>y-4;) { if(i==0||j==0){ i=x-4;break;} if(map[i][j]! =map[--i][--j]) { i=x-4; break; } score++; } if(score>=5) returntrue; else score=1; for(inti=x;i>x-4;)//斜向x--、y++ for(intj=y;j { if(i==0||j==19){ i=x-4; break; } if(map[i][j]! =map[--i][++j]) { i=x-4; break; } score++; } for(inti=x;i for(intj=y;j>y-4;) { if(i==19||j==0) { i=x+4;break;} if(map[i][j]! =map[++i][--j]) { i=x+4; break; } score++; } if(score>=5) returntrue; else returnfalse; } publicvoidpaintComponent(Graphicsg) { super.paintComponent(g); setBackground(color[2]); //画棋盘 for(inti=1;i<=20;i++) { g.setColor(color[0]); g.drawLine(30,i*30,600,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 课程设计 实验 报告 自娱自乐 五子棋