贪吃蛇代码java(java贪吃蛇代码注释求解)
本文目录
- java贪吃蛇代码注释求解
- java 贪吃蛇代码移动方面的问题
- 贪吃蛇 java代码
- 求一份java 贪吃蛇的代码
- 求Java贪吃蛇代码
- 求java贪吃蛇的编程,并有注释
- 求一段JAVA编写的贪吃蛇小程序源代码
- 用JAVA设计游戏:贪吃蛇游戏
java贪吃蛇代码注释求解
import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; public class InterFace extends JFrame { /** * WIDTH:宽 * HEIGHT:高 * SLEEPTIME:可以看作蛇运动的速度 * L = 1,R = 2, U = 3, D = 4 左右上下代码 */ public static final int WIDTH = 800, HEIGHT = 600, SLEEPTIME = 200, L = 1,R = 2, U = 3, D = 4; BufferedImage offersetImage= new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_3BYTE_BGR);; Rectangle rect = new Rectangle(20, 40, 15 * 50, 15 * 35); Snake snake; Node node; public InterFace() { //创建“蛇“对象 snake = new Snake(this); //创建“食物“对象 createNode(); this.setBounds(100, 100, WIDTH, HEIGHT); //添加键盘监听器 this.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent arg0) { System.out.println(arg0.getKeyCode()); switch (arg0.getKeyCode()) { //映射上下左右4个键位 case KeyEvent.VK_LEFT: snake.dir = L; break; case KeyEvent.VK_RIGHT: snake.dir = R; break; case KeyEvent.VK_UP: snake.dir = U; break; case KeyEvent.VK_DOWN: snake.dir = D; } } }); this.setTitle(“贪吃蛇 0.1 By : Easy“); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setVisible(true); //启动线程,开始执行 new Thread(new ThreadUpadte()).start(); } public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) offersetImage.getGraphics(); g2d.setColor(Color.white); g2d.fillRect(0, 0, WIDTH, HEIGHT); g2d.setColor(Color.black); g2d.drawRect(rect.x, rect.y, rect.width, rect.height); //如果蛇碰撞(吃)到食物,则创建新食物 if (snake.hit(node)) { createNode(); } snake.draw(g2d); node.draw(g2d); g.drawImage(offersetImage, 0, 0, null); } class ThreadUpadte implements Runnable { public void run() { //无限重绘画面 while (true) { try { Thread.sleep(SLEEPTIME); repaint(); // } catch (InterruptedException e) { e.printStackTrace(); } } } } /** * 创建食物 */ public void createNode() { //随机食物的出现位置 int x = (int) (Math.random() * 650) + 50,y = (int) (Math.random() * 500) + 50; Color color = Color.blue; node = new Node(x, y, color); } public static void main(String args) { new InterFace(); } } /** * 节点类(包括食物和蛇的身躯组成节点) */class Node { int x, y, width = 15, height = 15; Color color; public Node(int x, int y, Color color) { this(x, y); this.color = color; } public Node(int x, int y) { this.x = x; this.y = y; this.color = color.black; } public void draw(Graphics2D g2d) { g2d.setColor(color); g2d.drawRect(x, y, width, height); } public Rectangle getRect() { return new Rectangle(x, y, width, height); } } /** * 蛇 */class Snake { public List《Node》 nodes = new ArrayList《Node》(); InterFace interFace; int dir=InterFace.R; public Snake(InterFace interFace) { this.interFace = interFace; nodes.add(new Node(20 + 150, 40 + 150)); addNode(); } /** * 是否碰撞到食物 * @return true 是 false 否 */ public boolean hit(Node node) { //遍历整个蛇体是否与食物碰撞 for (int i = 0; i 《 nodes.size(); i++) { if (nodes.get(i).getRect().intersects(node.getRect())) { addNode(); return true; } } return false; } public void draw(Graphics2D g2d) { for (int i = 0; i 《 nodes.size(); i++) { nodes.get(i).draw(g2d); } move(); } public void move() { nodes.remove((nodes.size() - 1)); addNode(); } public synchronized void addNode() { Node nodeTempNode = nodes.get(0); //如果方向 switch (dir) { case InterFace.L: //判断是否会撞墙 if (nodeTempNode.x 《= 20) { nodeTempNode = new Node(20 + 15 * 50, nodeTempNode.y); } nodes.add(0, new Node(nodeTempNode.x - nodeTempNode.width, nodeTempNode.y)); break; case InterFace.R: //判断是否会撞墙 if (nodeTempNode.x 》= 20 + 15 * 50 - nodeTempNode.width) { nodeTempNode = new Node(20 - nodeTempNode.width, nodeTempNode.y); } nodes.add(0, new Node(nodeTempNode.x + nodeTempNode.width, nodeTempNode.y)); break; case InterFace.U: //判断是否会撞墙 if (nodeTempNode.y 《= 40) { nodeTempNode = new Node(nodeTempNode.x, 40 + 15 * 35); } nodes.add(0, new Node(nodeTempNode.x, nodeTempNode.y - nodeTempNode.height)); break; case InterFace.D: //判断是否会撞墙 if (nodeTempNode.y 》= 40 + 15 * 35 - nodeTempNode.height) { nodeTempNode = new Node(nodeTempNode.x,40 - nodeTempNode.height); } nodes.add(0, new Node(nodeTempNode.x, nodeTempNode.y + nodeTempNode.height)); break; } } }
java 贪吃蛇代码移动方面的问题
你不是有个temp的标识吗?可以用这个判断撒,记录上一状态。修改如下:public void keyPressed(KeyEvent e) { if (start){ switch (e.getKeyCode()){ case KeyEvent.VK_UP:if(temp==2) break; move(0,-1); temp =1; break; case KeyEvent.VK_DOWN:if(temp==1) break; move(0,1); temp =2; break; case KeyEvent.VK_LEFT:if(temp==4) break; move(-1,0); temp =3; break; case KeyEvent.VK_RIGHT:if(temp==3) break; move(1,0); temp =4; break; default: break; } } }
贪吃蛇 java代码
自己写着玩的,很简单,你试一试哦...主要用了javax.swing.Timer这个类:import java.awt.*;import javax.swing.*;@SuppressWarnings(“serial“)public class MainClass extends JFrame { ControlSnake control; Toolkit kit; Dimension dimen; public static void main(String args) { new MainClass(“my snake“); } public MainClass(String s) { super(s); control = new ControlSnake(); control.setFocusable(true); kit = Toolkit.getDefaultToolkit(); dimen = kit.getScreenSize(); add(control); setLayout(new BorderLayout()); setLocation(dimen.width / 3, dimen.height / 3);// dimen.width/3,dimen.height/3 setSize(FWIDTH, FHEIGHT); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); setVisible(true); } public static final int FWIDTH = 315; public static final int FHEIGHT = 380;}import java.util.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.Timer;import java.util.Random;@SuppressWarnings(“serial“)public class ControlSnake extends JPanel implements ActionListener { Random rand; ArrayList《Point》 list, listBody; String str, str1; static boolean key; int x, y, dx, dy, fx, fy, flag; int snakeBody; int speed; public ControlSnake() { snakeBody = 1; str = “上下左右方向键控制 P键暂停...“; str1 = “现在的长度为:“ + snakeBody; key = true; flag = 1; speed = 700; rand = new Random(); list = new ArrayList《Point》(); listBody = new ArrayList《Point》(); x = 5; y = 5; list.add(new Point(x, y)); listBody.add(list.get(0)); dx = 10; dy = 0; fx = rand.nextInt(30) * 10 + 5;// 2 fy = rand.nextInt(30) * 10 + 5;// 2 setBackground(Color.WHITE); setSize(new Dimension(318, 380)); final Timer time = new Timer(speed, this); time.start(); addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if (e.getKeyCode() == 37) { dx = -10; dy = 0; } else if (e.getKeyCode() == 38) { dx = 0; dy = -10; } else if (e.getKeyCode() == 39) { dx = 10; dy = 0; } else if (e.getKeyCode() == 40) { dx = 0; dy = 10; } else if (e.getKeyCode() == 80) { if (flag % 2 == 1) { time.stop(); } if (flag % 2 == 0) { time.start(); } flag++; } } }); } public void paint(Graphics g) { g.setColor(Color.WHITE); g.fillRect(0, 0, 400, 400); g.setColor(Color.DARK_GRAY); g.drawLine(3, 3, 305, 3); g.drawLine(3, 3, 3, 305); g.drawLine(305, 3, 305, 305); g.drawLine(3, 305, 305, 305); g.setColor(Color.PINK); for (int i = 0; i 《 listBody.size(); i++) { g.fillRect(listBody.get(i).x, listBody.get(i).y, 9, 9); } g.fillRect(x, y, 9, 9); g.setColor(Color.ORANGE); g.fillRect(fx, fy, 9, 9); g.setColor(Color.DARK_GRAY); str1 = “现在的长度为:“ + snakeBody; g.drawString(str, 10, 320); g.drawString(str1, 10, 335); } public void actionPerformed(ActionEvent e) { x += dx; y += dy; if (makeOut() == false) { JOptionPane.showMessageDialog(null, “重新开始......“); speed = 700; snakeBody = 1; x = 5; y = 5; list.clear(); list.add(new Point(x, y)); listBody.clear(); listBody.add(list.get(0)); dx = 10; dy = 0; } addPoint(x, y); if (x == fx && y == fy) { speed = (int) (speed * 0.8);//速度增加参数 if (speed 《 200) { speed = 100; } fx = rand.nextInt(30) * 10 + 5;// 2 fy = rand.nextInt(30) * 10 + 5;// 2 snakeBody++;// 2 } // 2 repaint(); } public void addPoint(int xx, int yy) { // 动态的记录最新发生的50步以内的移动过的坐标 // 并画出最新的snakeBody if (list.size() 《 100) {//蛇身长度最长为100 list.add(new Point(xx, yy)); } else { list.remove(0); list.add(new Point(xx, yy)); } if (snakeBody == 1) { listBody.remove(0); listBody.add(0, list.get(list.size() - 1)); } else { listBody.clear(); if (list.size() 《 snakeBody) { for (int i = list.size() - 1; i 》 0; i--) { listBody.add(list.get(i)); } } else { for (int i = list.size() - 1; listBody.size() 《 snakeBody; i--) { listBody.add(list.get(i)); } } } } public boolean makeOut() { if ((x 《 3 || y 《 3) || (x 》 305 || y 》 305)) { return false; } for (int i = 0; i 《 listBody.size() - 1; i++) { for (int j = i + 1; j 《 listBody.size(); j++) { if (listBody.get(i).equals(listBody.get(j))) { return false; } } } return true; }}
求一份java 贪吃蛇的代码
package games;import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import static java.lang.Math.*;//静态导入/* * 此类是贪吃蛇的简单实现方法 * 自己可以加入在开始时的设置,比如 * 选关,初始的蛇的长度等等 */public class Snake extends JPanel { private static final long serialVersionUID = 1L; private Direction dir;// 要走的方向 private int blockWidth = 10;// 块大小 private int blockSpace = 2;// 块之间的间隔 private long sleepTime;// 重画的进间间隔 private MySnake my; private int total;// 代表蛇的长度 private Rectangle food;// 代表蛇的食物 private volatile boolean go; private int round;// 表示第几关 public Snake(JFrame jf) { initOther(); // 为顶级窗口类JFrame添加事件处理函数 jf.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent ke) { int code = ke.getKeyCode(); if (code == KeyEvent.VK_RIGHT) { if (dir != Direction.WEST) dir = Direction.EAST; } else if (code == KeyEvent.VK_LEFT) { if (dir != Direction.EAST) dir = Direction.WEST; } else if (code == KeyEvent.VK_UP) { if (dir != Direction.SOUTH) dir = Direction.NORTH; } else if (code == KeyEvent.VK_DOWN) { if (dir != Direction.NORTH) dir = Direction.SOUTH; } else if (code == KeyEvent.VK_ENTER) { if (!go) initOther(); } } }); this.setBounds(300, 300, 400, 400); this.setVisible(true); } // 随机生成一个食物的位置 private void makeFood() { int x = 40 + (int) (random() * 30) * 12; int y = 10 + (int) (random() * 30) * 12; food = new Rectangle(x, y, 10, 10); } // 做一些初始化的工作 private void initOther() { dir = Direction.EAST; sleepTime = 500; my = new MySnake(); makeFood(); total = 3; round = 1; new Thread(new Runnable() { public void run() { go = true; while (go) { try { Thread.sleep(sleepTime); repaint(); } catch (Exception exe) { exe.printStackTrace(); } } } }).start(); } // 处理多少关的函数 private void handleRound() { if (total == 6) { round = 2; sleepTime = 300; } else if (total == 10) { round = 3; sleepTime = 200; } else if (total == 15) { round = 4; sleepTime = 100; } else if (total == 18) { round = 5; sleepTime = 50; } else if (total == 20) { round = 6; sleepTime = 20; } else if (total 》 21) { round = 7; sleepTime = 15; } } // 把自己的组件全部画出来 public void paintComponent(Graphics g) { g.setColor(Color.PINK); g.fillRect(0, 0, this.getWidth(), this.getHeight()); g.setColor(Color.BLACK); g.drawRect(40, 10, 358, 360); if (go) { my.move(); my.draw(g); g.setFont(new Font(“黑体“, Font.BOLD, 20)); g.drawString(“您的得分:“ + (total * 10) + “ 第“ + round + “关“, 40, 400); } else { g.setFont(new Font(“黑体“, Font.BOLD, 20)); g.drawString(“游戏结束,按回车(ENTER)键重玩!“, 40, 440); } g.setColor(Color.RED); g.fillRect(food.x, food.y, food.width, food.height); } private class MySnake { private ArrayList《Rectangle》 list; public MySnake() { list = new ArrayList《Rectangle》(); list.add(new Rectangle(160 + 24, 130, 10, 10)); list.add(new Rectangle(160 + 12, 130, 10, 10)); list.add(new Rectangle(160, 130, 10, 10)); } // 蛇移动的方法 public void move() { if (isDead()) { go = false; return; } if (dir == Direction.EAST) { Rectangle rec = list.get(0); Rectangle rec1 = new Rectangle(rec.x + (blockWidth + blockSpace), rec.y, rec.width, rec.height); list.add(0, rec1); } else if (dir == Direction.WEST) { Rectangle rec = list.get(0); Rectangle rec1 = new Rectangle(rec.x - (blockWidth + blockSpace), rec.y, rec.width, rec.height); list.add(0, rec1); } else if (dir == Direction.NORTH) { Rectangle rec = list.get(0); Rectangle rec1 = new Rectangle(rec.x, rec.y - (blockWidth + blockSpace), rec.width, rec.height); list.add(0, rec1); } else if (dir == Direction.SOUTH) { Rectangle rec = list.get(0); Rectangle rec1 = new Rectangle(rec.x, rec.y + (blockWidth + blockSpace), rec.width, rec.height); list.add(0, rec1); } if (isEat()) { handleRound(); makeFood(); } else { list.remove(list.size() - 1); } } // 判断是否吃到了食物 private boolean isEat() { if (list.get(0).contains(food)) { total++; return true; } else return false; } // 判断是否死了,如果碰壁或者自己吃到自己都算死了 private boolean isDead() { Rectangle temp = list.get(0); if (dir == Direction.EAST) { if (temp.x == 388) return true; else { Rectangle comp = new Rectangle(temp.x + 12, temp.y, 10, 10); for (Rectangle rec : list) { if (rec.contains(comp)) return true; } } return false; } else if (dir == Direction.WEST) { if (temp.x == 40) return true; else { Rectangle comp = new Rectangle(temp.x - 12, temp.y, 10, 10); for (Rectangle rec : list) { if (rec.contains(comp)) return true; } } return false; } else if (dir == Direction.NORTH) { if (temp.y == 10) return true; else { Rectangle comp = new Rectangle(temp.x, temp.y - 12, 10, 10); for (Rectangle rec : list) { if (rec.contains(comp)) return true; } } return false; } else if (dir == Direction.SOUTH) { if (temp.y == 358) return true; else { Rectangle comp = new Rectangle(temp.x, temp.y + 12, 10, 10); for (Rectangle rec : list) { if (rec.contains(comp)) return true; } } return false; } else { return false; } } // 把自己画出来 public void draw(Graphics g) { for (Rectangle rec : list) { g.fillRect(rec.x, rec.y, rec.width, rec.height); } } } public static void main(String arsg) { JFrame jf = new JFrame(“贪吃蛇“); Snake s = new Snake(jf); jf.getContentPane().add(s, BorderLayout.CENTER); jf.setBounds(300, 300, 500, 500); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }}// 定义一个枚举,在此也可以用接口或者常量值代替enum Direction { EAST, SOUTH, WEST, NORTH;}
求Java贪吃蛇代码
贪吃蛇 import java.awt.*; import java.awt.event.*; public class GreedSnake //主类 { /** * @param args */ public static void main(String args) { // TODO Auto-generated method stub new MyWindow(); } } class MyPanel extends Panel implements KeyListener,Runnable//自定义面板类,继承了键盘和线程接口 { Button snake; //定义蛇按钮 int shu=0; //蛇的节数 int food; //食物数组 boolean result=true; //判定结果是输 还是赢 Thread thread; //定义线程 static int weix,weiy; //食物位置 boolean t=true; //判定游戏是否结束 int fangxiang=0; //蛇移动方向 int x=0,y=0; //蛇头位置 MyPanel() { setLayout(null); snake=new Button; food=new int ; thread=new Thread(this); for(int j=0;j《20;j++) { food.getBounds()); num--; } if(shu==15) //如果蛇节数等于15则胜利 { t=false; result=true; repaint(); } } } public void keyPressed(KeyEvent e) //按下键盘方向键 { if(e.getKeyCode()==KeyEvent.VK_RIGHT)//右键 { if(fangxiang!=1)//如果先前方向不为左 fangxiang=0; } else if(e.getKeyCode()==KeyEvent.VK_LEFT) { if(fangxiang!=0) fangxiang=1; } else if(e.getKeyCode()==KeyEvent.VK_UP) { if(fangxiang!=3) fangxiang=2; } else if(e.getKeyCode()==KeyEvent.VK_DOWN) { if(fangxiang!=2) fangxiang=3; } } public void keyTyped(KeyEvent e) { } public void keyReleased(KeyEvent e) { } public void paint(Graphics g) //在面板上绘图 { int x1=this.getWidth()-1; int y1=this.getHeight()-1; g.setColor(Color.red); g.fillOval(weix, weiy, 10, 10);//食物 g.drawRect(0, 0, x1, y1); //墙 if(t==false&&result==false) g.drawString(“GAME OVER!“, 250, 200);//输出游戏失败 else if(t==false&&result==true) g.drawString(“YOU WIN!“, 250, 200);//输出游戏成功 } } class MyWindow extends Frame implements ActionListener//自定义窗口类 { MyPanel my; Button btn; Panel panel; MyWindow() { super(“GreedSnake“); my=new MyPanel(); btn=new Button(“begin“); panel=new Panel(); btn.addActionListener(this); panel.add(new Label(“begin后请按Tab键选定蛇“)); panel.add(btn); panel.add(new Label(“按上下左右键控制蛇行动“)); add(panel,BorderLayout.NORTH); add(my,BorderLayout.CENTER); setBounds(100,100,610,500); setVisible(true); validate(); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void actionPerformed(ActionEvent e)//按下begin按钮 { if(e.getSource()==btn) { try { my.thread.start(); //开始线程 my.validate(); } catch(Exception ee){} } } }希望对你能有所帮助。
求java贪吃蛇的编程,并有注释
J2ME贪吃蛇源代码——200行左右,包含详细注释 package snake;import javax.microedition.midlet.*;import javax.microedition.lcdui.*;public class SnakeMIDlet extends MIDlet {SnakeCanvas displayable = new SnakeCanvas();public SnakeMIDlet() {Display.getDisplay(this).setCurrent(displayable);}public void startApp() {}public void pauseApp() {}public void destroyApp(boolean unconditional) {}}//文件名:SnakeCanvas.javapackage snake;import java.util.*;import javax.microedition.lcdui.*;/*** 贪吃蛇游戏*/public class SnakeCanvas extends Canvas implements Runnable{/**存储贪吃蛇节点坐标,其中第二维下标为0的代表x坐标,第二维下标是1的代表y坐标*/int snake = new int;/**已经使用的节点数量*/int snakeNum;/**贪吃蛇运动方向,0代表向上,1代表向下,2代表向左,3代表向右*/int direction;/*移动方向*//**向上*/private final int DIRECTION_UP = 0;/**向下*/private final int DIRECTION_DOWN = 1;/**向左*/private final int DIRECTION_LEFT = 2;/**向右*/private final int DIRECTION_RIGHT = 3;/**游戏区域宽度*/int width;/**游戏区域高度*/int height;/**蛇身单元宽度*/private final byte SNAKEWIDTH = 4;/**是否处于暂停状态,true代表暂停*/boolean isPaused = false;/**是否处于运行状态,true代表运行*/boolean isRun = true;/**时间间隔*/private final int SLEEP_TIME = 300;/**食物的X坐标*/int foodX;/**食物的Y坐标*/int foodY;/**食物的闪烁控制*/boolean b = true;/**Random对象*/Random random = new Random();public SnakeCanvas() {//初始化init();width = this.getWidth();height = this.getHeight();//启动线程new Thread(this).start();}/*** 初始化开始数据*/private void init(){//初始化节点数量snakeNum = 7;//初始化节点数据for(int i = 0;i 《 snakeNum;i++){snake){return true;} }return false;}/*** 事件处理*/public void keyPressed(int keyCode){int action = this.getGameAction(keyCode);//改变方向switch(action){case UP:if(direction != DIRECTION_DOWN){direction = DIRECTION_UP;}break;case DOWN:if(direction != DIRECTION_UP){direction = DIRECTION_DOWN;}break;case LEFT:if(direction != DIRECTION_RIGHT){direction = DIRECTION_LEFT;}break;case RIGHT:if(direction != DIRECTION_LEFT){direction = DIRECTION_RIGHT;}break;case FIRE://暂停和继续isPaused = !isPaused;break;}}/*** 线程方法* 使用精确延时*/public void run(){try{while (isRun) {//开始时间long start = System.currentTimeMillis();if(!isPaused){//吃食物eatFood();//移动move(direction);//结束游戏if(isGameOver()){break;}//控制闪烁b = !b;}//重新绘制repaint();long end = System.currentTimeMillis();//延时if(end - start 《 SLEEP_TIME){Thread.sleep(SLEEP_TIME - (end - start));}}}catch(Exception e){}}}
求一段JAVA编写的贪吃蛇小程序源代码
用MVC方式实现的贪吃蛇游戏,共有4个类。运行GreedSnake运行即可。主要是观察者模式的使用,我已经添加了很多注释了。1、/** 程序名称:贪食蛇* 原作者:BigF* 修改者:algo* 说明:我以前也用C写过这个程序,现在看到BigF用Java写的这个,发现虽然作者自称是Java的初学者,* 但是明显编写程序的素养不错,程序结构写得很清晰,有些细微得地方也写得很简洁,一时兴起之* 下,我认真解读了这个程序,发现数据和表现分开得很好,而我近日正在学习MVC设计模式,* 因此尝试把程序得结构改了一下,用MVC模式来实现,对源程序得改动不多。* 我同时也为程序增加了一些自己理解得注释,希望对大家阅读有帮助。*/package mvcTest;/*** @author WangYu* @version 1.0* Description:* 《/pre》* Create on :Date :2005-6-13 Time:15:57:16* LastModified:* History:*/public class GreedSnake {public static void main(String args) {SnakeModel model = new SnakeModel(20,30);SnakeControl control = new SnakeControl(model);SnakeView view = new SnakeView(model,control);//添加一个观察者,让view成为model的观察者model.addObserver(view);(new Thread(model)).start();}}-------------------------------------------------------------2、package mvcTest;//SnakeControl.javaimport java.awt.event.KeyEvent;import java.awt.event.KeyListener;/*** MVC中的Controler,负责接收用户的操作,并把用户操作通知Model*/public class SnakeControl implements KeyListener{SnakeModel model;public SnakeControl(SnakeModel model){this.model = model;}public void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();if (model.running){ // 运行状态下,处理的按键switch (keyCode) {case KeyEvent.VK_UP:model.changeDirection(SnakeModel.UP);break;case KeyEvent.VK_DOWN:model.changeDirection(SnakeModel.DOWN);break;case KeyEvent.VK_LEFT:model.changeDirection(SnakeModel.LEFT);break;case KeyEvent.VK_RIGHT:model.changeDirection(SnakeModel.RIGHT);break;case KeyEvent.VK_ADD:case KeyEvent.VK_PAGE_UP:model.speedUp();break;case KeyEvent.VK_SUBTRACT:case KeyEvent.VK_PAGE_DOWN:model.speedDown();break;case KeyEvent.VK_SPACE:case KeyEvent.VK_P:model.changePauseState();break;default:}}// 任何情况下处理的按键,按键导致重新启动游戏if (keyCode == KeyEvent.VK_R ||keyCode == KeyEvent.VK_S ||keyCode == KeyEvent.VK_ENTER) {model.reset();}}public void keyReleased(KeyEvent e) {}public void keyTyped(KeyEvent e) {}}-------------------------------------------------------------3、/** */package mvcTest;/*** 游戏的Model类,负责所有游戏相关数据及运行* @author WangYu* @version 1.0* Description:* 《/pre》* Create on :Date :2005-6-13 Time:15:58:33* LastModified:* History:*///SnakeModel.javaimport javax.swing.*;import java.util.Arrays;import java.util.LinkedList;import java.util.Observable;import java.util.Random;/*** 游戏的Model类,负责所有游戏相关数据及运行*/class SnakeModel extends Observable implements Runnable {boolean matrix; // 指示位置上有没蛇体或食物LinkedList nodeArray = new LinkedList(); // 蛇体Node food;int maxX;int maxY;int direction = 2; // 蛇运行的方向boolean running = false; // 运行状态int timeInterval = 200; // 时间间隔,毫秒double speedChangeRate = 0.75; // 每次得速度变化率boolean paused = false; // 暂停标志int score = 0; // 得分int countMove = 0; // 吃到食物前移动的次数// UP and DOWN should be even// RIGHT and LEFT should be oddpublic static final int UP = 2;public static final int DOWN = 4;public static final int LEFT = 1;public static final int RIGHT = 3;public SnakeModel( int maxX, int maxY) {this.maxX = maxX;this.maxY = maxY;reset();}public void reset(){direction = SnakeModel.UP; // 蛇运行的方向timeInterval = 200; // 时间间隔,毫秒paused = false; // 暂停标志score = 0; // 得分countMove = 0; // 吃到食物前移动的次数// initial matirx, 全部清0matrix = new boolean“;}return result;}}class Node {int x;int y;Node(int x, int y) {this.x = x;this.y = y;}}------------------------------------------------------------4、package mvcTest;//SnakeView.javaimport javax.swing.*;import java.awt.*;import java.util.Iterator;import java.util.LinkedList;import java.util.Observable;import java.util.Observer;/*** MVC模式中得Viewer,只负责对数据的显示,而不用理会游戏的控制逻辑*/public class SnakeView implements Observer {SnakeControl control = null;SnakeModel model = null;JFrame mainFrame;Canvas paintCanvas;JLabel labelScore;public static final int canvasWidth = 200;public static final int canvasHeight = 300;public static final int nodeWidth = 10;public static final int nodeHeight = 10;public SnakeView(SnakeModel model, SnakeControl control) {this.model = model;this.control = control;mainFrame = new JFrame(“GreedSnake“);Container cp = mainFrame.getContentPane();// 创建顶部的分数显示labelScore = new JLabel(“Score:“);cp.add(labelScore, BorderLayout.NORTH);// 创建中间的游戏显示区域paintCanvas = new Canvas();paintCanvas.setSize(canvasWidth + 1, canvasHeight + 1);paintCanvas.addKeyListener(control);cp.add(paintCanvas, BorderLayout.CENTER);// 创建底下的帮助栏JPanel panelButtom = new JPanel();panelButtom.setLayout(new BorderLayout());JLabel labelHelp;labelHelp = new JLabel(“PageUp, PageDown for speed;“, JLabel.CENTER);panelButtom.add(labelHelp, BorderLayout.NORTH);labelHelp = new JLabel(“ENTER or R or S for start;“, JLabel.CENTER);panelButtom.add(labelHelp, BorderLayout.CENTER);labelHelp = new JLabel(“SPACE or P for pause“, JLabel.CENTER);panelButtom.add(labelHelp, BorderLayout.SOUTH);cp.add(panelButtom, BorderLayout.SOUTH);mainFrame.addKeyListener(control);mainFrame.pack();mainFrame.setResizable(false);mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);mainFrame.setVisible(true);}void repaint() {Graphics g = paintCanvas.getGraphics();//draw backgroundg.setColor(Color.WHITE);g.fillRect(0, 0, canvasWidth, canvasHeight);// draw the snakeg.setColor(Color.BLACK);LinkedList na = model.nodeArray;Iterator it = na.iterator();while (it.hasNext()) {Node n = (Node) it.next();drawNode(g, n);}// draw the foodg.setColor(Color.RED);Node n = model.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 = “Score: “ + model.score;labelScore.setText(s);}public void update(Observable o, Object arg) {repaint();}}希望采纳
用JAVA设计游戏:贪吃蛇游戏
用MVC方式实现的贪吃蛇游戏,共有4个类。运行GreedSnake运行即可。主要是观察者模式的使用,我已经添加了很多注释了。1、/* * 程序名称:贪食蛇 * 原作者:BigF * 修改者:algo * 说明:我以前也用C写过这个程序,现在看到BigF用Java写的这个,发现虽然作者自称是Java的初学者, * 但是明显编写程序的素养不错,程序结构写得很清晰,有些细微得地方也写得很简洁,一时兴起之 * 下,我认真解读了这个程序,发现数据和表现分开得很好,而我近日正在学习MVC设计模式, * 因此尝试把程序得结构改了一下,用MVC模式来实现,对源程序得改动不多。 * 我同时也为程序增加了一些自己理解得注释,希望对大家阅读有帮助。 */package mvcTest;/** * @author WangYu * @version 1.0 * Description: * 《/pre》 * Create on :Date :2005-6-13 Time:15:57:16 * LastModified: * History: */public class GreedSnake { public static void main(String args) { SnakeModel model = new SnakeModel(20,30); SnakeControl control = new SnakeControl(model); SnakeView view = new SnakeView(model,control); //添加一个观察者,让view成为model的观察者 model.addObserver(view); (new Thread(model)).start(); }} -------------------------------------------------------------2、package mvcTest;//SnakeControl.javaimport java.awt.event.KeyEvent;import java.awt.event.KeyListener;/** * MVC中的Controler,负责接收用户的操作,并把用户操作通知Model */public class SnakeControl implements KeyListener{ SnakeModel model; public SnakeControl(SnakeModel model){ this.model = model; } public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); if (model.running){ // 运行状态下,处理的按键 switch (keyCode) { case KeyEvent.VK_UP: model.changeDirection(SnakeModel.UP); break; case KeyEvent.VK_DOWN: model.changeDirection(SnakeModel.DOWN); break; case KeyEvent.VK_LEFT: model.changeDirection(SnakeModel.LEFT); break; case KeyEvent.VK_RIGHT: model.changeDirection(SnakeModel.RIGHT); break; case KeyEvent.VK_ADD: case KeyEvent.VK_PAGE_UP: model.speedUp(); break; case KeyEvent.VK_SUBTRACT: case KeyEvent.VK_PAGE_DOWN: model.speedDown(); break; case KeyEvent.VK_SPACE: case KeyEvent.VK_P: model.changePauseState(); break; default: } } // 任何情况下处理的按键,按键导致重新启动游戏 if (keyCode == KeyEvent.VK_R || keyCode == KeyEvent.VK_S || keyCode == KeyEvent.VK_ENTER) { model.reset(); } } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { }}-------------------------------------------------------------3、/* * */package mvcTest;/** * 游戏的Model类,负责所有游戏相关数据及运行 * @author WangYu * @version 1.0 * Description: * 《/pre》 * Create on :Date :2005-6-13 Time:15:58:33 * LastModified: * History: *///SnakeModel.javaimport javax.swing.*;import java.util.Arrays;import java.util.LinkedList;import java.util.Observable;import java.util.Random;/** * 游戏的Model类,负责所有游戏相关数据及运行 */class SnakeModel extends Observable implements Runnable { boolean matrix; // 指示位置上有没蛇体或食物 LinkedList nodeArray = new LinkedList(); // 蛇体 Node food; int maxX; int maxY; int direction = 2; // 蛇运行的方向 boolean running = false; // 运行状态 int timeInterval = 200; // 时间间隔,毫秒 double speedChangeRate = 0.75; // 每次得速度变化率 boolean paused = false; // 暂停标志 int score = 0; // 得分 int countMove = 0; // 吃到食物前移动的次数 // UP and DOWN should be even // RIGHT and LEFT should be odd public static final int UP = 2; public static final int DOWN = 4; public static final int LEFT = 1; public static final int RIGHT = 3; public SnakeModel( int maxX, int maxY) { this.maxX = maxX; this.maxY = maxY; reset(); } public void reset(){ direction = SnakeModel.UP; // 蛇运行的方向 timeInterval = 200; // 时间间隔,毫秒 paused = false; // 暂停标志 score = 0; // 得分 countMove = 0; // 吃到食物前移动的次数 // initial matirx, 全部清0 matrix = new boolean“; } return result; }}class Node { int x; int y; Node(int x, int y) { this.x = x; this.y = y; }} ------------------------------------------------------------4、package mvcTest;//SnakeView.javaimport javax.swing.*;import java.awt.*;import java.util.Iterator;import java.util.LinkedList;import java.util.Observable;import java.util.Observer;/** * MVC模式中得Viewer,只负责对数据的显示,而不用理会游戏的控制逻辑 */public class SnakeView implements Observer { SnakeControl control = null; SnakeModel model = null; JFrame mainFrame; Canvas paintCanvas; JLabel labelScore; public static final int canvasWidth = 200; public static final int canvasHeight = 300; public static final int nodeWidth = 10; public static final int nodeHeight = 10; public SnakeView(SnakeModel model, SnakeControl control) { this.model = model; this.control = control; mainFrame = new JFrame(“GreedSnake“); Container cp = mainFrame.getContentPane(); // 创建顶部的分数显示 labelScore = new JLabel(“Score:“); cp.add(labelScore, BorderLayout.NORTH); // 创建中间的游戏显示区域 paintCanvas = new Canvas(); paintCanvas.setSize(canvasWidth + 1, canvasHeight + 1); paintCanvas.addKeyListener(control); cp.add(paintCanvas, BorderLayout.CENTER); // 创建底下的帮助栏 JPanel panelButtom = new JPanel(); panelButtom.setLayout(new BorderLayout()); JLabel labelHelp; labelHelp = new JLabel(“PageUp, PageDown for speed;“, JLabel.CENTER); panelButtom.add(labelHelp, BorderLayout.NORTH); labelHelp = new JLabel(“ENTER or R or S for start;“, JLabel.CENTER); panelButtom.add(labelHelp, BorderLayout.CENTER); labelHelp = new JLabel(“SPACE or P for pause“, JLabel.CENTER); panelButtom.add(labelHelp, BorderLayout.SOUTH); cp.add(panelButtom, BorderLayout.SOUTH); mainFrame.addKeyListener(control); mainFrame.pack(); mainFrame.setResizable(false); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.setVisible(true); } void repaint() { Graphics g = paintCanvas.getGraphics(); //draw background g.setColor(Color.WHITE); g.fillRect(0, 0, canvasWidth, canvasHeight); // draw the snake g.setColor(Color.BLACK); LinkedList na = model.nodeArray; Iterator it = na.iterator(); while (it.hasNext()) { Node n = (Node) it.next(); drawNode(g, n); } // draw the food g.setColor(Color.RED); Node n = model.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 = “Score: “ + model.score; labelScore.setText(s); } public void update(Observable o, Object arg) { repaint(); }}-------------------------------------------------------------
更多文章:

jsonobject依赖(什么时候用jsonobject jsonarray.fromobject)
2025年2月23日 20:20

user agent什么意思(user agent是什么意思,有什么用啊)
2025年3月5日 17:20

studying的翻译(study 和studying都有名词词性 有什么区别)
2025年4月3日 03:40

天龙八部最新漏洞是什么?Win10最新漏洞被发现,微软向用户发红色警报:尽快更新,电脑小白该怎么操作
2025年3月17日 01:50

DEDE织梦系统 如何把一个网站数据转移到另外一个网站上?织梦dedecms如何调用当前栏目的文章列表
2025年3月30日 19:30

visual studio收费吗(正版visual studio软件是要收费的吗visual studio是谁家的产品)
2025年4月3日 08:50

pgsql和mysql性能对比(pgsql比mysql好在哪)
2025年3月10日 17:20