本篇内容介绍了“怎么用Java实现贪吃蛇游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
目前创新互联已为上千余家的企业提供了网站建设、域名、网站空间、网站托管、企业网站设计、勐海网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
1、执行程序:程序启动的入口
package cn.hncu;
public?class?GreedySnake {
public static void main(String[] args) {
Model model=new Model(80,?50);
Control control=new Control(model);
View view=new View(model,control);
model.addObserver(view);
(new Thread(model)).start();
}
}
控制类:主要进行键盘的按键收集和传递
package cn.hncu;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Control implements KeyListener{
Model model;
public Control(Model?model){
this.model=model;
}
public void keyPressed(KeyEvent?e){
//此方法收集按键
int key=e.getKeyCode();
if (model.running) {
switch (key) {
case KeyEvent.VK_UP:
model.changeDirection(model.up);
break;
case KeyEvent.VK_DOWN:
model.changeDirection(model.down);
break;
case KeyEvent.VK_LEFT:
model.changeDirection(model.left);
break;
case KeyEvent.VK_RIGHT:
model.changeDirection(model.right);
break;
default:
break;
}
}
if (key==KeyEvent.VK_ENTER) {
model.reset();
}
}
public void keyReleased(KeyEvent?e) {
}
public void keyTyped(KeyEvent e) {
}
}
模型类:创建蛇身和蛇的运动方式的实现,用到了线程。
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Observable;
import java.util.Random;
import javax.swing.JOptionPane;
public class Model extends Observable implements Runnable{
public static final int left=1;
public static final int up=2;
public static final int right=3;
public?static?final?int?down=4;
public?boolean?coordinate[][];//用这个来当做界面的坐标
public?LinkedList?node=new?LinkedList();
public?int?direction=2;
boolean?running=false;
public?int?maxX,maxY;
Node?food;
public?int?sleeptime=200;
public?Model(int?maxX,int?maxY){
this.maxX=maxX;
this.maxY=maxY;
reset();
}
public?void?reset()?{
direction=this.up;
sleeptime=200;
coordinate=new?boolean[maxX][];
for?(int?i?=?0;?i?
coordinate[i]=new?boolean[maxY];
Arrays.fill(coordinate[i],?false);
}
//initialize?the?Snake'body
int?initlenght=10;
node.clear();
for?(int?j?=?0;?j?
int?x=maxX/2+j;
int?y=maxY/2;
node.addLast(new?Node(x,y));
coordinate[x][y]=true;
}
food=createFood();
coordinate[food.x][food.y]=true;
}
public?boolean?move(){
Node?n=(Node)node.getFirst();
int?x=n.x;
int?y=n.y;
switch?(direction)?{
case?up:
y--;
break;
case?down:
y++;
break;
case?left:
x--;
break;
case?right:
x++;
break;
default:
break;
}
if?((x>=0&&x if?(coordinate[x][y])?{ if?(x==food.x&&y==food.y)?{ node.addFirst(food); if?(sleeptime>35)?{ sleeptime-=20; } food=createFood(); coordinate[food.x][food.y]=true; return?true; }else?{ return?false; } }else?{ node.addFirst(new?Node(x,y)); coordinate[x][y]=true; n=(Node)node.getLast(); node.removeLast(); coordinate[n.x][n.y]=false; return?true; } } return?false; } public?void?changeDirection(int?newdir){ if?(direction!=newdir)?{ direction=newdir; } } public?Node?createFood()?{ int?x=0,y=0; do?{ Random?r?=?new?Random(); x?=?r.nextInt(maxX); y?=?r.nextInt(maxY); }?while?(coordinate[x][y]); return?new?Node(x,?y); } public?void?run()?{ running=true; while(running){ try?{ Thread.sleep(sleeptime); }?catch?(Exception?e)?{ break; } if?(move())?{ setChanged(); notifyObservers(); }else?{ JOptionPane.showMessageDialog(null,?"Game?Over"); break; } } } } class?Node{//创建蛇身 public?int?x,y; public?Node(int?x,int?y){ this.x=x; this.y=y; } } 界面层:展现给用户看的,用图形界面展现蛇的运动 [java]?view plain?copy import?java.awt.BorderLayout; import?java.awt.Canvas; import?java.awt.Color; import?java.awt.Container; import?java.awt.Graphics; import?java.util.Iterator; import?java.util.LinkedList; import?java.util.Observable; import?java.util.Observer; import?javax.swing.JFrame; import?javax.swing.JLabel; import?javax.swing.JPanel; public?class?View?extends?JFrame?implements?Observer{ Control?control; Model?model; Canvas?canvas; public?static?final?int?canvasWidth=800,canvasHeight=500; public?static?final?int?nodeWidth=10,nodeHeight=10; public?View(Model?model,Control?control){ super("GreedySnake"); this.control=control; this.model=model; this.setLocation(400,?300); this.setResizable(false); this.setDefaultCloseOperation(EXIT_ON_CLOSE); canvas=new?Canvas(); canvas.setSize(canvasWidth+1,?canvasHeight+1); canvas.addKeyListener(control); this.add(canvas,BorderLayout.NORTH); JPanel?panel=new?JPanel(); this.add(panel,BorderLayout.SOUTH); JLabel?label=new?JLabel("Enter?for?restart"); panel.add(label); this.pack(); this.addKeyListener(control);?? this.setVisible(true); } public?void?repaint()?{ Graphics?g=canvas.getGraphics(); // draw?background g.setColor(Color.white); g.fillRect(0,?0,?canvasWidth,?canvasHeight); // draw snake g.setColor(Color.red); LinkedList?node=model.node; Iterator?it=node.iterator(); while(it.hasNext()){ Node?n=(Node)it.next(); drawNode(g,n); } // draw food g.setColor(Color.black); Node?n=model.food; drawNode(g,n); } private?void?drawNode(Graphics?g,?Node?n)?{ g.fillOval(n.x*nodeWidth,?n.y*nodeHeight,?nodeWidth,?nodeHeight); } public?void?update(Observable?o,?Object?arg){ repaint(); } } “怎么用Java实现贪吃蛇游戏”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
本文题目:怎么用Java实现贪吃蛇游戏
当前URL:http://chengdu.cdxwcx.cn/article/jdegee.html