java王锟 2.docx
《java王锟 2.docx》由会员分享,可在线阅读,更多相关《java王锟 2.docx(31页珍藏版)》请在冰豆网上搜索。
java王锟2
课程设计(论文)任务书
理学 院 信息计算专 业2012-1 班
一、课程设计(论文)题目:
人机对弈五子棋游戏
二、课程设计(论文)工作:
自2015年6月17日起至2015年6月25日止
三、课程设计(论文)地点:
5#203
四、课程设计(论文)内容要求:
1.本课程设计的目的
(1)使学生掌握软件开发的基本工作流程;
(2)巩固JAVA程序设计课程所学的内容;
(3)培养学生的计算机思维能力以及合作的精神;
(4)培养学生分析、解决问题的能力;
(5)提高学生的科技论文写作能力。
2.课程设计的任务及要求
1)基本要求:
(1)研究课程设计任务,并进行系统需求分析;
(2)对系统进行总体设计,分解系统功能模块,进行任务分配,以实现分工合作;
(3)实现各功能模块代码;
(4)系统组装,测试、完善系统。
2)创新要求:
在基本要求达到后,可进行创新设计,如改进界面、增加功能或进行代码优化。
3)课程设计论文编写要求
(1)要按照书稿的规格打印誊写课程设计论文
(2)论文包括封面、设计任务书(含评语)、摘要、目录、设计内容、设计小结
(3)论文装订按学校的统一要求完成
4)参考文献:
(1)丁振凡,《JAVA语言程序设计》,清华大学出版社.
(2)丁振凡,《JAVA语言程序设计实验指导与习题解答》,清华大学出版社.
(3)
5)课程设计进度安排
内容天数 地点
系统总体设计1 实验室
软件设计及调试2 实验室
答辩及撰写报告2 实验室、图书馆
学生签名:
2015年6月25日
课程设计(论文)评审意见
(1)课程设计过程(20):
优( )、良( )、中( )、一般( )、差( );
(2)是否完成调试,系统运行效果(30分):
优( )、良( )、中( )、一般( )、差( );
(3)回答问题(20分):
优( )、良( )、中( )、一般( )、差( );
(4)课程设计报告(30分):
优( )、良( )、中( )、一般( )、差( );
(5)格式规范性及考勤是否降等级:
是( )、否( )
评阅人:
职称:
教授
2014年6月25日
目录
第1章系统概要1
1.1系统介绍1
1.2基本功能要求1
第2章设计思路与算法2
第3章源程序代码5
第4章运行结果及分析23
第5章心得体会27
参考文献28
第1章系统概要
1.1系统介绍
五子棋是一个简单易懂但又包含高深学问的游戏,因为它这样温和蕴藉的致命魅力,令人越陷越深而无法自拔。
五子棋入门容易,甚至随时随地捡几颗石头就能下五子棋,要不然只要有纸笔也能马上来一句,容易入门的特性,使五子棋成为老少皆宜的游戏。
也因为如此,一般人容易错觉五子棋只是个小游戏罢了,不会有什么高深的学问。
本系统的创新性研究主要包括以下两个方面:
第一对五子棋博奕的专业知识进行了认真的整理,针对五子棋博奕规则简单、局势判断清楚的特点,对五子棋常见的开局、定式及其后的对局做了细致的统计分析,阐明了五子棋对奕中黑白双方优劣势并非均衡的规律,这一规律作为一个指导原则在设计五子棋博奕系统时起到重要作用。
第二针对初版程序中存在的缺点和不足,通过查找原因,实现了算法的优化和加强。
初版程序在运行时其搜索速度和对奕表现不能让人满意。
其主要原因有两个:
使用常规的Alpha-Beta搜索不能避免相同局面的重复节点的搜索,从而影响搜索速度;采用固定的估值法,估值的不准确使其“智力”较低,而且固定的赋值方式使其不能在对奕过程中提高棋力。
通过这次课程设计,熟悉Java的GUI图形界面设计,网络Socket 编程和多线程编程。
1.2基本功能要求
要求实现一个简单的多用户五子棋胡游戏程序,包括如下两个界面:
(1)选择对弈桌及角色(执黑、执白、观看)。
(2)在游戏界面,有开始,退出(游戏未结束、点退出自动判负);用户列表区;棋盘绘制区。
第2章设计思路与算法
系统模块结构如图:
系统的概要设计
五子棋的娱乐性强、规则简单、易学、流行性广,普通人不需长时间专门训练即可自如行棋,因此极受大众喜欢,本系统可以实现人与人手动下棋,扫描整个棋盘记录连在一起的黑白棋子数,实现人与人有次序的下棋,判断人与人的胜负,为人下棋提供帮助,五子棋规则为:
本游戏可选择人与人对战模式。
(2)下法:
两人分别执黑白两色棋子,轮流在棋盘上选择一个无子的交叉点落子,无子的交叉点又被称为空点。
(3)输赢判断:
黑、白双方有一方的五个棋子在横、竖或斜方向上连接成一线即为该方赢。
系统模块介绍
本系统有4个程序每个程序都导入了不同的包和类运用了不同的所学知识。
不同的类和包提供的方法、类型等都不同,本程序还使用了继承。
以至使其能够完成不同的功能。
本节主要讲述本系统所使用的基础知识。
1、 类的基础
(1)类的定义
JAVA中的类实质上是一种对象类型,它是对具有相同属性和相同行为对象的一种抽象。
类是java程序中最小的组成单位。
(2)Java中类定义的格式为:
[类修饰符] class 类名 [extends 基类] [implements 接口] {// 成员变量声明(Member variable declaration) // 成员方法声明 (Member method declaration)} 其中,class、extends和implements都是Java的关键字。
类修饰符、extends和implements是关于修饰符、继承和接口的内容。
2、继承
继承性是面向对象程序设计语言的一个重要特征,通过继承可以实现代码的复用。
Java语言中,所有的类都是直接或间接的继承 java.lang.object类而得到的。
被继承的类称为基类或父类,继承而的来的类成为子类。
子类继承基类的方法和属性,同时也可以修改基类的方法和属性 ,并增加自己新的属性和方法。
Java不支持多重继承。
即一个子类不能拥有两个或以上的父类。
3、包
包的定义
在Java中,把相关的代码组织到一起,称为“包”。
包市一种将相关类、接口或其他包组织起来的集合体,目的是为了将包含类代码的文件组织起来,易于查找和使用。
<2、包的语法及导入:
Package PackageName; //包的定义
Import java.awt.Color //导入包关键字Import
4、接口
接口的定义
Java中的接口可以看成是一种抽象类,它是一些抽象方法和常量的集合,其主要作用是使得处于不同层次上以至于互不相干的类能够执行相同的操作,引用相同的值,而且在一个类中可以同时实现来自不同接口中的多种方法。
<2、接口的定义和实现
Interface 接口名{//抽象方法} //定义接口
Class 类名 implements 接口名称{// 类体} 实现接口
5、线程
线程的定义 同时执行多个程序段,每个程序段都是一个线程。
<2、线程的周期 线程的周期包括新建(new)、就绪(start())、执行(run())、阻塞(sleep()、wait()、suspend()、输入/输出流中发生线程阻塞)、死亡(stop()、destroy())。
创建线程的方法:
一种是创建Thread类的子类。
另一种是实现Runnable接口.而本系统采用的是接口的方式。
6.Applet小应用程序
(1) 小应用程序与应用程序的区别:
小应用程序没有主方法不能单独运行。
而应用程序是拥有主方法的是可以单独运行的。
(2)Applet 的执行方式
它有两种:
一种是浏览器中执行,另一种是使用Appletviewer()命令执行。
本系统的两个小应用程序都是采用编制html以浏览器形式执行。
(3)Applet主类的一般框架结构图 Import java.awt.*; Import java.applet.*;
Public class 类名 extends Applet{
Public void init(){//初始化变量、设置字体、装载图片} Public void start(){//启动程序执行或恢复程序执行} Public void stop(){//挂起正在执行的程序,暂停程序} Public viod destroy(){终止程序的执行释放资源}
Public viod paint(Graphics g){// 完成绘制图形等操作}}
7、异常处理
(1)异常处理概念
异常是Java程序运行出现的错误。
(2)异常处理机制
异常处理机制:
当try子句中抛出的异常属于某个catch子句的异常类时,该catch子句捕获到异常,并且系统自动将异常类的实例传递给catch子句的异常类对象。
在catch子句中,可以从异常类对象中获取异常细节,并可通过该对象使用异常类中的方法,对异常进行相应的处理。
第3章源程序代码
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.util.*;
classPoint{
intx,y;
publicPoint(intx1,inty1){
x=x1;y=y1;
}
publicStringtoString(){
returnx+","+y;
}
}
publicclasschessGameextendsFrameimplementsActionListener{
chessBoardb=newchessBoard();
staticinti=0;
publicchessGame(){
setBackground(Color.lightGray);
setLayout(newBorderLayout());
add("Center",b);
Panelp=newPanel();
Buttonpass=newButton("放弃一手");
Buttoncolor=newButton("变棋盘背景");
Buttonfail=newButton("认输");
Buttonback=newButton("悔棋");
Buttonexit=newButton("退出游戏");
ButtongameRule=newButton("游戏规则");
p.setLayout(newGridLayout(8,2,10,10));
p.add(newLabel());//为界面美观插入一个空标签
P.add(group);
p.add(pass);
p.add(color);
p.add(fail);
p.add(back);
p.add(gameRule);
p.add(exit);
add("East",p);
pass.addActionListener(this);
fail.addActionListener(this);
back.addActionListener(this);
exit.addActionListener(this);
color.addActionListener(this);
gameRule.addActionListener(this);
setSize(500,450);
setVisible(true);
}
publicstaticvoidmain(String[]args){
newchessGame();
}
publicvoidactionPerformed(ActionEvente){
if(e.getActionCommand()=="退出游戏")
{
dispose();
}
elseif(e.getActionCommand()=="变棋盘背景")
{
If(i==0)
{
setBackground(Color.RED);
i=i+1;
}
elseif(i==1)
{
setBackground(Color.YELLOW);
i=i+1;
}
elseif(i==2)
{
setBackground(Color.BLUE);
i=i+1;
}
elseif(i==3)
{
setBackground(Color.ORANGE);
i=i+1;
}
elseif(i==4)
{
setBackground(Color.PINK);
i=i+1;
}
else
{
setBackground(Color.lightGray);
i=0;
}
add(“Center”,b)
}
}
elseif(e.getActionCommand()=="认输")
{
b.GiveUpGame();
}
elseif(e.getActionCommand()=="悔棋")
{
b.Undo();
}
elseif(e.getActionCommand()=="放弃一手")
{
b.GiveFirst();
}
elseif(e.getActionCommand()=="游戏规则")
{
b.displayGameRule();
}
}
}
classchessBoardextendsCanvas{
intchess[][]=newint[19][19];//存放棋盘子的状态
intsx=40,sy=20;//棋盘左上角位置
intw=20;//棋盘每个格子宽度
intcx=50;//下棋位置游标的初值,对应鼠标移动位置
intcy=50;
intplayer=1;//1表示轮黑下子,2表示轮白下子
staticfinalintEMPTY=0,//代表空方格.
WHITE=2,//白子.
BLACK=1;//黑子.
staticintgoodx=0;
staticintgoody=0;
staticintvalue=0;
staticArrayListmy=newArrayList();
staticintstate[]=newint[5];
intxp,yp;
intoldx=cx;
intoldy=cy;
publicvoidUndo()
{
chess[state[0]][state[1]]=0;
chess[state[2]][state[3]]=0;
if(state[4]==1)
{
player=2;
}
else
{
player=1;
}
for(inti=0;i<5;i++)
System.out.println(state[i]);
repaint();
}
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+(e.getX()-sx+w/2)/w*w;
cy=sy+(e.getY()-sy+w/2)/w*w;
g.fillRect(cx-w/4,cy-w/4,w/2,w/2);
}
});
this.addMouseListener(newMouseAdapter(){
publicvoidmouseClicked(MouseEvente){//鼠标点击表示下子
Graphicsg=getGraphics();
oldx=cx;oldy=cy;
state[0]=(oldx-sx)/w;
state[1]=(oldy-sy)/w;
xp=(cx-sx)/w;
yp=(cy-sy)/w;
if(chess[xp][yp]==0){//是否已有棋子
if(player==1){
g.setColor(Color.black);//黑棋
chess[xp][yp]=1;
state[2]=xp;
state[3]=yp;
state[4]=1;
}else{
g.setColor(Color.white);//白棋
chess[xp][yp]=2;
state[2]=xp;
state[3]=yp;
state[4]=2;
}
g.fillOval(cx-w/2+1,cy-w/2+1,w-2,w-2);
if(winner(xp,yp)){//判是否胜
if(player==2)
gameOver("白方胜!
");
else
gameOver("黑方胜!
");
return;
}
player=1+player%2;//黑白方轮流下子
g.setXORMode(chessBoard.this.getBackground());
g.setColor(Color.red);//用异或方式绘制小游标
g.fillRect(cx-w/4,cy-w/4,w/2,w/2);
computer();
g.setXORMode(chessBoard.this.getBackground());
g.setColor(Color.red);//用异或方式绘制小游标
g.fillRect(cx-w/4,cy-w/4,w/2,w/2);
System.out.println(xp+","+yp);
}
}
});
}
voidfindsolution(){
value=0;
//goodx=0;
//goody=0;
my.clear();
for(intx=0;x<19;x++)
for(inty=0;y<19;y++){
if(chess[x][y]==0){
intv=valueme(x,y,player);
if(v>value){
goodx=x;
goody=y;
value=v;
my.clear();
my.add(newPoint(x,y));
}
elseif(v==value)
{my.add(newPoint(x,y));
}
v=valueme2(x,y,player%2+1);
if(v>value){
value=v;
goodx=x;
goody=y;
my.clear();
my.add(newPoint(x,y));
}
elseif(v==value)
{my.add(newPoint(x,y));
}
//System.out.println(value);
}
}
}
intvalueme(intx,inty,intplayer){
if(count(player,x,y,1,0)>=5||count(player,x,y,0,1)>=5||count(player,x,y,1,-1)>=5||count(player,x,y,1,1)>=5)
return120;
intv=1;
if(count2(player,x,y,1,0)>=4)
if(conject2(player,x,y,0,1))
v=v+18;
else
v=v+80;
if(count2(player,x,y,0,1)>=4)
if(conject2(player,x,y,0,1))
v=v+18;
else
v=v+80;
if(count2(player,x,y,1,-1)>=4)
if(conject2(player,x,y,1,-1))
v=v+18;
else
v=v+80;
if(count2(player,x,y,1,1)>=4)
if(conject2(player,x,y,1,1))
v=v+18;
else
v=v+80;
if(count2(player,x,y,1,0)>=3)
if(conject(player,x,y,1,0))
v=v+2;
else
v=v+15;
if(count2(player,x,y,0,1)>=3)
if(conject(player,x,y,0,1))
v=v+2;
else
v=v+15;
if(count2(player,x,y,1,-1)>=3)
if(conject(player,x,y,1,-1))
v=v+2;
else
v=v+15;
if(count2(player,x,y,1,1)>=3)
if(conject(player,x,y,1,1))
v=v+2;
else
v=v+15;
if(count3(player,x,y,1,0)>=3)
v=v+14;
if(count3(player,x,y,0,1)>=3)
v=v+13;
if(count3(playe