当前位置:文档之家› 贪吃蛇游戏开发设计

贪吃蛇游戏开发设计

广州商学院课程论文题目:贪吃蛇游戏开发设计课程名称面对对象程序设计考查学期2016/2017学年第 1学期姓名陈思明李权康学号************ ************ 专业计算机科学与技术指导教师包汉宗移植性和平台无关性等优点,得到了广泛地应用,它以其友好的开发界面、强大的组件支持等优点,得到广大程序员的接受和认可。

“贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。

本文基于Java技术,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。

整个游戏程序分为二个功能模块,四个类模块,实现了游戏的开始、暂停、结束。

通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。

关键词:贪吃蛇,Java,游戏一、可行性分析1.1经济可行性游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件的水平的提高。

游戏开发新技术层出不穷,经典游戏比比皆是,游戏这个名称一直存在于每个人的日常生活中。

因此,游戏对于现代人的成长历程,绝对是一个不可或缺的重要角色.而从技术方面来看,现在的java技术也融入了手机中。

这些都为开发的这款贪吃蛇游戏提供了条件。

1.2技术可行性本次设计我将主要运用java语言来完成。

Java语言是一种跨平台,适合于分布式计算环境的面向对象编程语言,用Java写的应用程序不用修改就可在不同的软硬件平台上运行。

由于Java主要用于网络应用程序开发,因此对安全性有较高的要求。

如果没有安全保证,用户从网络下载程序执行就非常危险。

Java通过自己的安全机制防止了病毒程序的产生和下载程序对本地系统的威胁破坏。

二、需求分析2.1游戏的介绍游戏的名称叫“贪吃蛇”,节:一条蛇可以看成有许多正方形的“小格子”拼凑成,我把它称作节。

节是蛇身上最小的单位。

段:当许多节连成一条直线,我称它为段。

贪吃蛇只有一段,如果它拐弯就变成两段。

链表:用来保存每一段的状态,链表的元素单位是段。

且链表的最后一个元素表示蛇的头部段。

坐标系:MIDP中的坐标以左上角那点为(0,0),向右则x递增,向下则y递增。

2.2游戏开发的可行性游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件的水平的提高。

游戏开发新技术层出不穷,经典游戏比比皆是,游戏这个名称一直存在于每个人的日常生活中。

因此,游戏对于现代人的成长历程,绝对是一个不可或缺的重要角色.而从技术方面来看,现在的java技术也融入了手机中。

这些都为开发的这款贪吃蛇游戏提供了条件。

2.3设计目的综合运用在校所学的知识和技能,设计开发贪吃蛇游戏,使自己熟悉应用系统的开发的过程,培养独立思考的能力,校验学习效果和动手能力,提高工程实践能力。

2.4游戏需求给出一条小蛇和随机出现一个食物,当小蛇吃到食物时就加分。

2.4.1游戏界面需求良好的用户界面,有分数显示和暂停。

2.4.2游戏形状需求良好的方块形状设计,绘制小蛇和食物,小蛇由几个方块组成,食物由一个方块组成。

2.4.3键盘事件处理小蛇可以通过键盘方向键(上,下,左,右)进行方向的移动。

2.4.4显示需求当小蛇吃掉几个食物后会变长,平且吃完食物时食物会消失,并立即产生一个1个新的事物。

2.4.5接口控制本软件通过键盘进行操作,在windows操作系统下,利用键盘的上下左右键进行操作,要使用键盘的接口事件。

2.4.6环境介绍操作系统:Microsoft Windows 7程序语言:Java 2开发包:Java(TM) 2 Standard Edition (5.0)Sun Micro. J2ME Wireless Tool Kit 2.2IDE: Eclipse4.4三、功能设计3.1 游戏的流程图3.2游戏主界面的开发屏幕的背景用白色,由于屏幕高比宽长,所以取以宽为边长的矩形区域作为游戏区域,下面的部分作为分数、信息区域。

