资源描述
枣 庄 学 院
信息科学与工程学院
课程设计任务书
题目: 贪吃蛇小游戏
学 号: 201012220202
姓 名: 常 灿
专 业: 计算机应用技术
课 程: J2ME应用技术开发
指导教师: 刘梦琳 职称: 讲师
完成时间: 2012 年 5 月----2012 年 6 月
枣庄学院信息科学与工程学院制
课程设计任务书及成绩评定
课程设计的任务和具体要求
任务:
1、利用本学期所学的知识,设计并开发出一个手机游戏或手机应用小系统。手机游戏类例如:贪吃蛇游戏、挖雷游戏、五子棋游戏等;应用小系统类,例如:手机短信的收发、通讯录系统等。
2、要求界面美观、功能较齐全;
设计要求:
1、开始显示初始化游戏界面,请稍后正在加载。
2、进入游戏列表,请选择你要玩的游戏,选择好进入游戏。
3、开始玩游戏,进行小游戏运行
指导教师签字: 、 日期:
指导教师评语
成绩: 指导教师签字: 日期:
课程设计所需软件、硬件等
硬件:计算机、打印机
软件:KVM Ecipse、WTK2.5.2 Java ME
课程设计进度计划
起至日期
工作内容
备注
2012/5/1—2012/5/15
2012/5/15—2012/6/1
2012/6/1—2012/6/15
确定程序
编写代码
撰写设计书
参考文献、资料索引
序号
文献、资料名称
编著者
出版单位
1、《基于Eclipse环境的J2ME应用程序开发》 万辉 王军@编著 清华大学出版社
2、《J2ME应用教程》 陈旭东,徐保民@编著.清华大学出版社
3、《J2ME移动设备程序设计》 胡虚怀 李换@编著.清华大学出版社.
4、《J2ME开发精讲》 詹建飞@编著.电子工业出版社.
5、《J2ME技术开发与应用》 李研 刘晶晶@编著.机械工业出版社.
摘 要
J2ME平台被认为是最杰出的手机游戏平台,它为开发者、设备制造商、网络通信公司和消费者广泛接受。它有一些非常重要的特征对所有组织都有益。因为J2ME应用在不同设备上都是便携式的,他们常常可在网络上下载和执行。
本设计通过Alert和Gauge设计的进度条,进行加载游戏等待。
通过Canvas或gameCanvas才能画到屏幕上,通过他们以及各种类库来进行设计贪吃蛇和,最后编程实现了全过程。
本游戏如我们手机上的小游戏差不多,比较人性化的,合理的设计,由于本人能力有限时间有限只能做的这样,希望大家好好看看,通过本次实验设计可以吧高级编程和低级编程都进行系统的掌握一下。
关键词:
J2ME 面向对象 Canvas gameCanvas Alert Gauge
目录
1、设计内容 5
2、设计过程 5
2.1 设计方案的论证 5
2.2、界面设计 5
2.2.1 代码流程: 5
2.2.2界面流程图: 6
3、 设计内容 8
3.1程序代码 8
3.1.1 MIDlet主程序代码(gameCanvas) 8
3.1.2 贪吃蛇游戏代码(SnakeCanvas) 10
4、 实现结果 16
4.1游戏加载框 16
4.2贪吃蛇游戏 17
5、 实验小结 18
15
1、设计内容
本设计是从设计界面开始的,从游戏的加载,在进入游戏的选择列表,你想玩那个游戏就玩那个游戏,给人们提供方便,贪吃蛇是个老幼皆宜的小游戏,贪吃蛇游戏是用户根据键盘的四个方向键控制翻向上、向左、向右和向下操作,(控制键的实现是由键盘的方向键的消息函数实现)遇到食物就进行加长蛇身,就这样不断的加长。
2、设计过程
2.1 设计方案的论证
J2ME语言继承了JAVA语言易学易用的特点,特别适合于初学者学系统编程。随着21世纪信息社会的到来,计算机在人们的工作和生活中的深入,要求我们越来越多地与计算机打交道,为了使用户在繁忙的日程工作中得到放松,于是出现了各种各样的休闲软件,如聊天工具,游戏等等。通过这学期来J2ME课程的学习,我初步掌握了J2ME语言的最基本的知识,于是老师的指导下动手用J2ME编写小游戏(贪吃蛇和扫雷)。
游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲劳,激发大家的娱乐激情。从本游戏的从设计界面出发,主要就是本设计是从设计界面开始的,从游戏的加载,在进入游戏的选择列表,你想玩那个游戏就玩那个游戏,给人们提供方便,贪吃蛇是个老幼皆宜的小游戏,贪吃蛇游戏是用户根据键盘的四个方向键控制翻向上、向左、向右和向下操作,(控制键的实现是由键盘的方向键的消息函数实现)遇到食物就进行加长蛇身,就这样不断的加长。
2.2、界面设计
2.2.1 代码流程:
Alert(Gauge)
Canvan
(GameCanvas)
结 束
gameCanvas
2.2.2界面流程图:
游戏加载
请稍后
游戏列表
贪吃蛇
选 项
进入
贪吃蛇
游戏
退 出
结 束
3、 设计内容
3.1程序代码
3.1.1 MIDlet主程序代码(gameCanvas)
package ben;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Choice;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Gauge;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.ItemCommandListener;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class gameMIDlet extends MIDlet implements Runnable{
/**显示*/
private Display display;
private SnakeCanvas snakecanvas;
public static gameMIDlet instance;
/**加载提示*/
private Alert alert;
/**加载条*/
private Gauge gauge;
/**初始时间*/
long firstTime;
private final Command cmdEnter = new Command("进入",Command.OK,1);
private final Command cmdExit = new Command("退出",Command.EXIT,1);
private final Command cmdBack = new Command("返回",Command.BACK,1);
public gameMIDlet() {
display = Display.getDisplay(this);
alert = new Alert("游戏启动中",null,null,AlertType.INFO);
gauge = new Gauge(null,false,5,1);
alert.setIndicator(gauge);
alert.setTimeout(6000);
firstTime = System.currentTimeMillis();
snakecanvas=new SnakeCanvas();
new Thread(this).start();
}
protected void destroyApp(boolean arg0){
}
protected void pauseApp() {
}
protected void startApp(){
display.setCurrent(alert);
}
public void exitApp(){
try {
destroyApp(true);
notifyDestroyed();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 控制进度提示
*/
public void run() {
// TODO Auto-generated method stub
while(true){
int time = (int)(System.currentTimeMillis() - firstTime);
gauge.setValue(time/1000);
if(time >= alert.getTimeout()){
display.setCurrent(snakecanvas);
alert.setIndicator(null);
break;
}
}
}
}
3.1.2 贪吃蛇游戏代码(SnakeCanvas)
import java.util.Random;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
public class SnakeCanvas extends Canvas implements Runnable {
/**食物的左上角X坐标*/
private int foodX;
/**食物的左上角Y坐标*/
private int foodY;
/**食物的颜色值*/
private int foodC;
/**贪吃蛇*/
private int[] snake = new int[200*3];
/**贪吃蛇食物宽度*/
private final int SNAKE_W = 4;
/**贪吃蛇食物长度*/
private final int SNAKE_H = 4;
/**贪吃蛇的身体长度,即包含食物的个数*/
private int snakeNum;
/**方向变量*/
private int direction;
/**方向上*/
private final int DIR_UP = 0;
/**方向下*/
private final int DIR_DOWN = 1;
/**方向左*/
private final int DIR_LEFT = 2;
/**方向右*/
private final int DIR_RIGHT = 3;
/**Random对象,控制食物的随机出现*/
Random random = new Random();
/**可选颜色值*/
private final int[] COLOR = {0xff0000,0x00ff00,0x0000ff,0xffff00,0xff00ff,0x00ffff,0xff000f};
/**线程对象*/
private Thread thread;
/**线程控制变量*/
private boolean isShow = true;
/**游戏是否退出控制变量*/
private boolean isExit = false;
/**屏幕宽*/
private int SCREEN_W;
/**屏幕高*/
private int SCREEN_H;
public SnakeCanvas() {
// TODO Auto-generated constructor stub
/**获取屏幕宽度和高度*/
SCREEN_W = this.getWidth();
SCREEN_H = this.getHeight();
//初始化贪吃蛇的长度
snakeNum = 7;
for(int i = 0;i < snakeNum;i++){
snake[i*3+0] = 100 - SNAKE_W * i;
snake[i*3+1] = 40;
snake[i*3+2] = COLOR[i%7];
}
//初始化贪吃蛇的移动方向
direction = DIR_RIGHT;
//初始化食物坐标
foodX = 100;
foodY = 100;
foodC = 0xff;
//启动游戏线程
thread = new Thread(this);
thread.start();
}
public void run() {
// TODO Auto-generated method stub
while(true){
//游戏逻辑控制循环体
while(isShow){
//获取每一帧的开始时间点
long st = System.currentTimeMillis();
//游戏主逻辑控制函数
main();
//刷新屏幕
repaint();
serviceRepaints();
//获取每一帧逻辑处理完后的时间点与开始时间点之间的时间差
int ct = (int)(System.currentTimeMillis() - st);
//设置游戏帧的睡眠时间
if(ct < 300){
try{
Thread.sleep(300 - ct);
}catch(Exception e){
e.printStackTrace();
}
}
}
//游戏退出控制
if(isExit){
gameMIDlet.instance.exitApp();
}
}
}
public void main(){
/**先判断是否能吃到食物*/
//定义贪吃蛇下一步的位移量
int stepX = 0;
int stepY = 0;
//判断方向,以便得到贪吃蛇下一步的位移量
switch(direction){
case DIR_UP:
stepY = -SNAKE_H;
break;
case DIR_DOWN:
stepY = SNAKE_H;
break;
case DIR_LEFT:
stepX = -SNAKE_W;
break;
case DIR_RIGHT:
stepX = SNAKE_W;
break;
}
//得到贪吃蛇蛇头下一步的位置
int newX = snake[0*3+0] + stepX;
int newY = snake[0*3+1] + stepY;
//判断下一步是否有食物,如果有则吞食,并随机再在屏幕内,蛇身外生成新的食物
if(newX == foodX && newY == foodY){
snakeNum++;
for(int i=snakeNum - 1; i > 0; i--)
{
snake[i*3+0] = snake[(i-1)*3+0];
snake[i*3+1] = snake[(i-1)*3+1];
snake[i*3+2] = snake[(i-1)*3+2];
}
snake[0*3+0] = foodX;
snake[0*3+1] = foodY;
snake[0*3+2] = foodC;
//食物被吃掉后需要生成新的食物
makeFood();
}
/**判断下一步是否超出屏幕而越界,或者碰到自身,游戏结束*/
if(isGameOver()){
isShow = false;
isExit = true;
return;
}
/**蛇身移动过程*/
for(int i = snakeNum - 1;i > 0;i--){
snake[i*3+0] = snake[(i-1)*3+0];
snake[i*3+1] = snake[(i-1)*3+1];
}
//第一个单元格移动
stepX = 0;
stepY = 0;
switch(direction){
case DIR_UP:
stepY = -SNAKE_H;
break;
case DIR_DOWN:
stepY = SNAKE_H;
break;
case DIR_LEFT:
stepX = -SNAKE_W;
break;
case DIR_RIGHT:
stepX = SNAKE_W;
break;
}
snake[0*3+0] += stepX;
snake[0*3+1] += stepY;
if(snake[0*3+0]==0){
snake[0*3+0]=SCREEN_W - SNAKE_W;
}else if(snake[0*3+0]==SCREEN_W - SNAKE_W){
snake[0*3+0]=0;
}
}
/**
*生成新的食物
*/
private void makeFood(){
//食物坐标
foodX = Math.abs(random.nextInt() % (SCREEN_W - SNAKE_W + 1)) / SNAKE_W * SNAKE_W;
foodY = Math.abs(random.nextInt() % (SCREEN_H - SNAKE_H + 1)) / SNAKE_H * SNAKE_H;
//食物颜色
foodC = COLOR[Math.abs(random.nextInt()%COLOR.length)];
}
/**
* 判断游戏是否结束
* 结束条件:
* 1、蛇头超出边界
* 2、蛇头碰到自身
*/
private boolean isGameOver(){
//边界判别
// if(snake[0*3+0] < 0 || snake[0*3+0] > (SCREEN_W - SNAKE_W) ||
// snake[0*3+1] < 0 || snake[0*3+1] > (SCREEN_H - SNAKE_H)){
// return true;
// }
//碰到自身
for(int i = 4;i < snakeNum;i++){
if(snake[0*3+0] == snake[i*3+0]
&& snake[0*3+1] == snake[i*3+1]){
return true;
}
}
return false;
}
/**
* 绘制函数
*/
protected void paint(Graphics g) {
// TODO Auto-generated method stub
//屏幕擦除
g.setColor(0);
g.fillRect(0,0,SCREEN_W,SCREEN_H);
//绘制贪吃蛇
for(int i=0; i<snakeNum; i++){
drawSnake(g,snake[i*3+0],snake[i*3+1],snake[i*3+2]);
}
//绘制食物
drawSnake(g,foodX,foodY,foodC);
}
/**
* 绘制贪吃蛇和食物
* @param g
* @param x
* @param y
* @param color
*/
private void drawSnake(Graphics g,int x,int y,int color){
g.setColor(0xffffff);
g.fillArc(x,y,SNAKE_W,SNAKE_H,0,360);
g.setColor(color);
g.fillArc(x+1,y+1,SNAKE_W-1,SNAKE_H-1,0,360);
}
/**
* 事件处理
*/
public void keyPressed(int keyCode){
int action = this.getGameAction(keyCode);
//改变方向
switch(action){
case UP:
if(direction != DIR_DOWN){
direction = DIR_UP;
}
break;
case DOWN:
if(direction != DIR_UP){
direction = DIR_DOWN;
}
break;
case LEFT:
if(direction != DIR_RIGHT){
direction = DIR_LEFT;
}
break;
case RIGHT:
if(direction != DIR_LEFT){
direction = DIR_RIGHT;
}
break;
case FIRE:
//暂停和继续
isShow = !isShow;
break;
}
}
}
4、 实现结果
4.1游戏加载框
4.2贪吃蛇游戏
5、 实验小结
于课程设计时间较短,所以该游戏还有许多不尽如人意的地方,如游戏没开始结束了,退出游戏不能存储进度等多方面问题。这些都有待进一步改善,如在游戏中还可以更换背景音乐,以适合不同的玩家,在每通过一关可以给玩家播放一段flash,吸引玩家去挑战极限,不断提高玩家的兴趣。
课程设计已经结束了,但在课程设计的这些体会要应用到今后的日常学习中去。在新的学期,我觉得自己要在以下几个方面加以注意:
首先,在学习专业课的时候要注意理论联系实际。注意将课本上的知识应用到日常的操作中,真正做到学以致用。只有这样,才能做到目的明确,才能有足够的学习动力。
其次,在学习过程中要经常与同学进行交流,讨论所遇到的问题,并一起解决。在讨论中解决问题,会节约很多时间,并且在交流的过程中,我们也可以学到更多。
展开阅读全文