一、概述...............................................1
- 游戏介绍:.........................................1-2
- 游戏特色:.........................................2
二、游戏图片...........................................2
三、游戏音乐...........................................2
四、游戏截图...........................................3-4
五、不足之处...........................................4
六、项目评语...........................................5
附录:游戏设计.........................................6
一、概述
1、游戏介绍:
游戏名称:《汉诺塔》
游戏题材:根据欧洲中世纪传说进行改编
游戏风格:开拓思维
游戏类型:益智类游戏
运行环境:支持jvm虚拟机的浏览器
开发工具:J2se
操作方式:小键盘数字键
游戏运行环境: Window 98操作系统以上
基本配置推荐配置
处理器CPU:赛扬1.0以上均可流畅运行
显卡:集成
声卡:集成
硬盘:10M
内存:64MB RAM
操作系统:支持jvm虚拟机的浏览器的操作系统
网络:56K 以上Modem 宽带:(ADSL,Cable Modem)
发行区域:北京
策划编程人员:5人
所在学校:北京金海计算机培训学校
用户群体:老少皆宜
游戏故事背景:据传说是在遥远的欧洲中世纪某个修道院的修道士所创。
2、游戏特色:
(1) 此游戏简化了以往游戏的繁琐操作,提高了游戏的娱乐性和可玩性。
(2) 该游戏适合任何人群,是居家旅行,工作之余,茶余饭后轻松休闲的最加方式。
可以缓解工作疲劳,精神压力,使身心得到全部放松,有益身心健康。
(3) 此外还是一款不错的考验人们动手和动脑的益智类游戏。从轻松休闲的游戏过程中开拓了自身的
视野,增强了自身的思维方式和模式。(尤其对经常从事脑力活动的人群打有益处)
(4) 画面声音出色,惟妙惟肖,且操作简易,值得挑战。
二、游戏图片
此游戏的所有图片都是用JAVA程序编译出来的,这样做的目的是为了大幅度提高游戏运行的速度。
三、游戏音乐:
游戏的声效是单独引用了SUN公司制作声效的import sun.audio.*;引入sun.audio包完成的。
此游戏在声效上已经突破了常规的声音制作模式,给人耳目一新的感觉。
四、游戏截图:

游戏最开始的原始画面

游戏进行中的游戏截图

