围棋对弈界面课程设计.docx
《围棋对弈界面课程设计.docx》由会员分享,可在线阅读,更多相关《围棋对弈界面课程设计.docx(27页珍藏版)》请在冰豆网上搜索。
![围棋对弈界面课程设计.docx](https://file1.bdocx.com/fileroot1/2023-6/10/2f6304a8-d3ae-4576-9874-0dd01be1aa57/2f6304a8-d3ae-4576-9874-0dd01be1aa571.gif)
围棋对弈界面课程设计
课程设计(论文)任务书
理学 院 光信息专 业2班
一、课程设计(论文)题目 围棋对弈界面设计
二、课程设计(论文)工作自2016年6月27日起至2017年7月1日止。
三、课程设计(论文)地点:
8-605
四、课程设计(论文)内容要求:
1.本课程设计的目的
(1)使学生掌握软件开发的基本工作流程;
(2)巩固JAVA程序设计课程所学的内容;
(3)培养学生的计算机思维能力以及合作的精神;
(4)培养学生分析、解决问题的能力;
(5)提高学生的科技论文写作能力。
2.课程设计的任务及要求
1)基本要求:
[1]掌握Frame,Panel等容器的使用
[2]掌握AWT图形绘制的常用方法。
[3]掌握java的事件监听机制,理解相关角色及相互关系。
[4]熟悉按钮和鼠标事件的处理。
[5]完成类围棋对弈界面设计。
界面参考如图1所示。
[6]功能至少包含:
a)能用颜色选择对话框改变棋盘背景颜色;
b)实现黑白棋子轮流落子;
c)显示游标即游标轨迹擦除;
d)显示下棋所用时间。
学生需分析课程设计任务,进行系统需求分析;并对系统进行总体设计,
分解系统功能模块;实现各功能模块代码,进而组装各模块,并测试、完善系统。
图1围棋对弈界面
2)创新要求:
实现更复杂的界面控制,提供更多的围棋对弈功能等,并提高系统的容错能
力,完善系统功能,进行代码优化。
3)课程设计论文编写要求
课程设计报告的撰写要求表述简明,图表准确。
报告按如下内容和顺序用A4纸进行打印并装订成册。
(1)封面
采用统一的课程设计封面,并按要求填写好封面要求的个人信息。
(2)设计任务书
(3)评阅书
(4)目录
(5)正文
(6)主要参考文献
4)答辩及评分标准:
(1)达到课程设计的目的及要求,程序的可读性较好,并调试正确,50分;
(2)能正确回答设计中老师所提问题,可增加10分;
(3)课程设计报告书写规范整齐,可增加20分;
(4)心得体会认真总结,可增加10分;
(5)程序有创新性,可增加10分;
5)参考文献:
(1)丁振凡.《Java语言程序设计实用教程(第二版)》.北京:
清华大学出版社,2014.
(2)印旻.《Java语言及面向对象程序设计》.北京:
清华大学出版社,2000.
(3)周晓聪.《面向对象程序设计及Java语言》.北京:
机械工业出版社,2004.
(4)
6)课程设计进度安排
内容天数 地点
系统总体设计1 实验室,图书馆
软件设计及调试2 实验室、图书馆
答辩及撰写报告2 实验室、图书馆
学生签名:
2016年6月27日
课程设计(论文)评审意见
(1)课程设计过程(20分):
优( )、良( )、中( )、一般( )、差( );
(2)是否完成调试,系统运行效果(30分):
优( )、良( )、中( )、一般( )、差( );
(3)回答问题及创新(20分):
优( )、良( )、中( )、一般( )、
差( );
(4)课程设计报告(30分):
优( )、良( )、中( )、一般( )、差( );
评阅人:
职称:
2016年7月3日
中文摘要
本次课程设计是对前面学过的所有面向对象的编程思想以及编程方法的一个总结、回顾和实践,因此,开始设计前需要先回顾以前所学的内容,明确本次作业设计所要用到的技术点并到网上搜索以及查阅相关的书籍来搜集资料。
通过编写一个基于JAVA的应用系统综合实例,来掌握Java语言编程技巧。
此次课程设计旨在通过让学生面对任务自己编程以解决问题,并发现问题从而实现让学生学到的java的知识从理论到实践的转变,是鼓励学生学以致用和创新的第一步。
1.1Java语言发展简史
1995年:
sun公司发布Java语言。
1996年年初:
发布了JDK1.0。
这个版本包括两部分:
运行环境(即JRE)和开发环境(即JDK)。
运行环境包括核心API、集成API、用户界面API、发布技术、Java虚拟机(JVM)5个部分;开发环境包括编译Java程序的编译器(即javac命令)。
1997年2月18日发布JDK1.1。
JDK1.1增加了JIT(即时编译)编译器。
JIT和传统的编译器不同,传统的编译器是编译一条,运行完后将其扔掉;而JIT会将经常用到的命令保存在内存中当下次调用时就不需要重新编译了,通过这种方式让JDK在效率上有了较大提升。
1998年12月:
sun发布了Java历史上最重要的JDK版本:
JDK1.2,伴随JDK1.2一同发布的还有JSP/Servlet、EJB等规范,并将Java分成了J2EE、J2SE和J2ME三个版本。
JDK1.2还把它的API分成了三大类:
核心API、可选API、特殊API。
2002年2月:
sun发布了JDK历史上最为成熟的版本:
JDK1.4。
2004年10月,sun发布了万众期待的JDK1.5,同时,sun将JDK1.5改名为JavaSE5.0、J2EE、J2ME也相应的改名为JavaEE和JavaME。
JDK1.5增加了诸如泛型、增强的for语句、可变数量的形参、注释(Annotations)、自动拆箱和装箱等功能;同时,也发布了新的企业级平台规范,如通过注释等新特性来简化EJB的复杂性,并推出了EJB3.0规范。
还推出了自己的MVC框架规范:
JSF,JSF类似于ASP.NET的服务器端控件,通过它可以快速的构建复杂的JSP界面。
2006年12月,sun公司发布了JDK1.6。
2009年4月20日,Oracle宣布将以每股9.5美元的价格收购sun,该交易的总价值约为74亿美元。
2011年7月28日,Oracle发布了JavaSE7,引入了二进制整数、支持字符串的switch语句、菱形语法、多异常捕捉、自动关闭资源的try语句等新特性。
2014年3月18日,Oracle发布了JavaSE8,这次版本升级为Java带来了全新的Lambda表达式等大量新特性。
1.2Java程序运行机制
1.2.1高级语言的运行机制
Java语言是一种特殊的高级语言,它既具有解释型语言的特征,也具有编译型语言的特征,因为Java程序要经过先编译,后解释两个步骤。
计算机高级语言按程序的执行方式可以分为编译型和解释型两种。
现有的C、C++、Objective-C、Pascal等高级语言都属于编译型语言。
对于解释型语言,可以认为:
每次执行解释型语言的程序都需要进行一次编译,因此解释型语言的程序运行效率通常较低,而且不能脱离解释器独立运行。
但解释型语言有一个优势:
跨平台比较容易,只需提供特定平台的解释器即可,每个特定平台上的解释器负责将源程序解释成特定平台的机器指令即可。
解释型语言可以方便的实现源程序级的移植,但这是以牺牲程序执行效率为代价的。
现有的Ruby、Python等语言都属于解释型语言。
1.2.2Java程序的运行机制和JVM
Java语言比较特殊,有Java语言编写的程序需要经过编译步骤,但这个编译步骤并不会生成特定平台的机器码,而是生成一种及平台无关的字节码(也就是*.class文件)。
当然,这种字节码不是可执行性的,必须使用Java解释器来解释执行。
因此可以认为:
Java语言既是编译型语言,也是解释型语言。
或者说,Java语言既不是纯粹的编译型语言,也不是纯粹的解释型语言。
Java程序的执行过程必须经过先编译、后解释两个步骤,如图1.1所示。
Java语言里负责解释执行字节码文件的是Java虚拟机,即JVM(JavaVirtualMachine)。
JVM是可运行Java字节码文件的虚拟计算机。
当使用Java编译器编译Java程序时,生成的是及平台无关的字节码,这些字节码不面向任何具体平台,只面向JVM。
不同平台上的JVM都是不同的,但它们都提供了相同的接口。
JVM是一个抽象的计算机,和实际的计算机一样,它具有指令集并使用不同的存储区域。
它负责执行指令,还要管理数据、内存和寄存器。
Oracle公司制定的Java虚拟机规范在技术上规定了JVM的统一标准,具体定义了JVM的如下细节:
指令集、寄存器、类文件的格式、栈、垃圾回收堆、存储区。
1.3开发Java的准备
1.3.1下载和安装JDK
JDK的全称是JavaSEDevelopmentKit,即Java标准开发包,它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行时环境,以及常用的Java类库等。
Java运行时环境,它的全称是JavaRuntimeEnvironment,因此也被称为JRE,它是运行Java程序的必须条件。
注意:
简单地说,JRE包含JVM。
JVM是运行Java程序的核心虚拟机,而运行Java程序不仅需要核心虚拟机,还需要其他的类加载器、字节码校验器以及大量的基础类库。
JRE除了包含JVM之外,还包含运行Java程序的其它环境支持。
一般而言,如果只运行Java程序,可以只安装JRE(仅安装JVM是不够的),无需安装JDK。
开发Java程序,则选择安装JDK,JDK包含了JRE。
后来开发JavaEE应用时,安装JavaEESDK就包含了JDK。
安装JDK步骤:
①登录Oracle官方网站,根据所用电脑系统选择合适的JDK版本。
②开始安装,注意不装publicJRE,把它去掉。
DevelopmentTools是JDK的核心,包括编译Java程序必需的命令工具。
实际上,它已经包含了JRE。
安装SourceCode这个选项将会安装Java所有核心类库的源代码。
③选择JDK的安装路径,系统默认安装在C:
\ProgramFiles\Java路径下,但不推荐安装在有空格的路径下,会导致一些未知问题。
示例路径:
D:
\Java\jdk1.8.0_60\。
基本目录解释:
①bin:
该路径下存放了JDK的各种工具命令,常用的javac、java等命令就放在该目录下。
②db:
该路径是安装JavaDB的路径。
③include:
一些平台特定的头文件。
④jre:
该路径下安装的就是运行Java程序所必需的JRE环境。
⑤lib:
该路径下存放的是JDK工具命令的实际执行程序。
⑥javafx-src.zip:
该压缩文件里存放的就是JavaFX所有核心类库的源代码。
⑦src.zip:
该压缩文件里存放的是Java所有核心类库的源代码。
⑧README和LICENSE等说明性文档。
1.3.2设置PATH环境变量
Windows不区分大小写,而Linux区分大小写,因此只需要设置PATH环境变量即可(就通用了)。
在win10系统中右击计算机,选择属性,进入高级系统设置,选择环境变量,设置如下:
①在用户变量中(或者系统变量(对所有用户有效))添加一个新变量:
变量名:
JAVA_HOME,变量值为:
jdk安装目录,如D:
\Java\jdk1.8.0_60②设置PATH变量:
在PATH变量的变量值前面添加%JAVA_HOME%\bin;即可(注意不要丢失分号)。
③该步骤在可以省略.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(classpath环境变量,1.5后可以不配)④在Windows命令行界面键入javac或java命令,测试环境变量是否配置成功。
1.4Java程序的基本规则
1.4.1Java程序的组织形式
Java程序必须以类(class)的形式存在,类(class)是Java程序的最小程序单位。
Java程序不允许可执行性语句、方法等成分独立存在,所有的程序部分都必须放在类定义里。
Java解释器规定:
如需某个类能被解释器直接解释执行,则这个类里必须包含main方法,而且main方法必须使用publicstaticvoid来修饰,且main方法的形参必须是字符串数组类型(String[]args)。
Java虚拟机就是从这个main方法开始解释执行。
因此,main方法是程序的入口。
对于一个大型的Java程序而言,往往只需要一个入口,也就是只有一个类包含main方法,而其它类都是用于被main方法直接或间接调用的。
1.4.2Java源文件的命名规则
(1)Java程序源文件的后缀必须是.java,不能是其它文件后缀名。
(2)在通常情况下,Java程序源文件的主文件名可以是任意的。
但有一种情况例外,如果Java程序源代码里定义了一个public类,则该源文件的主文件名必须及该public类的类名相同。
(因此一个Java源文件里可以包含多个类定义,但最多只能定义一个public类)。
建议:
一个Java源文件只定义一个类,不同的类使用不同的源文件定义,让Java源文件的主文件名及该源文件中定义的public类同名。
1.5垃圾回收机制
Java程序的内存分配和回收都是由JRE在后台自动进行的。
JRE会负责回收那些不再使用的内存,这种机制被称为垃圾回收(GarbageCollection,GC)。
通常JRE会提供一个后台线程来进行检测和控制,一般都是在CPU空闲或内存不足时自动进行垃圾回收,而程序员无法精确控制垃圾回收的时间和顺序等。
Java的堆内存是一个运行时数据区,用以保存类的实例(对象),Java虚拟机的堆内存中存储着正在运行的应用程序所建立的对象,这些对象不需要程序通过代码来显式地释放。
除了释放没用的对象外,垃圾回收也可以清除内存记录碎片。
垃圾回收使得Java虚拟机具有两个显著的优点。
(1)垃圾回收机制可以很好的提高编程效率。
在没有垃圾回收机制时,可能需要花很长的时间来解决一个难懂的存储器问题。
在用Java语言编程时,依靠垃圾回收机制可大大缩短时间。
(2)垃圾回收机制保证程序的完整性,垃圾回收是Java语言安全性策略的一个重要部分。
一个潜在缺点:
它的开销影响程序性能。
垃圾回收具有如下几个特点:
(1)垃圾回收机制的工作目标是回收无用对象的内存空间,这些内存空间都是JVM堆内存里的内存空间,垃圾回收只能回收内存资源,对其它物理资源,如数据库连接、磁盘I/O等资源则无能为力。
(2)为了更快的让垃圾回收机制回收那些不再使用的对象,可以将对象的引用变量设置为null,通过这种方式暗示垃圾回收机制可以回收该对象。
(3)垃圾回收发生的不可预知性。
程序员可以通过调用Runtime对象的gc()或System.gc()等方法来建议系统进行垃圾回收,但这种方法仅仅只是建议,依然不能精确控制垃圾回收机制的执行。
(4)垃圾回收的精确性主要包括两个方面:
一是垃圾回收机制能够精确的标记活着的对象;二是垃圾回收器能够精确地定位对象之间的引用关系。
(5)现在的JVM有多种不同的垃圾回收实现,每种回收机制因其算法差异可能表现各异,有的当垃圾回收开始时就停止应用程序的运行,有的当垃圾回收机制运行时允许应用程序的线程运行,还有的在同一时间允许垃圾回收多线程运行。
当编写Java程序时,一个基本原则是:
对于不再需要的对象,不要引用它们。
如果保持对这些对象的引用,垃圾回收机制暂时不会回收该对象,则会导致系统可用内存越来越少;当系统可用内存越来越少时,垃圾回收执行的频率就越来越高,从而导致系统的性能下降。
运用到的相关JAVA知识
①图形用户界面编程基础:
其中工作主要有两个:
一是应用外观设计,既创建组成图形界面的各部件,指定它们的属性和位置关系;二是及用户的交互处理,包括定义图形用户界面的事件以及事件的响应处理。
常用GUI部件的的类层次
用到的布局
事件源及事件监听者的关系
②JAVA的绘图模式:
(1)覆盖模式:
将绘制的图形像素覆盖屏幕上该位置已有的像素
(2)异或模式:
将绘制的图形像素及屏幕上该位置的像素信息进行异或运算,以运算的结果作为结果。
异或模式的Graphics类的setXORMode()方法为:
setXORMode(Colorc):
③绘制棋盘棋子用到的知识:
(1)二维数组的创建如intchess[][]=newint[19][19];
(2)流程控制语句for语句及elseif语句的使用如:
for(inti=0;ifor(intj=0;jif(chess[i][j]==1){
g.setColor(Color.black);
g.fillOval(sx+i*w-w/2+1,sx+j*w-w/2+1,w-2,w-2);
}elseif(chess[i][j]==2){
g.setColor(Color.white);
g.fillOval(sx+i*w-w/2+1,sx+j*w-w/2+1,w-2,w-2);
④日期及时间:
Calendar类:
它为一个抽象方类通过使用静态方法获得CalendarrightNow=Calendar.getInstance();
正文
(1)题目内容及要求
设计一个围棋对弈程序界面:
1.掌握Frame,Panel等容器的使用
2.掌握AWT图形绘制的常用方法。
3.掌握java的事件监听机制,理解相关角色及相互关系。
4.熟悉按钮和鼠标事件的处理。
5.完成类围棋对弈界面设计。
界面参考如图2所示。
6.功能至少包含:
a.能用颜色选择对话框改变棋盘背景颜色;
b.实现黑白棋子轮流落子;
c.显示游标即游标轨迹擦除;
d.显示下棋所用时间;
(2)设计思路
围棋对弈界面设计分析:
在窗体中要同时安排棋盘和下棋过程中的若干操作按钮,在棋盘中用一个Canvas部件绘制,下棋过程控制按钮则部署在一个面板上。
棋盘上的棋子信息通过一个二维数组记录,数组元素为1表示黑棋,2表示白旗。
0表示没有棋子。
为了方下棋定位操作,在棋盘上绘制一个红色小方框代表位置的小游标,鼠标移动时小游标也跟随移动。
小游标移动时要擦除先前的绘制,所以,小游标采用异或方式绘制,擦除只要按相同颜色重绘一次即可。
我们可以用鼠标移动事件处理小游标的移动处理,利用鼠标单击事件处理新下棋子的绘制处理。
另外,棋盘以及棋子信息利用paint()方法实现绘制。
程序中引入了cx和cy两个变量代表游标位置。
引入变量player表示当前轮到黑白子谁下。
为了实现棋盘位置和大小调整,引入实例变量sx和sy记录棋盘左上角位置信息,并引入了实例变量w代表棋盘格子宽度。
步骤实现:
①先设计出整个程序的总体面貌此处用Panel来构造以及游戏各个部件的按钮的安排
②用Graphics的方法来绘制棋盘以及棋子,用异或的方法实现小游标的绘制
③构造chessBoard的类及方法来实现存放棋子的状态、棋盘格子的宽度以及棋子状态以及下棋方式的定义
④各个分部设计好后再把每个部件协调好达到程序的简洁美观
(3)具体实现
①类设计
classchessGame定义了整个围棋游戏的布局它继承的是Frame
classchessBoard定义了棋盘的分部细节
②功能实现
要实现整个程序需要先引入四个包分别为importjava.awt.importjava.awt.event.importjavax.swing.importjava.util.
Colorc=newColor((int)(Math.random()*255),(int)(Math.random()*255),
(int)(Math.random()*255));此代码定义了一个随机颜色c用来在随后的改变围棋面板用
hessBoardb=newchessBoard();
setBackground(c);
setLayout(newBorderLayout());
add("Center",b);此部分代码实现了把围棋面板定义在了窗口中央以及设置其背景色
Panelp=newPanel();
Labela1=newLabel("对战时间");
Buttoncolor=newButton("更改棋盘颜色");
Buttonfail=newButton("认输");
Buttonback=newButton("悔棋");
Buttonquit=newButton("退出游戏");
TextAreat1=newTextArea(mydate,2,1);
p.setLayout(newGridLayout(8,1,10,10));
p.add(newLabel());//为界面美观插入一个空标签
p.add(color);
p.add(back);
p.add(a1);
p.add(t1);
p.add(fail);
p.add(quit);
add("East",p);
fail.addActionListener(this);
color.addActionListener(this);
quit.addActionListener(this);
addWindowListener(newcloseWin());
setSize(500,450);
setVisible(true);
此长代码块设置了棋盘各个部件,包括各个按钮、标签以及面板的布局
publicvoidactionPerformed(ActionEvente){
Colorc=newColor((int)(Math.random()*255),(int)(Math.random()*255),
(int)(Math.random()*255));setBackground(c);
if(e.getActionCommand().equals("退出游戏")){
dispose();}
if(e.getActionCommand().equals("认输")){JOptionPane.showMessageDialog(null,"你输了");
此处通过actionPerformed实现了对设置按钮相应功能的实现如“认输”,“退出游戏”等等
classchessBoardextendsCanvas{
intchess[][]=newint[19][19];
intsx=20,sy=20;//存放棋盘子的状态
intw=20;//棋盘左上角的位置
intcx=50;//棋盘每个格子的宽度
intcy=50;//下棋位置游标的初值,对应鼠标移动位置
intplayer=1;//1表示轮下黑子,0表示轮下白子
publicchessBoard(){
this.addMouseMotionListener(newMouseMotionAdapter(){
publicvoidmouseMoved(MouseEvente){
Graphicsg=getGraphics();
g.setXORMode(chessBoard.this.getBackground());
g.setColor(Color.red);
g.fillRect(cx-w/4,cy-w/4,w/2,w/2);
cx=sx+(int)(e.getX()/w)*w;
cy=sy+(int)(e.getY()/w)*w;
g.fillRect(cx-w/4,c