【贪吃蛇—Java程序员写Android游戏】系列
JAVA程序源代码(贪吃蛇)
贪吃蛇源代码将Location、LocationRO、SnakeFrame、SnakeModel、SnakePanel放到命名为snake的文件夹里,主函数MainApp放到外面运行主函数即可实现。
主函数package snake;import javax.swing.*;import snake.*;public class MainApp {public static void main(String[] args) {JFrame.setDefaultLookAndFeelDecorated(true);SnakeFrame frame=new SnakeFrame();frame.setSize(350,350);frame.setResizable(false);frame.setLocation(330,220);frame.setTitle("贪吃蛇");frame.setV isible(true);}}package snake;public class Location {private int x;private int y;Location(int x,int y){this.x=x;this.y=y;}int getX(){return x;}int getY(){return y;}void setX(int x){this.x=x;}void setY(int y){this.y=y;}public boolean equalOrRev(Location e){return ((e.getX()==getX())&&(e.getY()==getY()))||((e.getX()==getX())&&(e.getY()==-1*getY()))||((e.getX()==-1*getX())&&(e.getY()==getY()));}public boolean equals(Location e){return(e.getX()==getX())&&(e.getY()==getY());}public boolean reverse(Location e){return ((e.getX()==getX())&&(e.getY()==-1*getY()))||((e.getX()==-1*getX())&&(e.getY()==getY()));}}package snake;public class LocationRO{private int x;private int y;LocationRO(int x,int y){this.x=x;this.y=y;}int getX(){return x;}int getY(){return y;}public boolean equalOrRev(LocationRO e){return ((e.getX()==getX())&&(e.getY()==getY()))||((e.getX()==getX())&&(e.getY()==-1*getY()))||((e.getX()==-1*getX())&&(e.getY()==getY()));}public boolean equals(LocationRO e){return(e.getX()==getX())&&(e.getY()==getY());}public boolean reverse(LocationRO e){return ((e.getX()==getX())&&(e.getY()==-1*getY()))||((e.getX()==-1*getX())&&(e.getY()==getY()));}}package snake;import java.awt.*;import java.awt.event.*;import javax.swing.*;class SnakeFrame extends JFrame implements ActionListener{final SnakePanel p=new SnakePanel(this);JMenuBar menubar=new JMenuBar();JMenu fileMenu=new JMenu("文件");JMenuItem newgameitem=new JMenuItem("开始");JMenuItem stopitem=new JMenuItem("暂停");JMenuItem runitem=new JMenuItem("继续");JMenuItem exititem=new JMenuItem("退出");//"设置"菜单JMenu optionMenu=new JMenu("设置");//等级选项ButtonGroup groupDegree = new ButtonGroup();JRadioButtonMenuItem oneItem= new JRadioButtonMenuItem("初级");JRadioButtonMenuItem twoItem= new JRadioButtonMenuItem("中级");JRadioButtonMenuItem threeItem= new JRadioButtonMenuItem("高级");JMenu degreeMenu=new JMenu("等级");JMenu helpMenu=new JMenu("帮助");JMenuItem helpitem=new JMenuItem("操作指南");final JCheckBoxMenuItem showGridItem = new JCheckBoxMenuItem("显示网格");JLabel scorelabel;public JTextField scoreField;private long speedtime=200;private String helpstr = "游戏说明:\n1 :方向键控制蛇移动的方向."+"\n2 :单击菜单'文件->开始'开始游戏."+"\n3 :单击菜单'文件->暂停'或者单击键盘空格键暂停游戏."+"\n4 :单击菜单'文件->继续'继续游戏."+"\n5 :单击菜单'设置->等级'可以设置难度等级."+"\n6 :单击菜单'设置->显示网格'可以设置是否显示网格."+ "\n7 :红色为食物,吃一个得10分同时蛇身加长."+"\n8 :蛇不可以出界或自身相交,否则结束游戏.";SnakeFrame(){setJMenuBar(menubar);fileMenu.add(newgameitem);fileMenu.add(stopitem);fileMenu.add(runitem);fileMenu.add(exititem);menubar.add(fileMenu);oneItem.setSelected(true);groupDegree.add(oneItem);groupDegree.add(twoItem);groupDegree.add(threeItem);degreeMenu.add(oneItem);degreeMenu.add(twoItem);degreeMenu.add(threeItem);optionMenu.add(degreeMenu);// 风格选项showGridItem.setSelected(true);optionMenu.add(showGridItem);menubar.add(optionMenu);helpMenu.add(helpitem);menubar.add(helpMenu);Container contentpane=getContentPane();contentpane.setLayout(new FlowLayout());contentpane.add(p);scorelabel=new JLabel("得分: ");scoreField=new JTextField("0",15);scoreField.setEnabled(false);scoreField.setHorizontalAlignment(0);JPanel toolPanel=new JPanel();toolPanel.add(scorelabel);toolPanel.add(scoreField);contentpane.add(toolPanel);oneItem.addActionListener(this);twoItem.addActionListener(this);threeItem.addActionListener(this);newgameitem.addActionListener(this);stopitem.addActionListener(this);runitem.addActionListener(this);exititem.addActionListener(this);helpitem.addActionListener(this);showGridItem.addActionListener(this);}public void actionPerformed(ActionEvent e){try{if(e.getSource()==helpitem){JOptionPane.showConfirmDialog(p,helpstr,"操纵说明",JOptionPane.PLAIN_MESSAGE);}else if(e.getSource()==exititem)System.exit(0);else if(e.getSource()==newgameitem)p.newGame(speedtime);else if(e.getSource()==stopitem)p.stopGame();else if(e.getSource()==runitem)p.returnGame();else if(e.getSource()==showGridItem){if(!showGridItem.isSelected()){p.setBackground(Color.lightGray);}else{p.setBackground(Color.darkGray);}}else if(e.getSource()==oneItem) speedtime=200;else if(e.getSource()==twoItem) speedtime=100;else if(e.getSource()==threeItem) speedtime=50;}catch(Exception ee){ee.printStackTrace();}}}package snake;import java.util.*;import javax.swing.JOptionPane;public class SnakeModel {private int rows,cols;//行列数private Location snakeHead,runingDiriction;//运行方向private LocationRO[][] locRO;//LocationRO类数组private LinkedList snake,playBlocks;//蛇及其它区域块private LocationRO snakeFood;//目标食物private int gameScore=0; //分数private boolean AddScore=false;//加分// 获得蛇头public LocationRO getSnakeHead(){return (LocationRO)(snake.getLast());}//蛇尾public LocationRO getSnakeTail(){return (LocationRO)(snake.getFirst());}//运行路线public Location getRuningDiriction(){return runingDiriction;}//获得蛇实体区域public LinkedList getSnake(){return snake;}//其他区域public LinkedList getOthers(){return playBlocks;}//获得总分public int getScore(){return gameScore;}//获得增加分数public boolean getAddScore(){return AddScore;}//设置蛇头方向private void setSnakeHead(Location snakeHead){ this.snakeHead=snakeHead;}//获得目标食物public LocationRO getSnakeFood(){return snakeFood;}//随机设置目标食物private void setSnakeFood(){snakeFood=(LocationRO)(playBlocks.get((int)(Math.random()*playBlocks.size()))); }//移动private void moveTo(Object a,LinkedList fromlist,LinkedList tolist){fromlist.remove(a);tolist.add(a);}//初始设置public void init(){playBlocks.clear();snake.clear();gameScore=0;for(int i=0;i<rows;i++){for(int j=0;j<cols;j++){playBlocks.add(locRO[i][j]);}}//初始化蛇的形状for(int i=4;i<7;i++){moveTo(locRO[4][i],playBlocks,snake);}//蛇头位置snakeHead=new Location(4,6);//设置随机块snakeFood=new LocationRO(0,0);setSnakeFood();//初始化运动方向runingDiriction=new Location(0,1);}//Snake构造器public SnakeModel(int rows1,int cols1){rows=rows1;cols=cols1;locRO=new LocationRO[rows][cols];snake=new LinkedList();playBlocks=new LinkedList();for(int i=0;i<rows;i++){for(int j=0;j<cols;j++){locRO[i][j]=new LocationRO(i,j);}}init();}/**定义布尔型move方法,如果运行成功则返回true,否则返回false*参数direction是Location类型,*direction 的值:(-1,0)表示向上;(1,0)表示向下;*(0,-1)表示向左;(0,1)表示向右;**/public boolean move(Location direction){//判断设定的方向跟运行方向是不是相反if (direction.reverse(runingDiriction)){snakeHead.setX(snakeHead.getX()+runingDiriction.getX());snakeHead.setY(snakeHead.getY()+runingDiriction.getY());}else{snakeHead.setX(snakeHead.getX()+direction.getX());snakeHead.setY(snakeHead.getY()+direction.getY());}//如果蛇吃到了目标食物try{if ((snakeHead.getX()==snakeFood.getX())&&(snakeHead.getY()==snakeFood.getY())){moveTo(locRO[snakeHead.getX()][snakeHead.getY()],playBlocks,snake);setSnakeFood();gameScore+=10;AddScore=true;}else{AddScore=false;//是否出界if((snakeHead.getX()<rows)&&(snakeHead.getY()<cols)&&(snakeHead.getX()>=0&&(snak eHead.getY()>=0))){//如果不出界,判断是否与自身相交if(snake.contains(locRO[snakeHead.getX()][snakeHead.getY()])){//如果相交,结束游戏JOptionPane.showMessageDialog(null, "Game Over!", "游戏结束",RMA TION_MESSAGE);return false;}else{//如果不相交,就把snakeHead加到snake里面,并且把尾巴移出moveTo(locRO[snakeHead.getX()][snakeHead.getY()],playBlocks,snake);moveTo(snake.getFirst(),snake,playBlocks);}}else{//出界,游戏结束JOptionPane.showMessageDialog(null, "Game Over!", "游戏结束", RMA TION_MESSAGE);return false;}}}catch(ArrayIndexOutOfBoundsException e){return false;}//设置运行方向if (!(direction.reverse(runingDiriction)||direction.equals(runingDiriction))){runingDiriction.setX(direction.getX());runingDiriction.setY(direction.getY());}return true;}}package snake;import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*;public class SnakePanel extends JPanel implements Runnable,KeyListener{JFrame parent=new JFrame();private int row=20; //网格行数private int col=30; //列数private JPanel[][] gridsPanel; //面板网格private Location direction;//方向定位private SnakeModel snake; //贪吃蛇private LinkedList snakeBody; //蛇的身体private LinkedList otherBlocks; //其他区域private LocationRO snakeHead; //蛇的头部private LocationRO snakeFood; //目标食物private Color bodyColor=Color.orange;//蛇的身体颜色private Color headColor=Color.black; //蛇的头部颜色private Color foodColor=Color.red; //目标食物颜色private Color othersColor=Color.lightGray;//其他区域颜色private int gameScore=0; //总分private long speed; //速度(难度设置)private boolean AddScore; //加分private Thread t; //线程private boolean isEnd; //暂停private static boolean notExit;// 构造器,初始化操作public SnakePanel(SnakeFrame parent){this.parent=parent;gridsPanel=new JPanel[row][col];otherBlocks=new LinkedList();snakeBody=new LinkedList();snakeHead=new LocationRO(0,0);snakeFood=new LocationRO(0,0);direction=new Location(0,1);// 布局setLayout(new GridLayout(row,col,1,1));for(int i=0;i<row;i++){for(int j=0;j<col;j++){gridsPanel[i][j]=new JPanel();gridsPanel[i][j].setBackground(othersColor);add(gridsPanel[i][j]);}}addKeyListener(this);}// 开始游戏public void newGame(long speed){this.speed=speed;if (notExit) {snake.init();}else{snake=new SnakeModel(row,col);notExit=true;t=new Thread(this);t.start();}requestFocus();direction.setX(0);direction.setY(1);gameScore=0;updateTextFiled(""+gameScore);isEnd=false;}// 暂停游戏public void stopGame(){requestFocus();isEnd=true;}// 继续public void returnGame(){requestFocus();isEnd=false;}// 获得总分public int getGameScore(){return gameScore;}//更新总分private void updateTextFiled(String str){((SnakeFrame)parent).scoreField.setText(str); }//更新各相关单元颜色private void updateColors(){// 设定蛇身颜色snakeBody=snake.getSnake();Iterator i =snakeBody.iterator();while(i.hasNext()){LocationRO t=(LocationRO)(i.next());gridsPanel[t.getX()][t.getY()].setBackground(bodyColor);}//设定蛇头颜色snakeHead=snake.getSnakeHead();gridsPanel[snakeHead.getX()][snakeHead.getY()].setBackground(headColor);//设定背景颜色otherBlocks=snake.getOthers();i =otherBlocks.iterator();while(i.hasNext()){LocationRO t=(LocationRO)(i.next());gridsPanel[t.getX()][t.getY()].setBackground(othersColor);}//设定临时块的颜色snakeFood=snake.getSnakeFood();gridsPanel[snakeFood.getX()][snakeFood.getY()].setBackground(foodColor); }public boolean isFocusTraversable(){return true;}//实现Runnable接口public void run(){while(true){try{Thread.sleep(speed);}catch (InterruptedException e){}if(!isEnd){isEnd=!snake.move(direction);updateColors();if(snake.getAddScore()){gameScore+=10;updateTextFiled(""+gameScore);}}}}//实现KeyListener接口public void keyPressed(KeyEvent event){int keyCode = event.getKeyCode();if(notExit){if (keyCode == KeyEvent.VK_LEFT) { //向左direction.setX(0);direction.setY(-1);}else if (keyCode == KeyEvent.VK_RIGHT) { //向右direction.setX(0);direction.setY(1);}else if (keyCode == KeyEvent.VK_UP) { //向上direction.setX(-1);direction.setY(0);}else if (keyCode == KeyEvent.VK_DOWN) { //向下direction.setX(1);direction.setY(0);}else if (keyCode == KeyEvent.VK_SPACE){ //空格键isEnd=!isEnd;}}}public void keyReleased(KeyEvent event){}public void keyTyped(KeyEvent event){}}。
基于Android贪吃蛇游戏_本科毕业设计(论文)
本科毕业设计(论文)题目名称:基于Android贪吃蛇游戏学院:计算机科学技术专业年级:计算机科学与技术08(师)级摘要本课题是利用java语言在Android平台上进行手机游戏的开发,由于本人知识的有限,以及客观条件的限制,本人打算开发一个单机版的游戏。
本人在手机上玩过贪吃蛇的游戏,曾经为了和别人比赛,苦苦的玩了好多次,追求高分!后来得知这个小小的游戏是nokia当年很成功的一款手机游戏,许多人都玩过,也很喜欢。
现在这款游戏的版本已经发展到第三版了,手机生产厂商继续开发这个游戏,看来这个游戏还是有很大的市场的。
Google公司2007年11月5日发布的开源的Android 平台——一款包括操作系统(基于Linux内核)、中间件和关键应用的手机平台,并组建了开放手机联盟(Open Handset Alliance),包括Google、中国移动、T-Mobile、宏达电、高通、摩托罗拉等领军企业。
于是,我决定利用自己大学所学的知识,自己在指导老师的帮助下,独立开发这个小游戏。
本文首先详细介绍了java的一些基本的知识点,在此基础上引出了Android,介绍了Android的基础以及其特点,然后介绍了一下Android将来的一些前景和发展。
重点说明了这个贪吃蛇程序所用到的一些类和控件,包括Drawable,Canvas, Thread,等等。
介绍了这些类的一般的使用方法,以及本程序是如何使用这些类来进行游戏的开发的。
本程序将老少皆宜的经典作品移植到手机上来,为更流行的硬件平台提供应用软件。
这些都将能很好的满足未来人们对手机游戏的需求。
吞吃蛇游戏基于Android平台编写,满足一般手机用户的娱乐需求。
关键词:Android系统; 贪食蛇游戏; 手机游戏Abstract.This topic is using java language on the Android platform mobile phone game development, I limited knowledge, and objective constraints, I intend to develop a stand-alone game. I played the game of Snake, on the phone once in order to match with others, struggling to play many times, the pursuit of high scores! Later learned that this little game nokia was very successful mobile phone games, many people have played, and also enjoyed. Version of the game has been developed to the third edition, mobile phone manufacturers continue to develop this game, it seems that this game is a great market. Open-source Android platform, Google's released on November 5, 2007 - an operating system (Linux kernel), middleware and key applications-based mobile phone platform, and the formation of the Open Handset Alliance (Open Handset Alliance), includingGoogle, China Mobile, T-Mobile, HTC, Qualcomm, Motorola and other leading enterprisesSo, I decided to use the knowledge learned in his college, in the instructor's help, the independent development of this game.This article first details some of the basic java knowledge, on this basis leads to Android, the basis of the Android and its characteristics, and then introduces the Android future prospects and development. Highlights this Snake procedures used and controls, including the Drawable Canvas, Thread, and so on. Describes the general use, as well as the program is how to use these classes to the development of the game. The ages of the classic works transplantation in this program to the phone up, to provide application software for the more popular hardware platforms. These will be well positioned to meet future demand for mobile games. Devour the snake game based on the Android platform, prepared to meet the entertainment needs of the general mobile phone users.Key words: Android system; Gluttony snake game; Mobile game目录摘要 (I)Abstract (II)第1章绪论 (1)1.1 Android简介 (1)1.1.1 Android的来源及发展 (1)1.1.2 Android系统的特点 (2)1.2 项目目的与意义 (2)1.2.1 开发目的 (2)1.2.2 开发意义 (3)1.3 国内外现状分析 (3)1.3.1 国内外手机系统现状 (3)1.3.2 国内外手机应用现状 (4)1.3.3 发展趋势 (5)第2章方案论证 (6)2.1 经济可行性分析 (6)2.2 技术可行性分析 (6)2.2.1 Android平台特性 (6)2.2.2 Android平台架构 (6)2.2.3 Android应用程序组件 (7)2.3 本项目的开发方法 (8)2.4 开发工具及环境简介 (10)2.4.1 开发工具Eclipse简介 (10)2.4.2 开发环境简介 (10)第3章需求分析 (11)3.1 系统开发目标 (11)3.2 系统需求分析 (11)3.2.1 业务需求分析 (11)3.2.2 用户需求分析 (12)3.2.3 功能需求分析 (12)第4章过程论述............................................................................. 错误!未定义书签。
JAVA开放性实验报告贪吃蛇
JAVA开放性实验报告贪吃蛇实验目的:本实验旨在利用Java语言实现一个经典的贪吃蛇游戏,通过实践提升对面向对象程序设计的理解和应用能力,加深对Java语言的熟练程度,并提高解决问题的能力和编程实践经验。
实验内容:1.设计游戏界面:通过Java中的Swing库实现游戏窗口的设计,包括游戏区域、游戏开始按钮、得分显示等。
2.实现游戏逻辑:设计贪吃蛇的移动规则,食物的生成和吃掉判定,碰撞检测等游戏逻辑。
同时实现游戏的主循环,控制游戏的进行。
3.实现键盘控制:通过监听键盘事件,实现玩家控制贪吃蛇的移动方向。
4.设计游戏机制:设置游戏的难度等级,增加贪吃蛇的移动速度、食物生成间隔等参数,使游戏更具挑战性。
5.设计游戏结束逻辑:当贪吃蛇头碰到墙壁或自身时,游戏结束并显示得分。
玩家可以选择重新开始游戏或退出。
实验步骤:1.设计游戏界面:创建一个JFrame窗口,在窗口中添加游戏画布,开始按钮和得分显示等组件。
2.实现游戏逻辑:设计Snake类和Food类,表示贪吃蛇和食物。
通过ArrayList存储贪吃蛇的身体节点,并实现移动、吃食物等方法。
3.实现键盘控制:通过实现KeyListener接口来监听键盘事件,根据按键控制贪吃蛇的移动方向。
4.设计游戏机制:设置贪吃蛇的移动速度、食物生成间隔等参数,根据难度级别逐步增加,使游戏更具挑战性。
5.设计游戏结束逻辑:当贪吃蛇头碰到墙壁或自身时,游戏结束并显示得分。
提供重新开始游戏和退出游戏的选项。
实验结果:经过实验设计和编码实现,成功完成了Java贪吃蛇游戏的开发。
游戏界面美观,操作流畅,游戏逻辑完整,玩家能够通过控制贪吃蛇吃到食物并获得得分。
随着游戏的进行,贪吃蛇会不断变长,玩家需要避开障碍,控制蛇头移动,体验游戏的乐趣和挑战。
实验总结:通过本次实验,我深入学习了Java语言的面向对象编程思想和应用,掌握了Swing库的使用方法,加深了对Java语言的理解和应用。
java贪吃蛇毕业论文
java贪吃蛇毕业论文本文将介绍贪吃蛇游戏的设计与实现,该游戏的主要功能包括游戏开始、游戏暂停、游戏结束、得分统计等。
基于Java 语言,采用面向对象的程序设计方法,构建了具有良好交互性的贪吃蛇游戏系统。
一、引言贪吃蛇是一个经典的小游戏,它在全世界范围内都受到玩家们的喜欢。
贪吃蛇这个小游戏有着简单的规则和良好的互动性,因此成为了许多程序员学习编程的入门教材。
本文旨在通过对贪吃蛇游戏的设计和实现,加深对Java编程语言的理解,提升面向对象程序设计的能力。
本文将介绍贪吃蛇游戏的整体框架设计、游戏流程设计、源代码分析等内容,希望对同学们学习Java编程有所帮助。
二、贪吃蛇游戏的设计与实现2.1整体框架设计首先,我们来看一下贪吃蛇游戏的整体框架设计。
贪吃蛇游戏的界面分为左右两部分,左边显示游戏画面,右边显示得分情况。
游戏开始后,蛇会出现在游戏画面的中央位置,游戏画面上还会随机出现食物。
如果蛇吃到了食物,那么得分就会增加,同时蛇也会变长。
如果蛇撞到了游戏画面的边界或者自己的身体,则游戏失败,游戏画面会出现“Game over”的提示。
贪吃蛇游戏的设计可以分为两个模块:游戏画面显示模块和游戏逻辑实现模块。
其中,游戏画面显示模块是用来将游戏运行时的状态显示在界面上,游戏逻辑实现模块则是通过对用户的操作产生游戏效果。
2.2游戏流程设计当用户点击游戏开始按钮后,游戏画面会显示出蛇的头部,然后蛇会按照一定的规则向前移动。
此时,用户可以通过按键控制蛇的移动方向,蛇吃到食物时,得分会增加,同时蛇的长度增加。
如果蛇撞到了游戏画面的边界或自己的身体,则游戏失败,游戏画面会出现“Game over”的提示。
如果用户点击游戏暂停按钮,则游戏就会暂停,并且再次点击按钮游戏就会恢复进行。
2.3源代码分析以下是源代码的分析,采用了面向对象的编程方式,将游戏画面、蛇、食物等各个元素都抽象成了对象。
下面我们就来看一下其中的一部分代码。
(1)GamePanel.java```javapublic class GamePanel extends JPanel {private Snake snake;//蛇private Food food;//食物private int score;//分数private int speed;//移动速度private Timer timer;//计时器public GamePanel() {snake = new Snake();food = new Food();score = 0;speed = 200;timer = new Timer(speed, new ActionListener() { @Overridepublic void actionPerformed(ActionEvent e) { snake.move();//蛇移动check();//检查游戏是否结束或吃到食物repaint();//重新绘制}});timer.start();//开始计时器}public void paint(Graphics g) {super.paint(g);snake.draw(g);//绘制蛇food.draw(g);//绘制食物g.drawString(\。
[贪吃蛇 JAVA程序员写ANDROID游戏]系列
// 初始化 private void initSnakeView() {
private SnakeView mSnakeView;
private static String ICICLE_KEY = "snake-view";
// 在 activity 第一次创建时被调用 @Override public void onCreate(Bundle savedInstanceState) {
最后分析下游戏数据的保存机制,如下:
这里考虑了 Activity 的生命周期:如果用户在游戏期间离开游戏界面,游 戏暂停;或者由于内存比较紧张,Android 关闭游戏释放内存,那么当用户返回 游戏界面的时候恢复到上次离开时的界面。 三、源码解析
详细解析下源代码,由于代码量不大,以注释的方式列出如下: 1、Snake.java
// 暂停事件被触发时 @Override protected void onPause() { super.onPause(); // Pause the game along with the activity mSnakeView.setMode(SnakeView.PAUSE); }
// 状态保存 @Override public void onSaveInstanceState(Bundle outState) { // 存储游戏状态到 View 里 outState.putBundle(ICICLE_KEY, mSnakeView.saveState()); }
JAVA小程序—贪吃蛇源代码
JAVA贪吃蛇源代码SnakeGame。
javapackage SnakeGame;import javax.swing。
*;public class SnakeGame{public static void main( String[]args ){JDialog。
setDefaultLookAndFeelDecorated( true ); GameFrame temp = new GameFrame();}}Snake.javapackage SnakeGame;import java。
awt.*;import java。
util。
*;class Snake extends LinkedList{public int snakeDirection = 2;public int snakeReDirection = 4;public Snake(){this。
add( new Point( 3, 3 ));this。
add(new Point(4, 3 ));this.add( new Point(5,3 ) );this。
add( new Point(6,3 ) );this。
add(new Point(7,3 ));this。
add( new Point( 8,3 ) );this。
add( new Point( 9, 3 ));this。
add( new Point( 10,3 ));}public void changeDirection( Point temp, int direction ) {this。
snakeDirection = direction;switch(direction ){case 1://upthis.snakeReDirection = 3;this。
add( new Point(temp.x,temp.y - 1 ));break;case 2://rightthis。
贪吃蛇安卓课程设计
贪吃蛇安卓课程设计一、课程目标知识目标:1. 学生能理解贪吃蛇游戏的原理和基本规则。
2. 学生能掌握安卓开发环境的基本操作和界面设计。
3. 学生能了解和运用Java编程语言实现贪吃蛇游戏的功能。
技能目标:1. 学生能运用安卓开发工具,独立设计和开发一款简易的贪吃蛇游戏。
2. 学生能通过调试和优化,提高贪吃蛇游戏的性能和用户体验。
3. 学生能运用所学的编程知识,解决开发过程中遇到的问题。
情感态度价值观目标:1. 培养学生对编程的兴趣,激发他们的创新精神和探究欲望。
2. 培养学生的团队协作能力,学会在项目中分工合作、共同解决问题。
3. 培养学生面对挑战时的积极态度,提高他们克服困难的信心和决心。
本课程针对初中年级学生,结合他们好奇心强、动手能力强、善于合作等特点,设计具有挑战性和趣味性的贪吃蛇游戏开发课程。
课程旨在让学生在掌握编程知识的同时,提高实践能力和创新能力,培养他们良好的团队合作精神。
通过本课程的学习,学生能够将所学的编程知识运用到实际项目中,从而提升他们的综合素质。
二、教学内容1. 安卓开发环境搭建:介绍Android Studio的安装与配置,熟悉开发工具的使用。
- 章节关联:课本第二章《Android开发环境搭建》2. 简单的界面设计:学习并应用XML布局文件,设计贪吃蛇游戏的界面。
- 章节关联:课本第三章《Android界面设计基础》3. Java编程基础:回顾和巩固Java基本语法,为游戏编程打下基础。
- 章节关联:课本第四章《Java编程基础》4. 贪吃蛇游戏逻辑实现:学习游戏循环、碰撞检测、分数统计等核心功能。
- 章节关联:课本第五章《Android事件处理》与第六章《Android动画与游戏开发》5. 游戏调试与优化:介绍日志输出、性能分析及优化方法,提高游戏体验。
- 章节关联:课本第七章《Android性能优化》6. 项目实践:分组进行项目实践,将所学知识综合运用到贪吃蛇游戏的开发中。
java贪吃蛇游戏设计课程设计
java贪吃蛇游戏设计课程设计一、课程目标知识目标:1. 让学生掌握Java编程语言的基本语法和面向对象编程思想。
2. 使学生了解贪吃蛇游戏的基本规则和设计原理。
3. 帮助学生理解游戏开发中坐标系的应用、事件处理和循环结构的使用。
技能目标:1. 培养学生运用Java语言编写简单游戏的能力。
2. 提高学生分析问题、解决问题的能力,学会运用编程思维解决实际问题。
3. 培养学生团队协作和沟通表达的能力,能在团队中发挥各自优势,共同完成项目。
情感态度价值观目标:1. 激发学生对编程的兴趣,提高学习积极性,培养自主学习能力。
2. 培养学生勇于尝试、不断探索的精神,增强面对困难的信心。
3. 引导学生关注计算机技术在日常生活中的应用,认识到科技改变生活的力量。
分析课程性质、学生特点和教学要求,本课程将目标分解为以下具体学习成果:1. 知识方面:学生能熟练使用Java语言编写贪吃蛇游戏,掌握相关概念和原理。
2. 技能方面:学生能独立分析游戏需求,设计合适的算法和数据结构,完成游戏功能。
3. 情感态度价值观方面:学生通过团队协作,体验编程带来的成就感,培养积极向上的学习态度。
二、教学内容根据课程目标,教学内容主要包括以下几部分:1. Java基本语法与面向对象编程:- 变量、数据类型、运算符- 控制结构:条件语句、循环语句- 面向对象编程:类、对象、方法、继承、封装、多态2. 游戏设计原理与实现:- 贪吃蛇游戏规则及设计思路- 坐标系的应用- 事件处理机制- 游戏循环结构设计3. 游戏编程实践:- 编程环境配置- 贪吃蛇游戏项目搭建- 游戏功能模块开发:食物、贪吃蛇、碰撞检测等- 游戏优化与调试教学内容安排与进度:1. Java基本语法与面向对象编程(第1-2周)2. 游戏设计原理与实现(第3-4周)3. 游戏编程实践(第5-8周)教材章节关联:1. 《Java编程思想》第1-4章:Java基本语法与面向对象编程2. 《Java游戏编程》第3章:游戏设计原理与实现3. 《Java游戏编程实战》第5-7章:游戏编程实践三、教学方法为了提高教学效果,激发学生的学习兴趣和主动性,本课程采用以下多样化的教学方法:1. 讲授法:教师通过生动的语言、形象的比喻,讲解Java编程基本语法和面向对象编程思想,使抽象的概念具体化,便于学生理解和掌握。
Java程序设计报告《贪吃蛇》
《Java程序设计》课程设计报告题目:贪吃蛇游戏的设计与实现指导老师:沈泽刚专业:计算机科学与技术班级:10-3姓名:梁潇一、课程设计目的贪吃蛇游戏一款非常经典的手机游戏,因为它比较简单有趣,无论老少都比较适合。
目的是更好地了解和掌握java语言,并熟练的运用java语言来实现项目。
培养自主学习的能力。
本软件在设计方面本着方便、实用及娱乐性高的宗旨,在外界进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。
二、课程设计要求贪吃蛇游戏设计与实现,主要分为以下二个模块:游戏主界面模块、游戏控制模块。
三、课程设计报告内容(一) 系统设计1、程序概述本程序是一个利用Java应用软件制作的贪吃蛇小游戏。
在游戏过程中,用户通过点击小键盘区的方向键来控制蛇的运行方向;当蛇没有吃到食物且碰到墙壁或自己的身体时游戏结束。
本程序的另一个功能是在程序运行窗口的左上角显示,用户在游戏过程中所得的分数,不过缺点就是在退处程序后,下次打开程序时无法保存。
2、游戏的主界面设计游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏图形区域界面、游戏的速度选择更新界面、游戏分数的显示更新界面、游戏开始按钮、暂停游戏按钮、退出游戏按钮以及游戏排行榜按钮。
3、游戏控制模块设计这个模块是游戏的中心环节,主要完成控制游戏的开始、暂停、退出等功能。
为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。
(二)主界面设计游戏界面主框架主要包括游戏图形区域界面、游戏的开始按钮、暂停按钮、游戏的退出按钮、困难程度、积分排行、关于作者。
(三)代码设计import java.awt.Color;import java.awt.Container;import java.awt.Graphics;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.InputEvent;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.*;public class TanChiShe extends JFrame implements ActionListener, KeyListener,Runnable{private JMenuBar menuBar;private JMenu youXiMenu,nanDuMenu,fenShuMenu,guanYuMenu;private JMenuItem kaiShiYouXi,exitItem,zuoZheItem,fenShuItem;private JCheckBoxMenuItem cJianDan,cPuTong,cKunNan;private int length = 6;private Toolkit toolkit;private int i,x,y,z,objectX,objectY,object=0,growth=0,time;private int difficult=2;private int m[]=new int[50];private int n[]=new int[50];private Thread she = null;private int life=0;private int foods = 0;private int fenshu=0;public void run() //运行{time=500;for(i=0;i<=length-1;i++){m[i]=90-i*10;n[i]=60;}x=m[0];y=n[0];z=4;while(she!=null){check();try{she.sleep(time);}catch(Exception ee){System.out.println(z+"");}}}public TanChiShe(){//***************创建新对象**************setVisible(true);menuBar = new JMenuBar();Container con=getContentPane();toolkit=getToolkit();//**************游戏菜单对象*****************youXiMenu = new JMenu("游戏");kaiShiYouXi = new JMenuItem("开始游戏");exitItem = new JMenuItem("退出游戏");//***************困难程度对象****************nanDuMenu = new JMenu("困难程度");cJianDan = new JCheckBoxMenuItem("简单");cPuTong = new JCheckBoxMenuItem("普通");cKunNan = new JCheckBoxMenuItem("困难");//*****************分数菜单对象****************fenShuMenu = new JMenu("积分排行");fenShuItem = new JMenuItem("最高记录");//****************关于对象*********************guanYuMenu = new JMenu("关于");zuoZheItem = new JMenuItem("关于作者");//***************设置关于菜单*******************guanYuMenu.add(zuoZheItem);//****************设置困难程度菜单**************nanDuMenu.add(cJianDan);nanDuMenu.add(cPuTong);nanDuMenu.add(cKunNan);//******************设置分数菜单***************fenShuMenu.add(fenShuItem);//*****************设置游戏菜单****************youXiMenu.add(kaiShiYouXi);youXiMenu.add(exitItem);//******************设置主菜单********************menuBar.add(youXiMenu);menuBar.add(nanDuMenu);menuBar.add(fenShuMenu);menuBar.add(guanYuMenu);//*********************监听注册*****************zuoZheItem.addActionListener(this);kaiShiYouXi.addActionListener(this);exitItem.addActionListener(this);addKeyListener(this);fenShuItem.addActionListener(this);//*********************加快捷键********************KeyStroke keyOpen = KeyStroke.getKeyStroke('O',InputEvent.CTRL_DOWN_MASK);kaiShiYouXi.setAccelerator(keyOpen);KeyStroke keyExit = KeyStroke.getKeyStroke('X',InputEvent.CTRL_DOWN_MASK); exitItem.setAccelerator(keyExit);//*****************设置框架**********************setJMenuBar(menuBar);setTitle("贪吃蛇");setResizable(false);setBounds(300,200,400,400);validate();setDefaultCloseOperation(EXIT_ON_CLOSE);}public static void main(String args[]){new TanChiShe();}//******************菜单监听******************************public void actionPerformed(ActionEvent e){if(e.getSource()==kaiShiYouXi){length = 6;life = 0;foods = 0;if(she==null){she=new Thread(this);she.start();}else if(she!=null){she=null;she= new Thread(this);she.start();}}if(e.getSource()==exitItem){System.exit(0);}if(e.getSource()==zuoZheItem){JOptionPane.showMessageDialog(this, "梁潇"+"\n\n");}if(e.getSource()==fenShuItem){JOptionPane.showMessageDialog(this,"最高记录为"+fenshu+""); }}//**************检查一下******************************* public void check(){isDead();if(she!=null){if(growth==0){reform();}else{upgrowth();}if(x==objectX&&y==objectY){object=0;growth=1;toolkit.beep();}//****************产生食物坐标**********************if(object==0){object=1;objectX=(int)Math.floor(Math.random()*39)*10;objectY=(int)Math.floor(Math.random()*29)*10+50;}this.repaint();}}void isDead(){if(z==4){x=x+10;}else if(z==3){x=x-10;}else if(z==2){y=y+10;}else if(z==1){y=y-10;}if(x<0||x>390||y<50||y>390) {she=null;}for(i=1;i<length;i++){if(m[i]==x&&n[i]==y){she=null;}}}public void upgrowth(){if(length<50){length++;}growth--;time=time-10;reform();life+=100;if(fenshu<life){fenshu = life;}foods++;}public void reform(){for(i=length-1;i>0;i--){m[i]=m[i-1];n[i]=n[i-1];if(z==4){m[0]=m[0]+10;}if(z==3){m[0]=m[0]-10;}if(z==2){n[0]=n[0]+10;}if(z==1){n[0]=n[0]-10;}}public void keyPressed(KeyEvent e){if(she!=null){if(e.getKeyCode()==KeyEvent.VK_UP){if(z!=2){z=1;check();}}else if(e.getKeyCode()==KeyEvent.VK_DOWN) {if(z!=1){z=2;check();}}else if(e.getKeyCode()==KeyEvent.VK_LEFT){if(z!=4){z=3;check();}else if(e.getKeyCode()==KeyEvent.VK_RIGHT){if(z!=3){z=4;check();}}}}public void keyReleased(KeyEvent e){// TODO自动生成方法存根}public void keyTyped(KeyEvent e){// TODO自动生成方法存根}public void paint(Graphics g){//*******************画图********************** g.setColor(Color.DARK_GRAY);g.fillRect(0,50,400,400);g.setColor(Color.pink);for(i=0;i<=length-1;i++){g.fillRect(m[i],n[i],10,10);}g.setColor(Color.green);g.fillRect(objectX,objectY,10,10);g.setColor(Color.white);g.drawString("当前分数"+this.life,6,60);g.drawString("当前已吃食物数"+this.foods,6,72);}}(四)测试(五)使用说明在游戏过程中,用户通过点击小键盘区的方向键来控制蛇的运行方向;当蛇没有吃到食物且碰到墙壁或自己的身体时游戏结束。
java贪吃蛇设计文档
姓名:XXXXXX 学号:XXXXXX贪吃蛇设计文档目录1 引言 (4)1.1 编写目的 (4)1.2 项目背景 (4)1.3 开发工具和语言 (4)1.4 术语说明 (4)1.4.1 数据结构 (4)1.4.2 类 (5)2 概要设计 (5)2.1 目标 (5)2.2 运行环境 (5)2.3 总体设计 (5)2.3.1 游戏设计思路 (5)2.3.2 算法中的基本概念 (6)2.3.3 游戏结构 (6)2.3.4 游戏整体流程 (6)3 数据结构设计 (6)3.1 蛇、石头、食物的表示 (7)3.2 蛇的移动 (7)3.3 存储蛇身的数据结构 (7)3.4 蛇的移动方向 (7)3.5 如何显示蛇身 (8)3.6 蛇身的移动方向 (8)3.7 吃到食物判定 (8)4 类的设计 (8)4.1 设计 (8)4.1.1 GamePanel类 (8)4.1.2 Snake类 (8)4.1.3 Food类 (8)4.1.4 Ground类 (9)4.1.5 Controller类 (9)4.1.6 Mouse类 (9)数据结构课程设计贪吃蛇4.2 通过事件监听建立联系 (9)5 详细设计 (9)5.1 controller包 (9)5.1.1 Controller类 (9)5.2 mouse包 (10)5.2.1 Mouse类 (10)5.3 entities包 (10)5.3.1 Food类 (10)5.3.2 Ground类 (10)5.3.3 Snake类 (10)5.4 game包 (11)5.4.1 Game类 (11)5.5 listener包 (11)5.5.1 Snakelistener类 (11)5.6 util包 (11)5.6.1 Global类 (11)5.7 view包 (12)5.7.1 GamePanel类 (12)5.8 sound包 (12)5.8.1 Sound类 (12)6 UI设计 (12)贪吃蛇设计文档1 引言1.1 编写目的本文档为“编程实习——贪吃蛇游戏”的全程设计说明书。
基于Java的游戏设计——贪吃蛇
毕业设计论文基于Java的游戏设计——贪吃蛇毕业设计(论文)中文摘要毕业设计(论文)外文摘要目录1 绪论 (1)1.1J AVA语言的特点 (1)1.2开发工具E CLIPSE介绍 (2)1.3开发工具JDK介绍 (3)1.4应用环境 (3)2 系统需求分析 (3)2.1需求分析 (4)2.2可行性分析 (4)3 系统概要设计 (5)3.1游戏流程图 (5)3.2设计目标 (6)3.3系统功能模块 (6)3.4系统数据结构设计 (8)4 系统详细设计 (12)4.1程序设计 (12)4.2贪吃蛇游戏各功能界面截图 (16)5 系统测试 (19)5.1测试的意义 (19)5.2测试过程 (19)5.3测试结果 (20)结论 (21)致谢 (22)参考文献 (23)1 绪论贪吃蛇是世界知名的益智类小游戏,选择这个题目一方面是为了将我们自己的所学知识加以运用;另一方面,我希望通过自己的所学知识把它剖析开来,通过自己的动手实践,真正的了解它的本质和精髓。
希望通过这次实践,能从中提高自己的编程能力。
并从中学会从零开始分析设计程序,达到学以致用,活学活用的目的。
另外,通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。
本游戏的开发语言为Java,开发工具选用Eclipse。
Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。
这里采用Java作为开发语言主要是基于Java的面向对象和可移植性。
Eclipse 是一个开放源代码的、基于Java 的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。
1.1 Java语言的特点1.1.1 简单性Java与C++语言非常相近,但Java比C++简单,它抛弃了C++中的一些不是绝对必要的功能,如头文件、预处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。
贪吃蛇java毕业设计
贪吃蛇java毕业设计贪吃蛇是一款经典的游戏,它在20世纪70年代诞生于贪吃蛇机器上,随后在各种游戏平台上得到了广泛的传播和演变。
如今,贪吃蛇已经成为了一个不可或缺的元素,出现在了各种手机应用和网页游戏中。
因此,我选择了贪吃蛇作为我的Java毕业设计题目。
在开始设计之前,我首先进行了一番调研,了解了贪吃蛇游戏的基本规则和特点。
贪吃蛇游戏的核心玩法是控制一条蛇在一个有界的区域内移动,吃掉食物以增长身体长度,同时要避免碰到自己的身体或者墙壁。
游戏的难度会随着蛇的身体长度的增加而增加,给玩家带来更大的挑战。
在设计过程中,我首先考虑了游戏的界面。
我采用了Java的图形界面库Swing 来构建游戏界面,使用了适当的颜色和图形元素,使得游戏界面看起来简洁而又美观。
我还添加了一些动画效果,如蛇的身体在移动时的流畅过渡和食物被吃掉时的消失效果,以增加游戏的可玩性和趣味性。
接下来,我着重考虑了游戏的逻辑部分。
首先,我设计了一个蛇类,包含了蛇的身体长度、移动方向和位置等属性,以及蛇的移动、吃食物和碰撞检测等方法。
然后,我设计了一个食物类,包含了食物的位置和生成方法。
在游戏的主循环中,我通过不断调用蛇的移动方法和碰撞检测方法,来实现游戏的动态效果。
同时,我还加入了一些额外的功能,如计分系统和游戏结束的判断,以增加游戏的可玩性和挑战性。
在整个设计过程中,我遇到了不少挑战和问题。
例如,如何确保蛇的移动是流畅而且不会出现闪烁的问题;如何设计一个合适的算法来生成食物,并确保食物不会出现在蛇的身体上;以及如何处理用户输入和游戏状态的切换等等。
为了解决这些问题,我进行了大量的调试和优化工作,不断地修改和完善我的代码,最终实现了一个功能完善且稳定的贪吃蛇游戏。
通过这个毕业设计,我不仅学到了如何运用Java编程语言来实现一个小游戏,还学到了如何设计和优化一个软件系统。
我深刻体会到了软件开发的复杂性和挑战性,也明白了团队合作和不断学习的重要性。
JAVA设计贪吃蛇游戏
JAVA设计贪吃蛇游戏下面是一个简单的贪吃蛇游戏的JAVA设计示例,该示例包括游戏画面的显示、控制蛇的移动、食物的生成与吃掉、以及游戏的结束等基本功能。
首先,我们需要创建一个Snake类来表示蛇的身体。
Snake类包括一个ArrayList作为蛇的身体部分,以及一个方向变量来表示蛇的移动方向。
Snake类还有一个方法来控制蛇的移动,根据方向变量移动蛇的身体。
```javaimport java.util.ArrayList;public class Snakeprivate ArrayList<Cell> body;private Direction direction;public Snakbody = new ArrayList<>(;body.add(new Cell(10, 10)); // 初始化蛇的初始位置direction = Direction.RIGHT; // 蛇的初始方向为向右}public void movCell head = body.get(0); // 蛇头Cell newHead;//根据方向变量移动蛇头的位置switch (direction)case UP:newHead = new Cell(head.getX(, head.getY( - 1); break;case DOWN:newHead = new Cell(head.getX(, head.getY( + 1); break;case LEFT:newHead = new Cell(head.getX( - 1, head.getY(); break;case RIGHT:newHead = new Cell(head.getX( + 1, head.getY(); break;default:newHead = head; // 默认不移动}//添加新的蛇头body.add(0, newHead);//删除尾部,即移动效果body.remove(body.size( - 1);}// getter和setter方法```接下来,我们创建一个Cell类来表示每一个游戏格子的位置。
JAVA课程设计贪吃蛇小程序附代码
Part Two
JAVA贪吃蛇小程序 代码解析
游戏界面实现
游戏窗口:设置游戏窗口大小和位置
游戏背景:设置游戏背景颜色和图片 游戏元素:设置蛇、食物、障碍物等 元素的位置和样式
游戏控制:设置键盘控制和鼠标控制, 实现游戏的开始、暂停和结束
游戏得分:显示游戏得分和等级,以 及游戏结束提示
游戏音效:设置游戏音效和背景音乐, 增加游戏的趣味性和沉浸感
重新开始:提供重新开始游 戏的选项,重新开始游戏时, 重置游戏界面和蛇的位置
游戏控制实现
键盘控制:通过键盘输入控制蛇的移动方向 游戏循环:通过循环实现游戏的持续运行 蛇的移动:通过改变蛇的位置实现蛇的移动 食物生成:随机生成食物,增加游戏的挑战性 碰撞检测:检测蛇与食物或边界的碰撞,实现游戏的结束或重新开始
Part Four
总结
JAVA贪吃蛇小程序的特点和亮点
添加标题
简单易用:界面简洁,操作简单,适合初学者使用
添加标题
功能丰富:支持多种游戏模式,如经典模式、挑战模式等
添加标题
性能优化:采用高效的算法和优化技术,提高游戏运行速度和稳定性
添加标题
扩展性强:支持自定义皮肤、背景音乐等,满足不同用户的需求
程序实现原理
贪吃蛇游戏是一种经典的游戏,通过控制蛇的移动来获取食物,同时避免撞到墙壁或自己的身 体。
JAVA贪吃蛇小程序的实现原理主要是通过JAVA语言编写程序,实现蛇的移动、食物的生成、 碰撞检测等功能。
蛇的移动是通过改变蛇头的位置来实现的,食物的生成则是随机生成在屏幕上的某个位置。
碰撞检测则是通过判断蛇头是否与墙壁或自己的身体发生碰撞来实现的。
游戏界面: 显示贪吃 蛇和食物
游戏操作: 通过键盘 控制贪吃 蛇移动
android游戏开发入门:贪吃蛇源代码分析
android游戏开发入门: 贪吃蛇 源代码分析贪吃蛇是一款足够经典的游戏。
它的经典,在于用户操作的简单,在于技术实现的简介,在于他的经久不衰。
这里的贪吃蛇的android实现,是SDK Samples中的开源例程。
可能各位都有看过~界面如下图啦~作为一个刚入门或者还没入门的新手,着实花了我一些力气来理解这段代码。
对于各种不懂的地方,慢慢查询资料,对于新的方法,通过修改代码尝试效果。
到现在终于能算个一知半解。
在代码中,对于自己有所收获的地方,我都做了相应的注释。
回过头来,觉得从这段代码中,能学到不少东西~~包括android应用的基本架构,他的面向对象的思想,以及代码的简洁明了。
于是,我想到,何不将这些东西分享出来,如果碰巧对感兴趣的朋友们有搜帮助,那就更好了~好了,闲话不说~代码和注释如下(处于对源码的敬意,原本的英文注释部分都没有删去~大家可以配合理解):PS:最近我正在写自己的“贪吃蛇”,说事贪吃蛇,其实完全颠覆了这个经典版本的设计理念和操作方式。
具体细节先卖一个关子,作品准备参加这次第二届大学生android应用开发大赛。
应该一个月内能完成,到时候也会开源出代码来~欢迎大家讨论指正·~*************************************************************************************************************************** *****Snake工程中,总共有三个文件: *TileView是基于Android的View类实现的方块图类,用来支撑上层类的调用,绘制方块图的显示界面。
通过这些代码,能打之了解如何 扩展View,实现特色的界面效果。
*SnakeView调用了TileView,实现了游戏逻辑 和 具体的显示。
*Snake为主Activity类。
建议大家按照上面的顺序看三个文件,可能逻辑上更舒服一点~~下面贴上代码和注释。
编写手机游戏贪吃蛇
<MTSE1.0>
六、蛇身吃到“蛇”点增长
当蛇身吃到“蛇”时,吃到的蛇自动增加到蛇的末端,蛇身长度增加1(颜 当蛇身吃到“ 吃到的蛇自动增加到蛇的末端,蛇身长度增加 ( 色不变)。 色不变)。 部分参考代码: 部分参考代码: SnakeNode head = (SnakeNode) snake.elementAt(0);//蛇头 蛇头 SnakeNode tail = (SnakeNode) snake.elementAt(snake.size() - 1);//蛇尾 蛇尾 for (int i = 0; i < diamonds.size(); i++) { SnakeNode n = (SnakeNode) diamonds.elementAt(i); if (head.posX == n.posX && head.posY == n.posY) { SnakeNode add = new SnakeNode(); add.color = n.color; switch (tail.direct) { case SnakeNode.UP: add.posX = tail.posX; add.posY = tail.posY + 10; break; ……
<MTSE1.0>
八、添加得分信息
可以简单设定,每吃到一个“蛇”点加上5分和 可以简单设定,每吃到一个“ 点加上 分和 点的颜色积分。 “蛇”点的颜色积分。 参考代码: 参考代码: score += addScore + colorCount;
<MTSE1.0>
九、判断游戏结束
只有一种游戏结束的方式,即蛇头碰到蛇身游戏结束。 只有一种游戏结束的方式,即蛇头碰到蛇身游戏结束。 参考代码: 参考代码: public void isOver() { SnakeNode head = (SnakeNode) snake.elementAt(0); for (int i = 1; i < snake.size(); i++) { SnakeNode n = (SnakeNode) snake.elementAt(i); if (head.posX == n.posX && head.posY == n.posY) { gameState = OVER; } } }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【贪吃蛇—Java程序员写Android游戏】系列
1.Android SDK Sample-Snake详解
(2011-03-31 15:32:43)
转载
标签:
贪吃蛇
android
游戏
分类: 1.Android
sdk
snake
it
Snake也是一个经典游戏了,Nokia蓝屏机的王牌游戏之一。
Android SDK 1.5就有了它的身影。
我们这里就来详细解析一下Android SDK Sample中的Snake 工程。
本工程基于SDK 2.3.3版本中的工程,路径为:%Android_SDK_HOME%
/samples/android-10/Snake
一、Eclipse工程
通过File-New Project-Android-Android Project,选择“Create project from existing sample”创建自己的应用SnakeAndroid,如下图:
运行效果如下图:
二、工程结构和类图
其实Snake的工程蛮简单的,源文件就三个:Snake.java SnakeView.java TileView.java。
Snake类是这个游戏的入口点,TitleView类进行游戏的绘画,SnakeView类则是对游戏控制操作的处理。
Coordinate,RefreshHandler是2
个辅助类,也是SnakeView类中的内部类。
其中,Coordinate是一个点的坐标(x,y),RefreshHandler将RefreshHandler对象绑定某个线程并给它发送消息。
如下图:
任何游戏都需要有个引擎来推动游戏的运行,最简化的游戏引擎就是:在一个线程中While循环,检测用户操作,对用户的操作作出反应,更新游戏的界面,直到用户退出游戏。
在Snake这个游戏中,辅助类RefreshHandler继承自Handler,用来把RefreshHandler与当前线程进行绑定,从而可以直接给线程发送消息并处理消息。
注意一点:Handle对消息的处理都是异步。
RefreshHandler在Handler的基础上增加sleep()接口,用来每隔一个时间段后给当前线程发送一个消息。
handleMessage()方法在接受消息后,根据当前的游戏状态重绘界面,运行机制如下:
这比较类似定时器的概念,在特定的时刻发送消息,根据消息处理相应的事件。
update()与sleep()间接的相互调用就构成了一个循环。
这里要注意:mRedrawHandle绑定的是Avtivity所在的线程,也就是程序的主线程;另外由于sleep()是个异步函数,所以update()与sleep()之间的相互调用才没有构成死循环。
最后分析下游戏数据的保存机制,如下:
这里考虑了Activity的生命周期:如果用户在游戏期间离开游戏界面,游戏暂停;或者由于内存比较紧张,Android关闭游戏释放内存,那么当用户返回游戏界面的时候恢复到上次离开时的界面。
三、源码解析
详细解析下源代码,由于代码量不大,以注释的方式列出如下:
1、Snake.java
2、SnakeView.java
3、TileView.java
四、工程文件下载
为了方便大家阅读,可以到如下地址下载工程源代码:
/f/14312223.html
五、小结及下期预告:
本次详细解析了Android SDK 自带 Sample——Snake的结构和功能。
下次将会把这个游戏移植到J2ME平台上,并且比较Android和J2ME的区别和相通之处,让从事过J2ME开发的朋友对Android开发有个更加直观的认识。