JAVA五子棋网络版游戏井字棋剖析.docx
《JAVA五子棋网络版游戏井字棋剖析.docx》由会员分享,可在线阅读,更多相关《JAVA五子棋网络版游戏井字棋剖析.docx(20页珍藏版)》请在冰点文库上搜索。
![JAVA五子棋网络版游戏井字棋剖析.docx](https://file1.bingdoc.com/fileroot1/2023-7/1/a356ffee-6ef9-4207-b5e3-ff79dbed0a1c/a356ffee-6ef9-4207-b5e3-ff79dbed0a1c1.gif)
JAVA五子棋网络版游戏井字棋剖析
辽宁工业大学
《Java语言程序设计》课程设计(论文)
题目:
网络版游戏—井字棋
院(系):
软件学院
专业班级:
软件工班
学号:
13
学生姓名:
指导教师:
峰
教师职称:
讲师
起止时间:
201013.6.20
课程设计(论文)任务及评语
院(系):
软件学院教研室:
软件教研室
学号
1313
学生姓名
专业班级
软件班
课程设计(论文)题目
网络版游戏—井字棋
课程设计(论文)任务
任务与要求:
(1).掌握面向对象程序设计语言JAVA的基本语法
(2).掌握JAVA面向对象设计的思想,
(3).掌握VJAVA6.0与MyEclipsJAVA开发工具的使用
(4).运用标准JAVA规范设计应用程序
设计过程中,要严格遵守设计的时间安排,听从指导教师的指导。
正确地完成上述内容,规范完整地撰写出设计报告。
指导教师评语及成绩
成绩:
指导教师签字:
2014年06月24日
第1章课程设计目的与要求
1.1设计目的
将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。
通过课程设计,学生淮南房管局在下述各方面的能力应该得到锻炼:
(1)进一步巩固、加深学生所学专业课程《JAVA语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
(3)利用所学知识,开发小型应用系统,掌握运用JAVA语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
(5)掌握面向对象程序设计的方法。
(6)熟练掌握JAVA语言的基本语法,灵活运用各种数据类型。
(7)进一步掌握在集成环境下如何调试程序和修改程序。
1.2实验环境
硬件要求能运行Windows操作系统的微机系统。
JAVA语言应用程序开发软件使用:
VJAVA系统,或其他JAVA语言应用程序开发软件。
1.3预备知识
熟悉JAVA语言程序设计的基本知识及VJAVA编辑器的使用方法。
1.4设计要求
1.仔细分析设计题目,画出程序流程图,编写程序源代码。
2.积极上机调试源程序,增强编程技巧与调程能力。
3.认真书写课程设计预习报告,课程设计说明书。
4.遵守课程设计要求和机房管理制度,服从指导教师的安排,确保课程设计的顺利完成课程设计内容。
第2章课程设计内容
2.1课题描述
随着计算机技术和互联网的飞速发展,游戏软件是当今世界发展最迅速,最有影响力,最有潜力与活力的领域之一。
电脑游戏的出现为人民提供了新的娱乐平台,丰富了人们的业余生活。
因此与游戏有关的软件深受广大青少年的喜爱。
随着近几年来软件技术的不断进步和不断发展,软件游戏的操作要求越来越简单,大多数游戏普通人学几分钟就能会玩,婶子老年人也慢慢爱上了它。
随着电子计算机一代又一代实现更新,性能越来越高,计算速度越来越快,硬件方面的不断发展促使了软件技术也迅速发展。
许多游戏的设计软件人才在工作之余时常喜爱编一种能与人斗智的游戏,以此来锻炼编程的能力,这种游戏花样繁多,但其特点都是利用计算机软件事先设计好的分析和判断能力反过来与人较量,如今,游戏软件已经为时间各国的人使用,所谓游戏软件通常是指各种程序和动画效果相结合起来的软件产品。
现在游戏软件产业已经受到了广泛的关注,它年轻又潜力而且吸引人,让人们日益丰富的生活需求得到满足。
而井字棋游戏的诞生更是吸引着不同年龄段的人群,无论男女老少都可以玩,也都喜欢玩,而当前微型计算机已经是在广大人群中流行者,用电脑来下井字棋更是一种时尚。
现在网络上出现了各种各样的井字棋软件,有大师级的,新手级的等等。
这些都满足了不同人群的需要,所以当前井字棋越来越被许多人所熟悉。
目前的井字棋程序的发展也非常快,从最初的双人发展到人机,然后到现在的网络对战,已经受到越来越多人的喜爱和重视。
井字棋不但容易上手,而且它区别于别的游戏,它不但能使人娱乐,而且能使人的头脑变的更加聪明。
而井字棋有两种对战模式,一是人机对战,二十人人对战。
这些给人无限乐趣的用途正式人工智能的杰作。
正因为这样它鼓励着人们对它不断的研究,这在很大程度上促进了人工智能的发展,反过来人工智能的理论和技术上的突破能够使井字棋程序更加完美,更受欢迎。
2.2系统设计
这是一个具有简单功能的井字棋游戏。
本设计的主要完成的是井字棋的人机对弈问题,即计算机与人交替落子,当行、列或对角有连续三个以上(包括三个)相同一方棋时,则判定一方胜利,如果所有位置都已经下满,且没有哪一方赢棋,则为和局。
本设计的程序实现了井字棋的人机对弈,具体功能为:
1.在程序界面中挥之游戏棋盘,可以是三乘三,四乘四,五乘五。
显示游戏状态,其中游戏状态包括难度等级,有初级,中级和高级三种模式。
还包括哪方先下,当前轮到哪方下等等。
2.玩家执红,计算机为蓝方。
3.可以设置谁先下,设置游戏难度等级,设置棋盘块数。
要完成此设计则需—判定胜负函数及一计算机自行落子函数,一旦这两个函数完成则此程序主要部分可完成。
本次设计提高了我们程序设计能力、培养自学能力。
提高了我们的分析问题以及解决问题的能力。
还提高了我们收集资料、查找参考书的能力以及锻炼书写报告的能力。
2.2.1功能分析
此设计是具有简单功能的井字棋游戏。
本设计的主要完成的是井字棋的人机对弈问题,即计算机与人交替落子,当行、列或对角有连续三个以上(包括三个)相同一方棋时,则判定一方胜利,如果所有位置都已经下满,且没有哪一方赢棋,则为和局。
具体功能模块图如下:
图2.1系统功能模块图
这是一个智能型的井字棋游戏,机器可以模拟人与用户对弈。
当轮到机器来下的时候,机器会根据当前棋局的形势,利用极大极小算法算出一个评价值,判断如何下才对自身最有利,同时也是对方来说对不利的,然后下在评价值最高的地方。
机器在搜索评价值的时候不用扩展不必要的结点,从而提高机器计算的效率。
2.2.2面向对象设计
这是一个智能型的井字棋游戏,机器可以模拟人与用户对弈。
当轮到机器来下的时候,机器会根据当前棋局的形势,利用极大极小算法算出一个评价值,判断如何下才对自身最有利,同时也是对方来说对不利的,然后下在评价值最高的地方。
机器在搜索评价值的时候不用扩展不必要的结点,从而提高机器计算的效率。
系统流程图如下图所示:
图2.2游戏流程图
井字棋是一个流传已久的传统游戏。
游戏由两个人轮流来下,分别用“X”和“O”来代替自身的棋子。
双方可以在轮到自己下的时候,可以用棋子占领其中一个空的格子。
如果双方中有一方的棋子可以连成一条直线,则这一方判胜,对方判负。
当所有的格子都被占领,但双方都无法使棋子连成一条直线的话,则判和棋。
这是一个智能型的井字棋游戏,机器可以模拟人与用户对弈。
当轮到机器来下的时候,机器会根据当前棋局的形势,利用极大极小算法算出一个评价值,判断如何下才对自身最有利,同时也是对方来说对不利的,然后下在评价值最高的地方。
另外利用α-β剪枝,使机器在搜索评价值的时候不用扩展不必要的结点,从而提高机器计算的效率。
游戏时一方是电脑,另一方是玩家。
所以,这类游戏在开始时有两种方式:
一种是玩家先走;另一种是电脑先走。
这是我们要考虑的第一个问题。
然后,设计游戏的棋盘数和难易级别等,棋盘数分为三乘三、四乘四、五乘五,以及难易级别分为初级、中级和高级三个级别。
当游戏结束后,又要提示玩家游戏结果,如“恭喜您,您赢了”、“笨蛋,你输了”和与电脑平手的结果。
还有一部分设计的是游戏的管理界面,分为游戏开始、结束和退出。
然后测试该游戏,是否达成预想结果,完成预想功能。
在用户界面方法,用一个3×3的井字格来显示用户与机器下的结果。
当要求用户输入数据的时候会有提示信息。
用户在下的过程中可以中途按下“0”退出。
当用户与计算机分出了胜负后,机器会显示出比赛的结果。
总体E-R图如下图2-2所示:
图2.3游戏总体E-R图
2.3程序实现
2.3.1源码分析
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
importjava.lang.*;
importjava.util.*;
//importcom.borland.jbcl.layout.*;
publicclassChessFrameextendsJFrame{
///游戏界面参数
privateContainercontentPane;
privateJPanelupPanel;
privateJPanelleftPanel;
privateJPanelcenterPanel;
privateJPanelrightPanel;
privateJPaneldownPanel;
privateJComboBoxlevel;//游戏级别
privateJComboBoxsize;//棋盘大小
privateJRadioButtoncb1;//单选按钮,玩家先手
privateJRadioButtoncb2;//单选按钮,电脑先手
privateJButtonb4;//开始
privateJButtonb5;//结束
privateJButtonb6;//退出按钮
privateJButtonb[][];//棋盘按钮
privateJLabelb1;//欢迎词
privateJLabelb11;
privateJLabelb12;
privateJLabelb2;//棋局状况
privateJLabelb3;//棋局结果
privateJLabelb31;
privateJLabelb32;
//程序参数
privateintstartturn;//先下棋的一方,1代表玩家,2代表电脑
privateinta[][];//棋盘信息,0代表无棋子,1代表玩家下的棋子,2代表电脑下的棋子
privateintresult;//棋局结果,1代表玩家赢,2代表电脑赢,3代表平手
privateintc_size;//棋盘大小,本游戏中有3乘3,4乘四,5乘5三种棋盘
privateintc_level;//游戏级别,低级,中级,高级分别对应0,1,2
privateintx;//玩家出的棋子所在位置的行号
privateinty;//玩家所出棋子所在的列号
publicChessFrame(){
super("井字棋人机作战");
//调用界面初始化函数
frameInitnew();
//退出程序
WindowListenerw=newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
ChessFrame.this.dispose();
System.exit(0);
}
};
this.addWindowListener(w);
//定义响应鼠标单击的事件
ActionListenerch=newActionListener(){
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==level){//级别
c_level=level.getSelectedIndex();
}
elseif(e.getSource()==size){//根据棋盘大小隐藏部分按钮
c_size=size.getSelectedIndex()+3;
if(c_size==3){
b[0][3].setVisible(false);
b[1][3].setVisible(false);
b[2][3].setVisible(false);
b[3][3].setVisible(false);
b[3][0].setVisible(false);
b[3][1].setVisible(false);
b[3][2].setVisible(false);
b[0][4].setVisible(false);
b[1][4].setVisible(false);
b[2][4].setVisible(false);
b[3][4].setVisible(false);
b[4][4].setVisible(false);
b[4][0].setVisible(false);
b[4][1].setVisible(false);
b[4][2].setVisible(false);
b[4][3].setVisible(false);
}
elseif(c_size==4){
b[0][3].setVisible(true);
b[1][3].setVisible(true);
b[2][3].setVisible(true);
b[3][3].setVisible(true);
b[3][0].setVisible(true);
b[3][1].setVisible(true);
b[3][2].setVisible(true);
b[0][4].setVisible(false);
b[1][4].setVisible(false);
b[2][4].setVisible(false);
b[3][4].setVisible(false);
b[4][4].setVisible(false);
b[4][0].setVisible(false);
b[4][1].setVisible(false);
b[4][2].setVisible(false);
b[4][3].setVisible(false);
}
else{
b[0][3].setVisible(true);
b[1][3].setVisible(true);
b[2][3].setVisible(true);
b[3][3].setVisible(true);
b[3][0].setVisible(true);
b[3][1].setVisible(true);
b[3][2].setVisible(true);
b[0][4].setVisible(true);
b[1][4].setVisible(true);
b[2][4].setVisible(true);
b[3][4].setVisible(true);
b[4][4].setVisible(true);
b[4][0].setVisible(true);
b[4][1].setVisible(true);
b[4][2].setVisible(true);
b[4][3].setVisible(true);
}
}
elseif(e.getSource()==cb1){//控制单选按钮
cb1.setSelected(true);
cb2.setSelected(false);
cb1.updateUI();
cb2.updateUI();
startturn=1;
}
elseif(e.getSource()==cb2){
cb1.setSelected(false);
cb2.setSelected(true);
cb1.updateUI();
cb2.updateUI();
startturn=2;
}
elseif(e.getSource()==b4){//开始按钮
//调用内部函数,初始化棋盘beginChess();
}
elseif(e.getSource()==b5){//结束按钮
endChess();
}
elseif(e.getSource()==b6){//exit
System.exit(0);
}
else{
for(intii=0;iifor(intjj=0;jjif(e.getSource()==b[ii][jj]){
x=ii;y=jj;
playchess();
}
}
}
}//endelse
}//endactionPerformed
};//endactionlistener
//将所有按钮加入监听器
for(inti=0;i<5;i++){
for(intj=0;j<5;j++){
b[i][j].addActionListener(ch);
}
}
level.addActionListener(ch);
size.addActionListener(ch);
cb1.addActionListener(ch);
cb2.addActionListener(ch);
b4.addActionListener(ch);
b5.addActionListener(ch);
b6.addActionListener(ch);
this.setVisible(true);
}//endChessframe
///界面初始化函数
privatevoidframeInitnew(){
contentPane=this.getContentPane();
//界面的大小和位置
this.setSize(500,500);
this.setResizable(false);
DimensionframeSize=this.getSize();
DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation((screenSize.width-frameSize.width)/2,(screenSize.height-frameSize.height)/2);
//将整个界面划分成五个区域,东南西北中
//西为棋盘
//北为欢迎词
//中为空白区
//东为命令按钮及棋局状况
//南为游戏结果
//初始状态为3乘3棋盘,级别为低级,电脑先手
c_size=3;
startturn=2;
c_level=0;
chessboardFormed();//形成棋盘
//其他是固定的,所以不需单独形成函数
//北区,欢迎词
b1=newJLabel("欢迎来到井字棋世界!
!
!
",JLabel.CENTER);
b1.setFont(newjava.awt.Font("Times",Font.PLAIN,25));
b1.setForeground(Color.darkGray);
b11=newJLabel("",JLabel.CENTER);
b12=newJLabel("",JLabel.CENTER);
upPanel=newJPanel();
upPanel.setLayout(newGridLayout(3,1));
upPanel.setPreferredSize(newDimension(500,80));
upPanel.add(b11);
upPanel.add(b1);
upPanel.add(b12);
contentPane.add(upPanel,BorderLayout.NORTH);
//南区,棋局结果,初始状态为空
b3=newJLabel("*************************",JLabel.CENTER);
b31=newJLabel("",JLabel.CENTER);
b32=newJLabel("",JLabel.CENTER);
b3.setFont(newjava.awt.Font("Times",Font.PLAIN,25));
b3.setForeground(Color.darkGray);
downPanel=newJPanel();
downPanel.setPreferredSize(newDimension(500,60));
downPanel.setLayout(newGridLayout(3,1));
downPanel.add(b31);
downPanel.add(b3);
downPanel.add(b32);
contentPane.add(downPanel,BorderLayout.SOUTH);
///东区,包括游戏级别选择,棋盘大小选择,先手方选择,以及开始,结束退出按钮
rightPanel=newJPanel();
2.3.2运行结果
本设计中的难易程度分为三个级别,分别为:
初级,中级和高级。
玩家可以根据自己的需要来选择适合自己的难易程度进行游戏。
具体如下图所示:
图2.4玩家游戏难易程度选择界面
游戏在开始时有两种方式:
一种是玩家先走;另一种是电脑先走。
这是我们要考虑的第一个问题。
然后,设计游戏的棋盘数和难易级别等,棋盘数分为三乘三、四乘四、五乘五,以及难易级别分为初级、中级和高级三个级别。
当游戏结束后,又要提示玩家游戏结果,如“恭喜您,您赢了”、“笨蛋,你输了”和与电脑平手的结果。
还有一部分设计的是游戏的管理界面,分为游戏开始、结束和退出。
然后测试该游戏,是否达成预想结果,完成预想功能。
具体界面设计如下:
图2.5玩家赢界面
第3章总结
井字棋游戏的诞生更是吸引着不同年龄段的人群,无论男女老少都可以玩,也都喜欢玩,而当前微型计算机已经是在广大人群中流行者,用电脑来下井字棋更是一种时尚。
现在网络上出现了各种各样的井字棋软件,有大师级的,新手级的等等。
这些都满足了不同人群的需要,所以当前井字棋越来越被许多人所熟悉。
目前的井字棋程序的发展也非常快,从最初的双人发展到人机,然后到现在的网络对战,已经受到越来越多人的喜爱和重视。
通过本次课程设计,从看到设计要求,到选择课题再到自己构思,设计数据结构,构造算法,编写源代码,再到上机调试,我充分认识到书本上的知识只是数据结构的基础知识,认识到将知识有机融合并运用到实际生活中的重要性。
本次课程设计的主要数据结构涉及到树的存储结构,我选择了用数组来存储相关内容,设计了一个parent域和child域。
通过本次的课程设计、上机实验,原本对于树的存储结构相对比较生疏的我,现在能较为熟练的掌握树的各种存储结构,并能比较纯熟的选择适合的存储结构。
在此次程序调试运行过程中我认识到一个可操作的好的程序必须有个良好的界面,因为只有这样才能实现与用户的互动,便于用户使用,才能充分发挥出一个好程序应有的功效。
而一个好的编程工作者,应当在编程之前充分了解用户的需求,使用户能方便使用此程序的各项功能。
当然由于时间比较仓促、所学比较有限,对于此课程设计的模块尚不完全,因此功能还需完善,有较多地方有待改进,唯一存在的问题是界面不够美化,而且再人机对弈中不能悔棋。
希望通过将来的进一步