资源描述
序言
Java最初被命名为Oak,目标设定在家用电器等小型系统编程语言,来处理诸如电视机、电话、闹钟、烤面包机等家用电器控制和通讯问题。因为这些智能化家电市场需求没有预期高,Sun放弃了该项计划。就在Oak几近失败之时,伴随互联网发展,Sun看到了Oak在计算机网络上宽广应用前景。于是改造了Oak,以“Java”名称正式公布。
Java 编程语言风格十分靠近C、C++语言。Java是一个纯面向对象程序设计语言,它继承了 C++ 语言面向对象技术关键。Java舍弃了C ++语言中轻易引发错误指针(以引用替换)、运算符重载(operator overloading)、多重继承(以接口替换)等特征,增加了垃圾回收器功效用于回收不再被引用对象所占据内存空间,使得程序员不用再为内存管理而担忧。在 Java SE 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全枚举、不定长参数和自动装/拆箱等语言特征。
Java 不一样于通常编译实施计算机语言和解释实施计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依靠多种不一样平台上虚拟机来解释实施字节码。从而实现了“一次编译、四处实施”跨平台特征。不过,每次编译实施需要消耗一定时间,这同时也在一定程度上降低了 Java 程序运行效率。但在 J2SE 1.4.2 公布后,Java 实施速度有了大幅提升。
和传统程序不一样,Sun 企业在推出 Java 之际就将其作为一个开放技术。全球数以万计 Java 开发企业被要求所设计 Java 软件必需相互兼容。“Java 语言靠群体力量而非企业力量”是 Sun 企业口号之一,并取得了广大软件开发商认同。这和微软企业所提倡重视精英和封闭式模式完全不一样。
Sun 企业对 Java 编程语言解释是:Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全和系统无关、可移植、高性能、多线程和动态语言。
正文
1.1课程设计目标
《JAVA程序设计》是计算机相关专业必修专业基础课程,其实践性、应用性很强。实践教学步骤是必不可少一个关键步骤。本课程程序设计专题实际是计算机相关专业学生学习完《JAVA程序设计》课程后,进行一次全方面综合训练,JAVA程序设计设计目标是加深对理论教学内容了解和掌握,使学生较系统地掌握程序设计及其在网络开发中广泛应用,基础方法及技巧,为学生综合利用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。
2.1工程概况
2.1.1案例提出及工程用时
经过两天在图书馆和网络上查阅资料,然后提出这次课程设计目标《贪吃蛇游戏》设计。然后接下来就是查阅更多资料,制订接下来具体计划,最终计划用两周时间完成此次课程设计提出案例。
2.1.2开发环境
硬件环境:
CPU:Intel Pentium(R)4
主频:2.40GHz
内存:256MB
软件环境:
操作系统:Windows XP
编程环境: JDK 1.6
开发工具:Eclipse jdk
3.1设计方案论证
3.1.1设计思绪
贪吃蛇游戏设计和实现,关键分为以下二个模块:游戏主界面模块和游戏控制模块。在此只实现游戏游戏主界面模块、游戏控制模块。而且只是实现移动速度、暂停、重新开始等功效。
游戏主界面模块:
游戏主界面是进入游戏后,能够给玩家第一感官部分,关键包含游戏图形区域界面、游戏速度选择更新界面、新生方块预览、暂停游戏按钮、重新开始游戏按钮。从很大程度上决定了玩家对游戏爱好问题,所以,游戏主界面应该努力争取美观,爽心悦目。
游戏控制模块:
这个模块是游戏中心步骤,关键完成控制游戏开始、暂停、重新开始等功效。为了能够给玩家一个很好游戏环境,这部分应该做到易懂、易操作。
本设计所开发是基于Java一个贪吃蛇游戏软件,关键实现游戏速度控制、游戏暂停、游戏退出等功效,分为: 游戏主界面模块、游戏控制模块以二个模块。
3.1.2程序概述
本程序是一个利用Java应用软件制作贪食蛇小游戏。在游戏过程中,用户经过点击小键盘区方向键来控制蛇运行方向;游戏运行过程中,假如想暂停,只需要按F3键即可。重新开始游戏按键为F2。当蛇没有吃到食物且碰到墙壁或自己身体时游戏结束。
本程序另一个功效是在程序运行窗口左上角显示,用户在游戏过程中移动和长度。
3.1.3程序步骤图
此次游戏设计处理步骤图1所表示。
单击“F2”按钮,
游戏开始,蛇开始随机。
键盘操作:
向上
左移
右移
向下
没有吃到食物且蛇碰到边界
单击“确定”
游戏结束
游戏中途欲中止,稍后继续游戏
单击“F3暂停游戏”
游戏暂停
进入游戏画面
再次单击开始F3按钮,游戏恢复
图1.程序步骤图
3.1.4 总设计模块划分
依据游戏需求中游戏所要实现功效,整个游戏分为二个模块进行具体设计,图2所表示。
贪吃蛇游戏
游戏主界面模块
游戏控制模块
图2.设计总模块
游戏控制模块关键框架图3所表示。
游戏控制模块
游戏暂停功效
游戏重新开始
游戏退出
图3.控制模块框架
游戏暂停控制:点击“F3”按钮,游戏暂停;再单击,游戏继续。
游戏重新开始控制:点击“F2”键后,点击确定,即游戏重新开始。
游戏退出控制:点击“F4”键好,点击确定,退出游戏界面。
3.1.5类、方法、属性说明
(1)组员变量
表1 关键组员变量(属性)
组员变量描述
变量类型
名称
文件菜单中子菜单“新建”
JMenuItem
mFile_New
编辑菜单中子菜单“撤消”
JMenuItem
mEdit_Undo
格式菜单中子菜单“颜色”
JMenu
formatMenu_Color
帮助菜单中子菜单“帮助专题”
MenuItem
mHelp_HelpTopics
(2)方法
表2 关键方法
方法名
功效
备注
Notepad4()
描述记事本
无
Text.setBackground(Color.black)
设置编辑区默认背景色
无
Text.setForeground(Color.black)
设置编辑区默认前景色
无
4.1设计结果和分析
本程序在运行后,能够正常对应按键事件。因为程序关键部分已经集成为一个对象SnakeModel,所以利用键盘就能够实现操作。蛇前行过程中,能够任意向其左或右方向改变方向。点击F3键后游戏就暂停了。点击F2键游戏重新开始。点击F4游戏退出。运行结果以下图4所表示:
图4 程序运行图
当蛇没有吃到食物且碰到边界或碰撞到自己身体时,游戏结束。假如想重新开始即点击“确定”后按F2键,运行结果以下图5所表示:
图5 重新开始图
4.1.1程序异常处理
在蛇运行线程过程中,当蛇撞到墙或自己身体时,将抛出一个Exception类异常对象,然后使用try-catch去捕捉这个异常,
异常处理以下:
try{
Thread.sleep(timeInterval); }
catch(Exception e)
{
break;
}
心得体会
经过这次课程设计,我对这学期所学JAVA语言程序设计有一个更深刻了解,将所学知识应用于实践,因为所学知识有限,为了使游戏能够实现自己预先构想,我经过上网和去图书馆找程序,比很好步骤图及功效模块,不停阅读修改代码使程序达成预期所要实现目标,完成课程设计后,能够感觉到自己对Java程序又有了新认识。总而言之,经过此次课程设计,使我平时学到理论知识得到了很好地升华,理论和实际得到一次很好结合,为我以后参与工作打下了坚实基础,使我受益匪浅。
参考文件
[1]赵文靖编著.Java程序设计基础和上机指导.北京:清华大学出版社,
[2]赵毅主编.跨平台程序设计语言——Java.西安:西安电子科技大学出版社,
[3]王路群.Java高级程序设计.北京:中国水利水电出版社,
[4]雍俊海编著.Java程序设计习题集.北京:清华大学出版社,
[5]朱福喜编著.Java语言习题和解析.北京:清华大学出版社,
[6]吴其庆编著.Java程序设计实例教程.北京:冶金工业出版社,
程序代码:
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
public class She extends JFrame implements ActionListener, WindowListener {
JLabel bt1;
JLabel bt2;
MyPaint mp;
JMenuItem kaishi;
JMenuItem zanting;
JMenuItem tuichu;
JRadioButton chu;
JRadioButton zhong;
JRadioButton gao;
JRadioButton chao;
JMenuItem guanyu;
Font f;
public She() {
f = new Font("宋体", Font.PLAIN, 12);
mp = new MyPaint();
mp.setShe(this);
JMenuBar caidan = new JMenuBar();
JMenu shezhi = new JMenu("设置");
shezhi.setFont(f);
JMenu nandu = new JMenu("难度");
nandu.setFont(f);
JMenu bangzhu = new JMenu("帮助");
bangzhu.setFont(f);
caidan.add(shezhi);
caidan.add(nandu);
caidan.add(bangzhu);
kaishi = new JMenuItem("开始游戏 F2");
kaishi.setFont(f);
kaishi.addActionListener(this);
zanting = new JMenuItem("暂停/继续 F3");
zanting.setFont(f);
zanting.addActionListener(this);
tuichu = new JMenuItem("退出 F4");
tuichu.setFont(f);
tuichu.addActionListener(this);
chu = new JRadioButton("初级,最快速度195", true);
chu.setFont(f);
chu.addActionListener(this);
zhong = new JRadioButton("中级,最快速度225");
zhong.setFont(f);
zhong.addActionListener(this);
gao = new JRadioButton("高级,最快速度255");
gao.setFont(f);
gao.addActionListener(this);
chao = new JRadioButton("超级,最快速度275");
chao.setFont(f);
chao.addActionListener(this);
ButtonGroup bg = new ButtonGroup();
bg.add(chu);
bg.add(zhong);
bg.add(gao);
bg.add(chao);
nandu.add(chu);
nandu.add(zhong);
nandu.add(gao);
nandu.add(chao);
guanyu = new JMenuItem("相关");
guanyu.setFont(f);
guanyu.addActionListener(this);
shezhi.add(kaishi);
shezhi.add(zanting);
shezhi.add(tuichu);
bangzhu.add(guanyu);
bt1 = new JLabel(" 长度:0");
bt1.setFont(f);
bt2 = new JLabel("移动:5");
bt2.setFont(f);
JPanel p = new JPanel();
p.setLayout(new GridLayout(1, 2));
p.add(bt1);
p.add(bt2);
this.addWindowListener(this);//添加窗体监听器
this.setJMenuBar(caidan);
this.add(p, BorderLayout.NORTH);
this.add(mp);
this.add(new JLabel(" "), BorderLayout.WEST);
this.setSize(335, 385);
this.setResizable(false);
this.setLocation(300, 150);
this.setTitle("MyPaint");
this.setVisible(true);
}
public void setDS(int a, int b) {
bt1.setText(" 长度:" + a);
bt2.setText("移动:" + b);
}
public void setChu() {
chu.setSelected(true);
mp.setSD(300, 110);
this.setDS(0, 305 - 300);
chu.setEnabled(true);
zhong.setEnabled(true);
gao.setEnabled(true);
chao.setEnabled(true);
}
public void setNanDu() {
chu.setEnabled(false);
zhong.setEnabled(false);
gao.setEnabled(false);
chao.setEnabled(false);
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == zanting) {
mp.setZanTing();
}
else if (e.getSource() == kaishi) {
mp.setKaiShi();
}
else if (e.getSource() == tuichu) {
mp.setTuiChu();
}
else if (e.getSource() == guanyu) {
JLabel gy = new JLabel("小游戏 贪吃蛇 V1.0");
gy.setFont(f);
JOptionPane.showMessageDialog(this, gy);
}
else if (e.getSource() == chu) {
mp.setSD(300, 110);
this.setDS(0, 305 - 300);
}
else if (e.getSource() == zhong) {
mp.setSD(250, 80);
this.setDS(0, 305 - 250);
}
else if (e.getSource() == gao) {
mp.setSD(200, 50);
this.setDS(0, 305 - 200);
}
else if (e.getSource() == chao) {
mp.setSD(150, 30);
this.setDS(0, 305 - 150);
}
}
public static void main(String[] args) {
new She();
}
/**
* Method windowOpened
*
*
* @param e
*
*/
public void windowOpened(WindowEvent e) {
// TODO: Add your code here
}
public void windowClosing(WindowEvent e) {
System.exit(0);
}
public void windowClosed(WindowEvent e) {
// TODO: Add your code here
}
public void windowIconified(WindowEvent e) {
// TODO: Add your code here
}
public void windowDeiconified(WindowEvent e) {
// TODO: Add your code here
}
public void windowActivated(WindowEvent e) {
// TODO: Add your code here
}
public void windowDeactivated(WindowEvent e) {
// TODO: Add your code here
}
}
class MyPaint extends JPanel implements Runnable, KeyListener, FocusListener {
She s;
Font f = new Font("宋体", Font.PLAIN, 12);
int x = 150;
int y = 0;
Random r = new Random();
int sjx = r.nextInt(300)/10*10;
int sjy = r.nextInt(300)/10*10;
int fx = 2;
int sw = 0;
int sd = 300;
int cs = 0;
int d = 150;
String[] zx = new String[1000];
boolean zanting = false;
boolean zanting1 = false;
boolean siwang = false;
boolean shenti = false;
public MyPaint() {
Thread t = new Thread(this);
t.start();
this.addKeyListener(this);
this.setFocusable(true);
this.addFocusListener(this);
}
public void setShe(She ss) {
s = ss;
}
public void setZanTing() {
if (zanting) {
zanting = false;
}
else {
zanting = true;
}
}
public void setKaiShi() {
JLabel ks = new JLabel("是否重新开始?");
ks.setFont(f);
int a = JOptionPane.showConfirmDialog(s, ks);
if (a == 0) {
x = 150;
y = 0;
sjx = r.nextInt(300)/10*10;
sjy = r.nextInt(300)/10*10;
fx = 2;
sw = 0;
sd = 300;
cs = 0;
zanting = false;
siwang = false;
shenti = false;
s.setChu();
s.setDS(sw, 305 - sd);
}
}
public void setTuiChu() {
JLabel tc = new JLabel("确定退出吗?");
tc.setFont(f);
int a = JOptionPane.showConfirmDialog(s, tc);
if (a == 0) {
s.dispose();
System.exit(0);
}
}
public void setSD(int a, int b) {
sd = a;
d = b;
}
public void paint(Graphics g) {
zx[cs] = x + "/" + y;
super.paint(g);
g.setColor(Color.BLACK);
g.drawRect(0, 0, 300, 300);
g.setColor(Color.BLACK);
g.fillRect(sjx, sjy, 10, 10);
g.setColor(Color.BLUE);
g.fillRect(x, y, 10, 10);
g.setColor(Color.RED);
for (int i = 1; i <= sw; i++) {
int j = cs - i;
if (j < 0) {
j = cs-i+999+1;
}
String[] s = zx[j].split("/");
if (x == Integer.parseInt(s[0]) && y == Integer.parseInt(s[1])) {//蛇撞到自己身上了
siwang = true;
shenti = true;
}
if (sjx == Integer.parseInt(s[0]) && sjy == Integer.parseInt(s[1])) {//食物在蛇身体上
g.setColor(Color.BLACK);
g.fillRect(sjx, sjy, 10, 10);
g.setColor(Color.RED);
continue;
}
g.fillRect(Integer.parseInt(s[0]), Integer.parseInt(s[1]), 10, 10);
}
}
public void run() {
while (true) {
cs++;
if (cs == 1000) {
cs = 0;
}
switch (fx) {
case 1:
y-=10;//上
break;
case 2:
y+=10;//下
break;
case 3:
x-=10;//左
break;
case 4:
x+=10;//右
break;
}
this.repaint();
if (x == sjx && y == sjy) {
sjx = r.nextInt(300)/10*10;
sjy = r.nextInt(300)/10*10;
sw++;
if (sw == 1) {
s.setNanDu();
}
if (sd <= d) {
sd = d;
}
else {
sd-=5;
}
s.setDS(sw, 305 - sd);
}
if (x < 0 || x > 290 || y < 0 || y > 290 || shenti) {
JOptionPane.showMessageDialog(s, "游戏结束!");
siwang = true;
shenti = false;
}
while (zanting || zanting1) {
try {
Thread.sleep(100);
}
catch (Exception e) {
}
}
while (siwang) {
try {
Thread.sleep(100);
}
catch (Exception e) {
}
}
try {
Thread.sleep(sd);
}
catch (Exception e) {
}
}
}
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case 38:
fx = 1;//上
break;
case 40:
fx = 2;//下
break;
case 37:
fx = 3;//左
break;
case 39:
fx = 4;//右
break;
case KeyEvent.VK_F3:
this.setZanTing();
break;
case KeyEvent.VK_F2:
this.setKaiShi();
break;
case KeyEvent.VK_F4:
this.setTuiChu();
break;
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
public void focusGained(FocusEvent e) {
zanting1 = false;
}
public void focusLost(FocusEvent e) {
zanting1 = true;
}
}
展开阅读全文