游戏成功后的游戏截图
五、项目评语:
评语:北京金海计算机培训学校海标工作组(陈余,张卫,黄月光,倪时伟,扬宏毅)设计的游戏是基于Applet平台的游戏,此款游戏功能齐全,编码规范,而且有很好的移植性,稍加修改就能移植到各种无线平台,操作简单,体现了软件开发者先进的编程思想和优秀设计者的素质。我们课程分为三大部(初级,中级,高级)分学员完成游戏是在仅仅学完初级(java语言基础)之后,在没有系统讲解游戏的设计和游戏项目的情况下,设计出来的,可以预见,等到我们全部学习结束之后,一定能成为出色的游戏开发者。
附录:游戏设计
【教师评语】面向对象的思想理解的非常好,考虑周全,设计规范合理,条理清晰,可读性好。在初级教学中已经展现了他们良好的素质,相信在以后不但深入的学习学员们能取得更大的成功。
/*
**2005年3月6日开始***打砖块游戏****海标制作******
**用左右键控制挡板,用回车键开始游戏******
**2005年3月10日结束
*/
import java.awt.*; //引入java.awt包
import java.util.*; //引入java.util包
import java.awt.event.*; //引入java.awt.event 包
import java.applet.*; //引入java.applet包
import java.net.URL; //引入java.net.URL包
import sun.audio.*;//引入sun.audio包
import java.io.*; //引入java.io包
/**
* 游戏主框架类,在程序运行时,便生成一个静态的对象
*/
public class GroundBack extendsFrame
implements Runnable
{
AudioStreamas;//声音
AudioStreamas1;
boolean bbo=true;
boolean bo=true;
boolean bo1=true;
boolean bo2=true;
Vector va=new Vector();
Vector vb=new Vector();
Vector vc=new Vector();
String temp1,temp2,temp5;// 临时变量
char ch1,ch2;
Integer sa;
int i=1;
int k=0;
int n=3;
int a1=200;
int n2=0;
int sb=0;
int a2=400;
int lxS, lyS, lxM, lyM, lxH, lyH;
int xCenter = 80, yCenter = 500;
int radius = 50;
int AHour,AMin,ASec;
Thread timer=null;
Thread th1;
Mykey key=new Mykey();
static GroundBack gb=new GroundBack();
/**
* 构造方法
*/
public GroundBack()
{
setResizable(false);
setUndecorated(true);
if (timer== null)
{
timer = new Thread(this);//计时器
timer.setPriority(10);
timer.start();
}
this.addKeyListener(key);
th1 = new Thread(this);
th1.setPriority(1);
System.out.println (Thread.activeCount());
try
{
InputStream in = new FileInputStream ("GLASS.wav");
InputStream in1 = new FileInputStream ("1.wav");
//打开一个声音文件流作为输入
as = new AudioStream (in);
as1 = new AudioStream (in1);
}
catch( Exception e)
{
e.printStackTrace();
}
}
/**
* 绘图方法
*@paramgGraphics对象
*/
public void paint(Graphics g)
{
g.setFont(new Font("Monospaced",Font.BOLD,20));
g.setColor(Color.yellow);
g.drawString("游戏说明:游戏用键盘控制,控制键有0`1`2`3`4`5`9`+`-",50,40);
g.drawString("0表示电脑自动玩,9表示手工玩,+表示增加盘子数,-表示减少盘子数",50,66);
g.drawString("1`2`3 分别代表3根柱子,键盘输入13,表示1柱盘子移动到3柱上",50,92);
g.drawString("4表示重新开始游戏,5表示退出游戏!",50,118);
g.drawString("游戏结果:把1柱所有盘子,移到3柱上。游戏规则:大盘不能压在小盘上",50,144);
//游戏控制说明
g.setColor(Color.red);
g.setFont(new Font("Monospaced",Font.BOLD,40));
g.drawString("1",185,190);
g.drawString("2",385,190);
g.drawString("3",585,190);
g.setColor(Color.blue);
g.setFont(new Font("Monospaced",Font.BOLD,64));
g.drawString("汉 诺 塔",150,520);
g.setColor(Color.ORANGE);
g.setFont(new Font("Monospaced",Font.BOLD,32));
g.drawString("状",550,480);
g.drawString("态",550,520);
g.setColor(Color.green);
g.fillRoundRect(0,420,800,10,0,0);
move(g);
timer=null;
}
/**
* 播放声音和绘制汉诺塔图形
*/
public void n_pan()
{
try
{
InputStream in = new FileInputStream ("GLASS.wav");
InputStream in1 = new FileInputStream ("1.wav");
//打开一个声音文件流作为输入
as = new AudioStream (in);
as1 = new AudioStream (in1);
AudioPlayer.player.stop (as1);
in1.close();
}catch( Exception e){
e.printStackTrace();
}
k=0;
Graphics g=this.getGraphics();//图形
g.setColor(Color.black);//背景颜色
g.fillRect(150,200,550,220)
g.setColor(Color.green);
g.fillRoundRect(200,200,10,230,30,30);
g.fillRoundRect(400,200,10,230,30,30);
g.fillRoundRect(600,200,10,230,30,30);
g.setColor(Color.black);
g.fillRect(510,440,40,90);
g.setColor(Color.LIGHT_GRAY);
g.setFont(new Font("Monospaced",Font.BOLD,32));
g.drawString("当",510,480);
g.drawString("前",510,520);
g.setColor(Color.black);
g.fillRect(600,460,180,120);
g.setColor(Color.WHITE);
g.setFont(new Font("Monospaced",Font.BOLD,16));
g.drawString("盘子数(1-9):"+n,600,475);
g.drawString("上一步走法:",600,495);
g.drawString("总步数:",600,515);
g.setColor(Color.black);
g.fillRect(140,200,160,220);
g.fillRect(340,200,160,220);
g.fillRect(540,200,160,220);
g.setColor(Color.green);
g.fillRoundRect(200,200,10,230,30,30);
g.fillRoundRect(400,200,10,230,30,30);
g.fillRoundRect(600,200,10,230,30,30);
g.setColor(Color.magenta);
int a1=200;
int a2=400;
int n1=50/n;
va.removeAllElements();
vb.removeAllElements();
vc.removeAllElements();
for (int i=1;i<=n;i++)
{
g.fillRoundRect(a1-(n-i+1)*n1-5,a2,(n-i+1)*n1*2+20,18,30,30);
a2=a2-20;
Integer ii=new Integer(i);
va.addElement(ii);
}
bo=true;
bo1=false;
bo2=false;
}
/**
* 移动盘片
*/
public void movepan()
{
k=0;
bo=false;
bo1=true;
bo2=true;
int a2=400;
int a3=1;
int a1=200;
int n1=50/n;
for(i=1;i<=temp1.length();i++)
{
bo=false;
bo1=true;
bo2=true;
move();
try
{
th1.sleep(500);
}
catch(Exception e)
{}
bo=false;
bo1=true;
bo2=true;
}
bo=true;
bo1=true;
bo2=true;
}
/**
*
*/
public void tower(int n,String a,String b,String c)
{
String temp,temp3,temp4;
if (n%2==0)
{
temp=b;
b=c;
c=temp;
}
temp1=a;
temp2=c;
for (int i=1;i<n;i++)
{
temp3=temp1.replaceAll(a,"a");
temp3=temp3.replaceAll(b,"b");
temp3=temp3.replaceAll(c,"c");
temp3=temp3.replaceAll("a",c);
temp3=temp3.replaceAll("b",a);
temp3=temp3.replaceAll("c",b);
temp4=temp2.replaceAll(a,"a");
temp4=temp4.replaceAll(b,"b");
temp4=temp4.replaceAll(c,"c");
temp4=temp4.replaceAll("a",c);
temp4=temp4.replaceAll("b",a);
temp4=temp4.replaceAll("c",b);
temp1=temp1+a+temp3;
temp=b;
b=c;
c=temp;
temp2=temp2+c+temp4;
}
}
/**
*
*/
public void move()
{
bo=false;
bo1=true;
bo2=false;
int n1=50/n;
Graphics g=this.getGraphics();
ch1=temp1.charAt(i-1);
if (ch1=='1')
{
a1=200;
sa=(Integer)va.lastElement();
n2=va.size();
va.removeElementAt(n2-1);
}
if (ch1=='2')
{
a1=400;
sa=(Integer)vb.lastElement();
n2=vb.size();
vb.removeElementAt(n2-1);
}
if (ch1=='3')
{
a1=600;
sa=(Integer)vc.lastElement();
n2=vc.size();
vc.removeElementAt(n2-1);
}
sb=sa.intValue();
g.setColor(Color.black);
g.fillRoundRect(a1-(n-sb+1)*n1-5,a2-(n2-1)*20,(n-sb+1)*n1*2+20,18,30,30);
g.setColor(Color.green);
g.fillRect(a1,a2-(n2-1)*20,10,18);
ch2=temp2.charAt(i-1);
if (ch2=='1')
{
va.addElement(sa);
a1=200;
n2=va.size();
}
if (ch2=='2')
{
vb.addElement(sa);
a1=400;
n2=vb.size();
}
if (ch2=='3')
{
vc.addElement(sa);
a1=600;
n2=vc.size();
}
g.setColor(Color.magenta);
g.fillRoundRect(a1-(n-sb+1)*n1-5,a2-(n2-1)*20,(n-sb+1)*n1*2+20,18,30,30);
g.setColor(Color.black);
g.fillRect(680,502,50,16);
g.setColor(Color.black);
g.fillRect(690,480,60,20);
g.setColor(Color.WHITE);
g.setFont(new Font("Monospaced",Font.BOLD,16));
//g.drawString("盘子数(1-9):"+n,600,475);
g.drawString(ch1+"--"+ch2 ,700,495);
g.drawString(""+i,700,515);
if(k>0)
{
this.k++;
i++;
}
bo=true;
try
{
InputStream in = new FileInputStream ("GLASS.wav");
InputStream in1 = new FileInputStream ("1.wav");
//打开一个声音文件流作为输入
as = new AudioStream (in);
as1 = new AudioStream (in1);
}catch( Exception e){
e.printStackTrace();
}
AudioPlayer.player.start (as);
if (vc.size()==n)
{
g.setColor(Color.red);
g.setFont(new Font("Monospaced",Font.BOLD,160));
g.drawString("成功",250,350);
bo=true;
bo1=true;
bo2=true;
//AudioPlayer.player.stop (as1);
AudioPlayer.player.start (as1);
}
}
/**
*
*/
public void gdraw(String g1,String g2,String g3,
Vector av,Vector bv,Vector cv)
{
GThread tt=new GThread();
String gg1=new String(g1);
String gg2=new String(g2);
String gg3=new String(g3);
Vector aav=av;
Vector bbv=bv;
Vector ccv=cv;
if (k>=1)
{
temp5=temp5+gg1;
if (temp5.length()==1)
{
Graphics g=gb.getGraphics();
if (aav.size()>0)
{
bbo=true;
tt.start();
}
g.setColor(Color.black);
g.fillRect(690,480,60,20);
g.setColor(Color.yellow);
g.setFont(new Font("Monospaced",Font.BOLD,16));
g.drawString(gg1+"-" ,700,495);
}
if (temp5.length()==2)
{
bbo=false;
try
{
tt.join();
}
catch(Exception e){}
Graphics g=gb.getGraphics();
g.setColor(Color.black);
g.fillRect(690,480,60,20);
if (temp5.charAt(0)!=temp5.charAt(1))
{
int sb=0;
int sb1=0;
char ch1,ch2,ch3,ch4;
int a1=200;
int n2=0;
int a2=400;
Integer sa=new Integer(0);
Integer sa1=new Integer(0);
ch3=temp5.charAt(0);
ch4=temp5.charAt(1);
if ((ch3==gg2.charAt(0))&(bbv.size()>0))
{
sa=(Integer)bbv.lastElement();
sb=sa.intValue();
if (aav.size()>0)
{
sa1=(Integer)aav.lastElement();
sb1=sa1.intValue();
}
if (sb>sb1)
{
temp1=temp1+gg2;
temp2=temp2+gg1;
gb.move();
}
}
if ((ch3==gg3.charAt(0))&(ccv.size()>0))
{
sa=(Integer)ccv.lastElement();
sb=sa.intValue();
if (aav.size()>0)
{
sa1=(Integer)aav.lastElement();
sb1=sa1.intValue();
}
if (sb>sb1)
{
temp1=temp1+gg3;
temp2=temp2+gg1;
gb.move();
}
}
temp5="";
}
}
}
/**
* 绘制时钟
*/
public void drawScale(Graphics g)
{
int xHour, yHour, xMinute, yMinute;
g.setColor(Color.yellow);
for (int i = 0; i < 12; i++) {
xHour = (int) (Math.cos( (i * 30) * 3.14f / 180 - 3.14f / 2) * radius +
xCenter);
yHour = (int) (Math.sin( (i * 30) * 3.14f / 180 - 3.14f / 2) * radius +
yCenter);
g.fill3DRect(xHour - 3, yHour - 3, 6, 6, true);
}
public void move(Graphics g)
{
int xHour, yHour, xMinute, yMinute, xSecond, ySecond, second, minute, hour;
String today;
this.drawScale(g);
Date date = new Date();
second = date.getSeconds();
minute = date.getMinutes();
hour = date.getHours();
today = date.toLocaleString();
xSecond = (int) (Math.cos(second * 3.14f / 30 - 3.14f / 2) * radius +
xCenter);
ySecond = (int) (Math.sin(second * 3.14f / 30 - 3.14f / 2) * radius +
yCenter);
xMinute = (int) (Math.cos(minute * 3.14f / 30 - 3.14f / 2) * (radius - 10) +
xCenter);
yMinute = (int) (Math.sin(minute * 3.14f / 30 - 3.14f / 2) * (radius - 10) +
yCenter);
xHour = (int) (Math.cos( (hour * 30 + minute / 2) * 3.14f / 180 - 3.14f / 2) *
(radius - 30) + xCenter);
yHour = (int) (Math.sin( (hour * 30 + minute / 2) * 3.14f / 180 - 3.14f / 2) *
(radius - 30) + yCenter);
g.setColor(Color.white);
g.drawLine(xCenter, yCenter, xSecond, ySecond);
g.setColor(Color.green);
g.drawLine(xCenter, yCenter - 2, xMinute, yMinute);
g.drawLine(xCenter - 2, yCenter, xMinute, yMinute);
g.setColor(Color.blue);
g.drawLine(xCenter, yCenter - 3, xHour, yHour);
g.drawLine(xCenter - 3, yCenter, xHour, yHour);
if(AHour == hour && AMin == minute && ASec == second)
{
}
}
public void run()
{
int ji=1;
while (true)
{
ji++;
try
{
timer.sleep(1000);
}
catch (Exception e) {}
this.repaint(30,450,100,100);
}
}
//class Mykey
class GThread extends Thread
{
public void run()
{
int col=1;
int n1=50/n;
ch1=temp5.charAt(0);
if (ch1=='1')
{
a1=200;
sa=(Integer)va.lastElement();
n2=va.size();
}
if (ch1=='2')
{
a1=400;
sa=(Integer)vb.lastElement();
n2=vb.size();
}
if (ch1=='3')
{
a1=600;
sa=(Integer)vc.lastElement();
n2=vc.size();
}
sb=sa.intValue();
Graphics g=gb.getGraphics();
while (bbo)
{
if (col%2==1)
{
g.setColor(Color.black);
g.fillRoundRect(a1-(n-sb+1)*n1-5,a2-(n2-1)*20,(n-sb+1)*n1*2+20,18,30,30);
g.setColor(Color.green);
g.fillRect(a1,a2-(n2-1)*20,10,18);
}
else
{
g.setColor(Color.magenta);
g.fillRoundRect(a1-(n-sb+1)*n1-5,a2-(n2-1)*20,(n-sb+1)*n1*2+20,18,30,30);
}
col++;
try
{
this.sleep(200);
}
catch (Exception e) {}
}
g.setColor(Color.magenta);
g.fillRoundRect(a1-(n-sb+1)*n1-5,a2-(n2-1)*20,(n-sb+1)*n1*2+20,18,30,30);
}
}
/**
* 键盘控制盘片运动
*/
class Mykey extends KeyAdapter
{
public void keyTyped(KeyEvent kevent)
{
//tt=new GThread();
if(kevent.getKeyChar()=='0')
{
if (!bo1&bo)
{
Graphics g=gb.getGraphics();
g.setColor(Color.black);
g.fillRect(510,440,40,90);
g.setColor(Color.LIGHT_GRAY);
g.setFont(new Font("Monospaced",Font.BOLD,32));
g.drawString("自",510,480);
g.drawString("动",510,520);
gb.tower(n,"1","2","3");
gb.movepan();
}
}
if(kevent.getKeyChar()=='9')
{
if (!bo2&bo)
{
gb.k=1;
i=1;
gb.tower(n,"1","2","3");
Graphics g=gb.getGraphics();
g.setColor(Color.black);
g.fillRect(510,440,40,90);
g.setColor(Color.LIGHT_GRAY);
g.setFont(new Font("Monospaced",Font.BOLD,32));
g.drawString("手",510,480);
g.drawString("工",510,520);
temp1="";
temp2="";
temp5="";
}
}
if(kevent.getKeyChar()=='1')
{
if (!bo2&bo)
gb.gdraw("1","2","3",va,vb,vc);
}
if(kevent.getKeyChar()=='2')
{
if (!bo2&bo)
gb.gdraw("2","1","3",vb,va,vc);
}
if(kevent.getKeyChar()=='3')
{
if (!bo2&bo)
gb.gdraw("3","1","2",vc,va,vb);
}
if(kevent.getKeyChar()=='4')
{
if (bo)
{
gb.tower(n,"1","2","3");
gb.n_pan();
}
}
if(kevent.getKeyChar()=='+')
{
if (bo)
{
n=n+1;
if (n>9)
{
n=9;
}
else
{
gb.tower(n,"1","2","3");
gb.n_pan();
}
}
}
if(kevent.getKeyChar()=='-')
{
if (bo)
{
n=n-1;
if (n==0)
{
n=1;
}
else
{
gb.tower(n,"1","2","3");
gb.n_pan();
}
}
}
if(kevent.getKeyChar()=='5')
{
System.exit(0);
}
}
}
// 游戏主函数
public static void main(String[]args)
{
gb.setBackground(Color.BLACK);
gb.setSize(1280,1024);
gb.setVisible(true);
gb.n_pan();
}
} |