五子棋游戏设计定稿.docx
《五子棋游戏设计定稿.docx》由会员分享,可在线阅读,更多相关《五子棋游戏设计定稿.docx(16页珍藏版)》请在冰豆网上搜索。
![五子棋游戏设计定稿.docx](https://file1.bdocx.com/fileroot1/2023-1/9/76369b2d-cfeb-4ab1-8a66-24c7ba850b1b/76369b2d-cfeb-4ab1-8a66-24c7ba850b1b1.gif)
五子棋游戏设计定稿
java课程设计报告
论文题目
五子棋游戏
院(系)名称
专业名称
班级
学生姓名
学号
指导教师姓名
五子棋游戏设计
随着手机的日益普及、JAVA功能在移动设备上的实现,JAVA应用程序产生的手机增值服务逐渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。
特别是手机性能的逐渐增强,手机作为一个游戏平台越来越成熟了。
J2ME(Java2PlatformMicroEdition)是近年来随着各种不同设备,尤其是移动通信设备的飞速发展而诞生的一项新的开发技术。
它定位在消费性电子产品的应用上,对设备的智能化、多样化提供了革命性的解决方案,并因其“Writeonce,runanywhere”的Java特性而提高了开发的效率。
本论文着眼于J2ME技术的应用,开发一款可用的具有人工智能的手机游戏——五子棋。
本程序将老少皆宜的经典作品移植到手机上来,为更流行的硬件平台提供应用软件。
五子棋游戏基于JAVA平台编写,满足一般手机用户的娱乐需求。
关键词 J2ME;手机游戏;五子棋;人工智能
一、设计背景
随着计算机普及,网络的飞速发展,网络技术的成熟,计算机的发展为集办公、娱乐于一体新式工具。
在这一背景下,网络游戏的需求与日俱增,五子棋作为传统游戏之一,其历史源远流长,而传统游戏的开发更符合用户的品味,更受用户的喜爱。
基于C/S模式使用JAVA语言开发的五子棋游戏程序,将五子棋游戏移植到网络中更符合现代人娱乐理念,满足用户异地自由选择游戏对手、游戏模式,也可以在游戏当中进行聊天,私聊、群聊等功能,便于用户实时进行信息交流。
同时,注意从游戏的图形界面上优化,使得JAVA五子棋游戏软件具有很强的可操作性。
二、需求分析
1、任务概述
(1)目标:
建立五子棋服务器程序,游戏主机的应用程序,主要提供客户进行游戏的服务器;建立五子棋客户端程序,安装于客户端的应用程序,主要提供客户游戏、聊天的应用程序。
可满足用户异地自由选择游戏对手、游戏模式,也可以在游戏当中进行聊天,私聊、群聊、修改用户名等功能。
(2)运行环境:
Windows98/2000/XP/2003操作系统下,建立游戏服务器后,根据提示安装客户端程序即可。
2、数据需求
(1)数据流条目:
系统默认用户名,或客户根据喜好可进行修改用户名。
(2)数据字典:
本程序采用非数据库策略,游戏时,只把部分数据保存于内存中。
3、功能需求
功能的划分、描述:
本游戏程序主要实现以下几个方面的功能:
A:
服务器程序,主要为客户端程序提供一个网络平台。
B:
客户端程序,主要实现五子棋的游戏界面,以及可提供给客户进行信息交流的功能,包括私聊,群聊,以及客户进行用户名的修改。
第一章 绪论
1.1目的与意义
近来随着计算机与手机的快速发展,各种各样的游戏层出不穷,使得人们能有更多的娱乐项目,而棋类游戏能起到锻炼人的思维与修身养性的作用,而且棋类游戏水平颇高,大有与人脑分庭抗礼之势。
现在的五子棋游戏软件基本上可以分为两类:
一类是网络五子棋游戏软件,另一类是单机版五子棋游戏软件。
很少有手机版的五子棋游戏软件。
为了满足手机人群的需求,作者设计了这款手机版的五子棋游戏软件,可以供人们闲暇时间随时随地地进行娱乐提高自己的五子棋水平,实用性强。
1.2 手机游戏的优点
1.庞大的潜在用户群
现在全球超过十亿部移动电话正在被使用,并且这个数目还在逐渐增加。
在除美国之外的每个发达国家,拥有手机的人数比拥有计算机的人数还要多。
虽然这些手机只有一小部分是支持Java游戏的手机,但是这个数目正在快速地提高并且在几年内Java手机将要成为行业标准。
移动游戏潜在的市场比其它任何平台(比如Playstation与GameBoy)都要大。
2.便携性
GameBoy比其他任何控制台游戏卖出的多的一个原因就是其的便携性。
与现在的游戏控制台或个人电脑相比,手机可能不是一个好的游戏设备,但是人们基本上是随时随地都把它们带在身边,在人们离开家或者想玩的时候,可以不受任何时间地点限制地玩自己选择的游戏。
3.支持网络
因为移动电话是网络设备,所以可以实现多人游戏。
第二章 可行性分析
综合手机的高速发展与游戏的市场及前景,结合五子棋游戏的特点等考虑,手机五子棋游戏实现后,应能够达到以下目标:
(1)此游戏软件实现人机对弈并且手机具有一定的人工智能水平。
(2)双方下棋时同时支持手机键盘与指针(如输入笔等)双输入。
(3)玩家可以根据自己的需要选择先后手、棋盘大小与棋盘底纹颜色。
(4)能够为玩家提供上一步的“悔棋”功能。
(5)为玩家提供游戏介绍与软件说明。
(6)界面友好明了,操作简单方便,有落子、悔棋等音效。
1.3 基本需求分析
总体设计是软件开发过程中的另一个重要阶段,在这一阶段中将根据需求分析中提出的逻辑模型,科学合理地进行物理模型的设计。
这个阶段的主要目标是将反映用户信息需求的逻辑方案转换成物理方案,并为下一阶段提供必要的技术资料。
总体设计应遵循以下原则:
(1)整体性:
软件是作为统一整体而存在的。
因此,在总体设计中要从整个软件的角度进行考虑。
(2)灵活性:
为保持软件长久的生命力,要求该手机游戏软件具有很强的环境适应性。
为此,游戏软件应具有较好的开放性与结构的可变性。
(3)可靠性:
可靠性是指软件抵御外界干扰的能力及受外界干扰时的恢复能力。
(4)经济性:
经济性是指在满足游戏软件需求的前提下,尽可能地减小游戏软件的开销。
4.1 软件模块总体设计
利用层次图来表示软件中各模块之间的关系。
层次方框图是用树形结构的一系列多层次的矩形框描绘数据的层次结构。
树形结构的顶层是一个单独的矩形框,它代表完整的数据结构,下面的各层矩形框代表各个数据的子集,最底层的各个矩形框代表组成这个数据的实际数据元素(不能再分割的元素)。
随着结构的精细化,层次方框图对数据结构描绘也越来越详细,这种模式非常适合于需求分析阶段的需要。
从对顶层信息的分类开始,沿着图中每条路径反复细化,直到确定了数据结构的全部细节为止。
本游戏软件一共分为三大模块:
游戏选项、游戏设置与帮助。
每个模块的功能都是按照在调研中搜集的资料进行编排制作的。
依据上述功能的分析,本游戏软件在三大模块的基础上每一大模块又分为几个模块:
游戏选项包括六个模块:
开始游戏、重新游戏、悔棋、认输、背景音乐与退出游戏。
游戏设置包括三个模块:
先后手设置、棋盘底纹颜色设置与棋盘大小设置。
帮助包括两个模块:
游戏帮助与关于。
游戏功能结构图如图4-1所示。
各模块的详细功能如下:
开始游戏:
进行新一局的五子棋游戏。
重新游戏:
游戏结束或人方认输时可以进行新的游戏。
悔棋:
人机对弈时人方对自己的上一步棋重新思考。
认输:
人机对弈时人方自动放弃本局。
背景音乐:
游戏时的音乐效果。
退出游戏S胨出此手机五子棋游戏软件。
先后手设置:
对人机双方下棋先后顺序的选择。
棋盘大小设置:
对五子棋棋盘大小的选择。
棋盘底纹颜色设置:
对五子棋棋盘颜色的选择。
游戏帮助:
五子棋游戏的规则介绍与控制键说明。
关于:
关于五子棋与此五子棋游戏软件的介绍。
游戏规则:
对局开始时,先由执黑棋一方将一枚棋子落在天元点上,然后由执白棋一方在黑棋周围的交叉点上落子。
但是,为了尊重对方和礼貌起见,持白棋的一方通常将盘面的第二着棋布在自己河界的一侧,即直止或斜止。
此后黑白双方轮流落子,直到某一方首先在棋盘的横线、纵线或斜线上形成连续五子或五子以上〔仅对白棋而言〕,则该方就算获胜。
连珠五子棋的一个特点是先行的一方优势很大,因此在职业比赛中对黑方做了种种限制,以利公平竞争。
五子棋的比赛规则如下:
1、黑先、白后,从天元开始相互顺序落子;
2、最先在棋盘横向、纵向或斜向形成连续的同色五个棋子的一方为胜;
3、黑棋禁手判负,白棋无禁手。
黑棋禁手有“三、三”、“四、四”和“长连”,包括“四、三、三”和“四、四、三”,黑棋只能以“四、三”取胜;
4、如果分不出胜负,则到为平局;
5、五连与禁手同时形成,判胜;
6、黑方禁手形成时,白方应立即指出。
若白方未发现或发现后不立即指出,反而继续落子,则禁手失效,不再判黑方负。
7、若比赛中,有一方不想继续比赛并征得对方同意,或者两方都不想继续比赛,则终止本轮比赛,且本轮比赛无效。
2、设计过程
1、绘制用具(棋盘(X、Y轴)和棋子)。
2、游戏规则。
3、游戏帮助(悔棋、和棋和认输,先手和后手)。
4、游戏结束(若黑棋赢则弹出一行字“黑棋胜利”,若白棋赢则弹出一行字:
“白棋胜利”;若和棋,则双方都出现一行字“和棋”)。
3、需求分析
1、任务概述:
(1)目标:
创建双人五子棋单机游戏(由玩家双方控制棋子落点);
(2)运行环境:
Window2000/2003/2007/XP操作系统。
2、判断一方胜利的条件
黑白双方轮流落子,直到某一方首先在棋盘的横线、纵线或斜线上形成连续五子或五子以上〔仅对白棋而言〕,则该方就算获胜。
五子中心棋子的位置是(i,j)
横线五子:
((i-2,j),(i-1,j),(i,j),(i+1,j),(i+2,j));
纵线五子:
((i,j-2),(i,j-1),(I,j),(i,j+1),(i,j+2));
斜线五子:
((i-2,j-2),(i-1,j-1),(I,j),(i+1,j+1),(i+2,j+2))或((i-2,j+2),(i-1,j+1),(i,j),(i+1,j-1),(i+2,j-2))
游戏源程序
主程序
importjava.awt.*;//加载java.awt类库里面所有的类
importjava.awt.event.*;
importjavax.swing.*;
classmypanelextendsPanelimplementsMouseListener
{
intchess[][]=newint[11][11];//构造11*11个方格的棋盘
booleanIs_Black_True;
mypanel()
{
Is_Black_True=true;
for(inti=0;i<11;i++)//初始化二维数组chess[][],元素均设置为0
{
for(intj=0;j<11;j++)
{
chess[i][j]=0;
}
}
addMouseListener(this);
setBackground(Color.Black);//设置窗口背景色为黑色
setBounds(0,0,360,360);//设置窗口的大小
setVisible(true);//将窗口显示出来
}
publicvoidmousePressed(MouseEvente)
{
intx=e.getX();//取得鼠标按下时的x坐标
inty=e.getY();//取得鼠标按下时的y坐标
if(x<25||x>330+25||y<25||y>330+25)//如果鼠标点击越界,则点击不起作用
{
return;
}
if(chess[x/30-1][y/30-1]!
=0)//如果鼠标点击的位置已经下了棋子,则点击不起作用
{
return;
}
if(Is_Black_True==true)
{
chess[x/30-1][y/30-1]=1;
Is_Black_True=false;//使下次下棋的为另外一方
repaint();//重新画图
Justisewiner();
return;//返回,跳出该方法
}
if(Is_Black_True==false)//判断是否下白棋
{
chess[x/30-1][y/30-1]=2;
Is_Black_True=true;//使下次下棋的为另外一方
repaint();
Justisewiner();
return;
}
}
voidDrawline(Graphicsg)
{
for(inti=30;i<=330;i+=30)
{
for(intj=30;j<=330;j+=30)
{
g.setColor(Color.WHITE);//设置棋子为白色
g.drawLine(i,j,i,330);//画直线
}
}
for(intj=30;j<=330;j+=30)
{
g.setColor(Color.WHITE);//给棋盘画方格,线设置为白色
g.drawLine(30,j,330,j);//画直线
}
}
voidDrawchess(Graphicsg)
{
for(inti=0;i<11;i++)
{
for(intj=0;j<11;j++)
{
if(chess[i][j]==1)
{
g.setColor(Color.BLACK);//如果二维数组中的元素为1,则黑棋下
g.fillOval((i+1)*30-8,(j+1)*30-8,16,16);//画一个圆,右上角((i+1)*30-8,(j+1)*30-8),宽度16,高度16
}
if(chess[i][j]==2)
{
g.setColor(Color.WHITE);//如果二维数组中的元素为2,则白棋下
g.fillOval((i+1)*30-8,(j+1)*30-8,16,16);//画一个圆,右上角((i+1)*30-8,(j+1)*30-8),宽度16,高度16
}
}
}
}
voidJustisewiner()
{
intblack_count=0;
intwhite_count=0;
inti=0;
for(i=0;i<11;i++)//横向判断
{
for(intj=0;j<11;j++)
{
if(chess[i][j]==1)
{
black_count++;//如果黑棋在横向上和上次下的黑棋连在一起,则加1
if(black_count==5)//判断黑棋是否在横向上五个连在一起,如果是,则黑棋胜利
{
JOptionPane.showMessageDialog(this,"黑棋胜利");
Clear_Chess();//清屏,把下过的棋子都清楚干净
return;
}
}
else
{
black_count=0;//如果在横向上黑棋没有五个在没连在一起,则把black_count重新置为0
}
if(chess[i][j]==2)
{
white_count++;//如果在横向上白棋和上次下的棋子连在一起,则加1
if(white_count==5)//判断白棋在横向上是否五个连在一起,如果是,则白棋胜利
{
JOptionPane.showMessageDialog(this,"白棋胜利");
Clear_Chess();//清屏,把下过的棋子都清楚干净
return;
}
}
else
{
white_count=0;//如果白棋在5个中有一个没连在一起,则把white_count重新置为0
}
}
}
for(i=0;i<11;i++)//竖向判断
{
for(intj=0;j<11;j++)
{
if(chess[j][i]==1)
{
black_count++;//如果黑棋在竖向上和上次下的黑棋连在一起,则加1
if(black_count==5)//判断黑棋是否在竖向上五个连在一起,如果是,则黑棋胜利
{
JOptionPane.showMessageDialog(this,"黑棋胜利");
Clear_Chess();//清屏,把下过的棋子都清楚干净
return;//跳出该方法
}
}
else
{
black_count=0;//如果在竖向上黑棋没有五个在没连在一起,则把black_count重新置为0
}
if(chess[j][i]==2)
{
white_count++;//如果在竖向上白棋和上次下的棋子连在一起,则加1
if(white_count==5)//判断白棋在竖向上是否五个连在一起,如果是,则白棋胜利
{
JOptionPane.showMessageDialog(this,"白棋胜利");
Clear_Chess();//清屏,把下过的棋子都清楚干净
return;//跳出该方法
}
}
else
{
white_count=0;//如果在竖向上黑棋没有五个在没连在一起,则把black_count重新置为0
}
}
}
for(i=0;i<7;i++)//左向右斜判断
{
for(intj=0;j<7;j++)
{
for(intk=0;k<5;k++)
{
if(chess[i+k][j+k]==1)
{
black_count++;//如果黑棋在左向右斜方向上和上次下的黑棋连在一起,则加1
if(black_count==5)//判断黑棋是否在左向右斜方向上五个连在一起,如果是,则黑棋胜利
{
JOptionPane.showMessageDialog(this,"黑棋胜利");
Clear_Chess();
return;
}
}
else
{
black_count=0;//如果在左向右斜向上黑棋没有五个在没连在一起,则把black_count重新置为0
}
if(chess[i+k][j+k]==2)
{
white_count++;//如果在左向右斜向上白棋和上次下的棋子连在一起,则加1
if(white_count==5)
{
JOptionPane.showMessageDialog(this,"白棋胜利");
Clear_Chess();//清屏
return;//跳出函数
}
}
else
{
white_count=0;//如果在左向右斜向上黑棋没有五个在没连在一起,则把black_count重新置为0
}
}
}
}
for(i=4;i<11;i++)//右向左斜判断
{
for(intj=6;j>=0;j--)
{
for(intk=0;k<5;k++)
{
if(chess[i-k][j+k]==1)
{
black_count++;
if(black_count==5)
{
JOptionPane.showMessageDialog(this,"黑棋胜利");
Clear_Chess();//清屏
return;//跳出函数
}
}
else
{
black_count=0;//如果在右向左斜方向上黑棋没有五个在没连在一起,则把black_count重新置为0
}
if(chess[i-k][j+k]==2)
{
white_count++;
if(white_count==5)
{
JOptionPane.showMessageDialog(this,"白棋胜利");
Clear_Chess();//清屏
return;//跳出函数
}
}
else
{
white_count=0;//如果在右向左斜方向上黑棋没有五个在没连在一起,则把black_count重新置为0
}
}
}
}
}
voidClear_Chess()//创建Clear_Chess()方法
{
for(inti=0;i<11;i++)
{
for(intj=0;j<11;j++)
{
chess[i][j]=0;//把二维数组中的元素均重新置为0
}
}
repaint();//重新画图
}
publicvoidpaint(Graphicsg)//画图
{
Drawline(g);
Drawchess(g);
}
publicvoidmouseExited(MouseEvente){}//鼠标指针移出事件源时的处理操作
publicvoidmouseEntered(MouseEvente){}//鼠标指针移入事件源上方时的操作
publicvoidmouseReleased(MouseEvente){}//放开鼠标被按下的按钮时的操作
publicvoidmouseClicked(MouseEvente){}//在事件源上单击鼠标按钮时的操作
}
classmyframeextendsFrameimplementsWindowListener
{
mypanelpanel;
myframe()
{
setLayout(null);//取消窗口的页面设置
panel=newmypanel();
add(panel);//将panel对象加入到窗口
panel.setBounds(0,23,360,360);
setTitle("单人版五子棋");//为游戏添加标题
setBounds(200,200,360,383);//以(200,200)为棋盘的左上角,以360为宽,383为高设置棋盘大小
setVisible(true);//将窗口显示出来
addWindowListener(this);
}
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);//程序正常结束
}
publicvoidwindowDeactivated(WindowEvente){}//窗口失活时的处理操作
publicvoidwindowActivated(WindowEvente){}//激活窗口时的处理操作
publicvoidwindowOpened(WindowEvente){}//打开窗口时的处理操作
publicvoidwindowClosed(WindowEvente){}//关闭窗口时的处理操作
publicvoidwindowIconified(WindowEvente){}//窗口最小化时的处理操作
publicvoidwindowDeiconified(WindowEvent