图一(游戏的主界面)3.3 绘制蛇身public void repaint(){Graphics g = canvas.getGraphics();// 背景g.setColor(Color.black);g.fillRect(0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT);// 蛇g.setColor(Color.PINK);LinkedList<Node> snakeNode = snake.nodeArray;Iterator<Node> it = snakeNode.iterator();while (it.hasNext()) {Node n = (Node) it.next();drawNode(g, n);}// 食物g.setColor(Color.RED);Node n = snake.food;drawNode(g, n);updateScore();}// 绘画某一结点(蛇身或食物)private void drawNode(Graphics g, Node n) {g.fillRect(n.x * nodeWidth, n.y * nodeHeight, nodeWidth - 1, nodeHeight - 1);}// 更新分数public void updateScore() {String s = "分数:" + snake.score;label.setText(s);}3.4创建初始“蛇”及“蛇”的移动蛇的初始长度为5,边长为10个像素(背景为黄色),蛇头初始位于屏幕(100,30),方向向左,用向量表来记录每个蛇的位置以及方向。

部分参考代码如下:if (e.getKeyCode() != KeyEvent.VK_Y && !playing)return;// TODO Auto-generated method stub/* 根据按键不同, 让蛇改变不同的方向*/switch (e.getKeyCode()) {/* 方向键上*/case KeyEvent.VK_UP:if (snake.isPause()) {snake.changePause();for (GameListener l : listeners)l.gameContinue();}snake.changeDirection(Snake.UP);break;/* 方向键下*/case KeyEvent.VK_DOWN:if (snake.isPause()) {snake.changePause();for (GameListener l : listeners)l.gameContinue();}snake.changeDirection(Snake.DOWN);break;/* 方向键左*/case KeyEvent.VK_LEFT:if (snake.isPause()) {snake.changePause();for (GameListener l : listeners)l.gameContinue();}snake.changeDirection(Snake.LEFT);break;/* 方向键右*/case KeyEvent.VK_RIGHT:if (snake.isPause()) {snake.changePause();for (GameListener l : listeners)l.gameContinue();}snake.changeDirection(Snake.RIGHT);break;3.5 吃掉食物,蛇身增长当小蛇吃掉食物后,会增长,部分代码:public void snakeMoved() {/* 判断是否吃到食物*/if (food != null && food.isSnakeEatFood(snake)) {/* 吃到食物后, 蛇增加身体, 再重新丢一个食物*/snake.eatFood();food.setLocation(ground == null ? food.getNew() : ground.getFreePoint());}/* 如果吃到食物, 就肯定不会吃到石头*/else if (ground != null && ground.isSnakeEatRock(snake)) {/* 如果吃到的是石头, 或吃到自己的身体, 就让蛇死掉*/stopGame();}if (snake.isEatBody())stopGame();if (gamePanel != null)gamePanel.redisplay(ground, snake, food);/* 更新提示*/if (gameInfoLabel != null)gameInfoLabel.setText(getNewInfo());}3.6随机产生食物部分代码:* 产生食物* 说明:食物的坐标必须位于屏幕内,且不能和蛇身重合if (food != null && food.isSnakeEatFood(snake)) {/* 吃到食物后, 蛇增加身体, 再重新丢一个食物*/snake.eatFood();food.setLocation(ground == null ? food.getNew() : ground.getFreePoint());public Point getNew() {Point p = new Point();p.x = random.nextInt(Global.WIDTH);p.y = random.nextInt(Global.HEIGHT);return p;}3.7键盘事件处理可以通过键盘控制蛇的移动方向/* 方向键上*/case KeyEvent.VK_UP:if (snake.isPause()) {snake.changePause();for (GameListener l : listeners)l.gameContinue();}snake.changeDirection(Snake.UP);break;/* 方向键下*/case KeyEvent.VK_DOWN:if (snake.isPause()) {snake.changePause();for (GameListener l : listeners)l.gameContinue();}snake.changeDirection(Snake.DOWN);break;/* 方向键左*/case KeyEvent.VK_LEFT:if (snake.isPause()) {snake.changePause();for (GameListener l : listeners)l.gameContinue();}snake.changeDirection(Snake.LEFT);break;/* 方向键右*/case KeyEvent.VK_RIGHT:if (snake.isPause()) {snake.changePause();for (GameListener l : listeners)l.gameContinue();}snake.changeDirection(Snake.RIGHT);break;3.8 判断游戏结束只有两种游戏结束的方式,蛇头碰到蛇身和撞墙游戏结束。

相关主题