JAVA黑白棋课程设计Word文档下载推荐.docx
《JAVA黑白棋课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《JAVA黑白棋课程设计Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
![JAVA黑白棋课程设计Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-1/2/5d698d25-6c67-43d4-a909-45f41280c2ce/5d698d25-6c67-43d4-a909-45f41280c2ce1.gif)
指导教师评语及成绩
成绩:
指导教师签字:
2010年12月24日
目录
第1章课程设计的目的与要求1
1.1课程设计目的1
1.2课程设计的实验环境1
1.3课程设计的预备知识1
1.4课程设计要求1
第2章课程设计内容2
2.1课程设计主要内容2
2.2概要设计2
2.3详细设计5
2.4测试分析17
第3章课程设计总结18
参考资料19
第1章课程设计的目的与要求
1.1课程设计目的
《JAVA程序设计》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。
实践教学环节是必不可少的一个重要环节。
本课程的程序设计专题实际是计算机相关专业学生学习完《JAVA程序设计》课程后,进行的一次全面的综合训练,JAVA程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。
1.2课程设计的实验环境
硬件要求能运行Windows9.X操作系统的微机系统。
JAVA程序设计语言及相应的集成开发环境,J2SDK和ECLIPSE开发工具。
1.3课程设计的预备知识
熟悉JAVA语言及ECLIPSE开发工具。
1.4课程设计要求
按课程设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。
要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;
对此能够较好地理解和掌握,能够进行简单分析和判断;
能编写出具有良好风格的程序;
掌握JAVA程序设计的基本技能和面向对象的概念和方法;
了解多线程、安全和网络等编程技术。
同时培养学生进行分析问题、解决问题的能力;
培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。
第2章课程设计内容
2.1课程设计主要内容
Java语言的学习热潮并没有因为时间的推移而消退,相反,由于计算机技术的发展所带来新应用的出现,Java越来越流行,这种情况是以往程序设计语言在其生存周期内所不多见的。
Java语言之所以这样长盛不衰,一是因为其众多的技术特点与现今的应用十分合拍,可以覆盖大部分的需求;
二是因为SUN公司不断推出新的版本,完善Java自身的功能。
有了这两点,Java语言成为程序员首选的程序设计开发工具就在情理之中了。
黑白棋,又叫翻转棋(Reversi)、苹果棋或奥赛罗棋(Othello)。
一般棋子双面为黑白两色,故称“黑白棋”。
因为行棋之时将对方棋子翻转,变为己方棋子,故又称“翻转棋”。
棋子双面为红、绿色的称为“苹果棋”。
黑白棋的前身是英国人发明的翻转棋(Reversi),后来由日本的长谷川五郎加以改进,并改称为奥赛罗棋(Othello),国内习惯上称之为黑白棋。
这个棋类游戏在西方较为流行,但在中国起步较晚,还不很普及。
黑白棋作为一个棋类竞技运动,在民间十分流行,为了熟悉黑白棋规则及技巧,以及研究简单的人工智能,决定用Java开发黑白棋游戏。
主要完成了人机对战功能,有很好的可扩展性。
在人机对弈中通过深度搜索和估值模块,来提高电脑棋手的智能。
分析估值模块中的影响精准性的几个要素,以及提出若干提高精准性的办法,以及对它们搜索的节点数进行比较,在这些算法的基础上分析一些提高提高电脑AI方案,如递归算法、电脑学习等。
算法的研究有助于理解程序结构,增强逻辑思维能力,在其他人工智能方面也有很大的参考作用。
尽管黑白棋的规则比较简单,但它所包括的丰富战略,不亚于那些相当“经典”的策略游戏。
其中人工智能部分,由于采用了大量的搜索算法,其中很多被利用到各方面。
2.2概要设计
近来随着计算机的快速发展,各种各样的电脑游戏层出不穷,使得我们能有更多的娱乐项目,而棋类游戏能起到锻炼人的思维和修身养性的作用,而且棋类游戏水平颇高,大有与人脑分庭抗礼之势。
其中战胜过国际象棋世界冠军-卡斯帕罗夫的“深蓝”便是最具说服力的代表,其它像围棋的“手淡”、象棋的“将族”等也以其优秀的人工智能深受棋迷喜爱。
越来越多的具有智能的机器进入了人类的生活,人工智能的重要性如今显而易见。
自己对人工智能比较感兴趣,而黑白棋游戏程序的开发实现这个课题,正好提供给我这样一个研究的机会,通过对人工智能中博弈方面的研究(人机对弈),让我在简单的人机对弈全局设计,以及具体到相关算法上有了深入的了解。
人工智能属于计算机科学的领域,它以计算机技术为基础,近几十年来,它的理论和技术已经日益成熟,应用领域也正在不断扩大,显示出强大的生命力。
人工智能大致可以分成几个学科,它们每一个都是独特的,但是它们常常又互相结合起来完成设计任务,这时,这些学科之间的差别就变的很模糊。
人工智能在专家系统,自然语言理解,自动定理证明,自动程序设计,人工智能在机器人学、模式识别、物景分析、数据库的智能检索、机器下棋(实质上是博弈论问题)和家用电器智能化等领域都有广泛的应用。
而这个课题就是和人工智能中的博弈论领域紧密相关的。
这个题目核心是人工智能和Socekt编程,并且人工智能中的博弈部分,由于采用了大量的搜索算法,其中很多被利用到各方面。
它的概念、方法和技术,正在各行各业广泛渗透。
智能已经成为当今各种新产品、新装备的发展方向。
所以,趁着这个机会,对人工智能中比较容易实现的人机博弈进行了解研究学习,也是很实用且很有必要的。
电脑究竟能否最终战胜人脑?
这是大家一直在探索的问题。
自从1997年黑白棋程序Logistello战胜冠军棋手村上健以来,电脑程序已经把人类棋手远远抛在后面。
目前,程序可以记住大量的开局定式、可以正确地判断局面的优劣、可以思考到二十几步之后的局面,这都是人类棋手远不能及的。
然而,电脑的这一切又都是人类所赋予的,因此究竟电脑和人脑孰优孰劣,还难以定论。
2.2.1自定义说明
吃子规则:
采用夹吃的原则,左图用红色标记的是黑方可落子的位置。
当黑方落子之后,则夹在两黑子中间的白子都将变为黑子。
右图是落子后的棋盘布局,蓝色标记的是白方可落子的位置。
夹子的方向包含:
水平、竖直、斜对角
2.2.2程序流程图
(1)落棋位置判断:
(2)输出成绩:
(3)输出最后的胜利者结果:
2.2.3各模块功能及程序说明
落棋位置的判断模块:
判断落子后棋盘的变化,判断棋手的落棋位置和次数,两方交换走棋。
成绩输出模块:
判断输出哪个棋手的分,在不同的位置输出,清空成绩,判断哪方胜利。
输出胜利者信息模块:
开始判断最后的结果,将两人分数分别输出。
2.2.4程序结果
一方执黑棋,一方执白棋,轮流走棋,每方都试图在游戏结束前让自己棋子的数目多于对方。
按键盘上的方向键可以上下左右移动棋子,按回车键可以摆放棋子,同时也可以用鼠标左键操作。
在同上操作下到最后谁的棋子多,谁赢。
2.3详细设计
程序详细设计代码如下:
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
import.*;
importjavax.swing.*;
importjava.util.*;
importjava.awt.Font;
publicclassMain{
publicstaticvoidmain(Stringargs[]){
BlackAndWhiteDesignb=newBlackAndWhiteDesign();
}
}
classBlackAndWhiteDesignextendsFrameimplementsRunnable{
GoBackground=newGo();
booleanstepColor=true;
intPORT;
SocketsendSocket;
//主动连接Socket
PrintWriterwriter;
//用来发送message
booleanstopFlag;
booleanisInitiative;
PointmessagePoint;
Panelpanel1=newPanel();
Panelpanel2=newPanel();
Panelpanel3=newPanel();
CheckboxGroupcheckboxGroup1=newCheckboxGroup();
Checkboxcheckbox1=newCheckbox();
Checkboxcheckbox2=newCheckbox();
Labellabel1=newLabel();
TextFieldtextField1=newTextField(10);
PanelPtextField1=newPanel();
Buttonbutton1=newButton();
Labellabel2=newLabel();
Choicechoice1=newChoice();
Buttonbutton2=newButton();
Buttonbutton3=newButton();
BorderLayoutborderLayout3=newBorderLayout();
Panelpanel4=newPanel();
Panelpanel4_1=newPanel();
Panelpanel4_2=newPanel();
Panelpanel4_3=newPanel();
Labellabel3=newLabel("
黑棋"
);
Labellabel4=newLabel("
白棋"
JTextAreaBlackNumber=newJTextArea("
02"
//定义并初始化黑棋计数板
JTextAreaWhiteNumber=newJTextArea("
//定义并初始化白棋计数板
BlackAndWhiteDesign(){
try
{
bwInit();
catch(Exceptione)
e.printStackTrace();
privatevoidbwInit()throwsException{
this.setTitle("
网络黑白棋作者:
刘茂龙"
newThread(this).start();
//启动监听线程
this.PORT=1976;
this.isInitiative=false;
//是否主动连接
this.stopFlag=false;
//是否继续监听的标志
this.messagePoint=newPoint();
choice1.setBackground(newColor(236,190,98));
this.choice1.addItem("
黑"
白"
this.setBackground(newColor(236,190,98));
this.setSize(580,565);
this.setResizable(false);
this.setVisible(true);
checkbox1.addMouseListener(newMouseAdapter()
publicvoidmouseClicked(MouseEvente)
checkbox1_mouseClicked(e);
});
panel1.setLayout(newBorderLayout());
checkbox1.setCheckboxGroup(checkboxGroup1);
checkbox1.setLabel("
单机"
checkbox2.addMouseListener(newMouseAdapter()
checkbox2_mouseClicked(e);
checkbox2.setCheckboxGroup(checkboxGroup1);
checkbox2.setLabel("
联机"
label1.setText("
对方地址"
button1.setBackground(newColor(236,190,98));
button1.setLabel("
连接"
button1.addActionListener(newActionListener()
publicvoidactionPerformed(ActionEvente)
button1_actionPerformed(e);
label2.setText("
"
button2.setBackground(newColor(236,190,98));
button2.setLabel("
开始"
button2.addActionListener(newActionListener()
button2_actionPerformed(e);
button3.setBackground(newColor(236,190,98));
button3.setLabel("
重新开始"
this.button3.setEnabled(false);
button3.addActionListener(newActionListener()
button3_actionPerformed(e);
Background.addMouseListener(newMouseAdapter()
Background_mouseClicked(e);
this.addWindowListener(newWindowAdapter()
publicvoidwindowClosing(WindowEvente)
this_windowClosing(e);
panel3.setLayout(newGridLayout(9,1));
panel3.setBackground(newColor(236,190,98));
panel3.add(checkbox1);
panel3.add(checkbox2);
panel3.add(label1);
PtextField1.add(textField1);
panel3.add(PtextField1);
panel3.add(choice1);
panel3.add(button1);
panel3.add(button2);
panel3.add(button3);
panel3.add(label2);
panel4.setLayout(newGridLayout(1,3));
label3.setFont(newFont("
h"
15,30));
panel4_1.add(label3);
BlackNumber.setFont(newFont("
BlackNumber.setEditable(false);
panel4_1.add(BlackNumber);
label4.setFont(newFont("
panel4_2.add(label4);
WhiteNumber.setFont(newFont("
WhiteNumber.setEditable(false);
panel4_2.add(WhiteNumber);
panel4.add(panel4_1);
panel4.add(panel4_2);
panel4.add(panel4_3);
this.panel1.add(this.Background,BorderLayout.CENTER);
this.panel1.add(panel3,BorderLayout.EAST);
this.panel1.add(panel4,BorderLayout.SOUTH);
this.add(panel1,BorderLayout.CENTER);
this.disableLink();
//废掉控件
this.checkboxGroup1.setSelectedCheckbox(this.checkbox1);
this.centerWindow();
this.Background.setEnabled(false);
voidcheckbox1_mouseClicked(MouseEvente)
this.button2.setEnabled(true);
//disable联机时用的控件
voiddisableLink()
this.textField1.setBackground(newColor(236,190,98));
this.textField1.setEnabled(false);
this.choice1.setEnabled(false);
this.button1.setEnabled(false);
voidcheckbox2_mouseClicked(MouseEvente)
this.enableLink();
voidenableLink()
this.textField1.setBackground(Color.white);
this.textField1.setEnabled(true);
this.choice1.setEnabled(true);
this.button1.setEnabled(true);
this.button2.setEnabled(false);
voidbutton1_actionPerformed(ActionEvente)
this.goToLink(this.textField1.getText().trim(),this.PORT);
//开始
voidbutton2_actionPerformed(ActionEvente)
if(e.getActionCommand().equals("
))
this.button3.setEnabled(true);
this.checkbox1.setEnabled(false);
this.checkbox2.setEnabled(false);
this.button2.setLabel("
退出"
if(this.isSingle())
this.Background.setEnabled(true);
//判断类型
booleanisSingle()
returnthis.checkbox1.getState();
voidbutton3_actionPerformed(ActionEvente)
if(isSingle()){
intChoose;
Choose=JOptionPane.showConfirmDialog(null,"
您确定要重新开始吗?
"
"
提示"
JOptionPane.YES_NO_OPTION);
if(Choose==JOptionPane.YES_OPTION){
this.Background.Restart();
Strings1,s2;
if(this.Background.BlackNumberc<
=9)s1="
0"
+Integer.toString(this.Background.BlackNumberc);
elses1=Integer.toString(this.Background.BlackNumberc);
if(this.Background.WhiteNumberc<
=9)s2="
+Integer.toString(this.Background.WhiteNumberc);
elses2=Integer.toString(this.Background.WhiteNumberc);
this.BlackNumber.setText(s1);
this.WhiteNumber.setText(s2);
this.button2.set