java写出蛇吃蛋小游戏
来源:互联网 发布:python 输入ctrl c 编辑:程序博客网 时间:2024/05/01 08:56
package snakeategg;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import java.util.Map;/** * Created by Administrator on 2016/11/9. */public class SnakeControl implements KeyListener { private SnakeModel model; private SnakeView view; private int district_maxX; private int district_maxY; public SnakeControl(){ this.district_maxX=30; this.district_maxY=40; inits(); } public SnakeControl(int maxX,int maxY){ if((10<maxX)&&(maxX<100)&&((10<maxY)&&(maxY<100))){ this.district_maxY=maxY; this.district_maxX=maxX; }else { this.district_maxX=30; this.district_maxY=40; } inits(); } private void inits() { this.model=new SnakeModel(district_maxX,district_maxY); this.view=new SnakeView(district_maxX,district_maxY,500,200); this.model.addObserver(this.view); this.view.addKeyListener(this); (new Thread(this.model)).start(); } @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) { int keyCode=e.getKeyCode(); if(model.isRunning()){ 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_P: case KeyEvent.VK_SUBTRACT: model.changePauserState(); break; default: } if(keyCode==KeyEvent.VK_R||keyCode==KeyEvent.VK_ENTER||keyCode==KeyEvent.VK_S){ model.reset(); } if(keyCode==KeyEvent.VK_Q){ model.SetRunning(false); } } } @Override public void keyReleased(KeyEvent e) { }}
package snakeategg;import javax.swing.*;import java.util.Arrays;import java.util.LinkedList;import java.util.Observable;import java.util.Random;/** * Created by Administrator on 2016/11/9. */public class SnakeModel extends Observable implements Runnable{ public static final int UP=2; public static final int DOWN=4; public static final int LEFT=1; public static final int RIGHT=3; private boolean [][]matrix; private LinkedList nodeArray=new LinkedList(); private Node food; private int maxX; private int maxY; private int timeInterval=200; private int direction=UP; private boolean running=false; private double speedChangeRate=0.75; private boolean paused=false; private int score=0; private int countMove=0; 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; matrix=new boolean[maxX][maxY]; for(int i=0;i<maxX;i++){ matrix[i]=new boolean[maxY]; Arrays.fill(matrix[i],false); } int initArrayLength=maxX>20?10:maxX/2; int x=maxX/2; int y=maxY/2; for(int i=0;i<initArrayLength;i++){ nodeArray.addLast(new Node(x,y)); matrix[x][y]=true; x++; } food=creatFood(); matrix[food.x][food.y]=true; } public void changeDirection(int newDirection){ if(direction%2!=newDirection){ direction=newDirection; } } public boolean moveOn(){ Node head = (Node)nodeArray.getFirst(); int headX=head.x; int headY=head.y; switch (direction){ case UP: headY--; break; case DOWN: headY++; break; case LEFT: headX--; break; case RIGHT: headX++; break; } if((0<=headX&&headX<maxX)&&(0<=headY&&headY<maxY)){ if(matrix[headX][headY]){ if(headX==food.x&&headY==food.y){ nodeArray.addFirst(food); int ScoreGet=(10000-200*countMove)/timeInterval; score+=ScoreGet>0?ScoreGet:10; countMove=0; food=creatFood(); matrix[food.x][food.y]=true; return true; }else { return false; } }else { nodeArray.addFirst(new Node(headX,headY)); matrix[headX][headY]=true; head=(Node)nodeArray.removeLast(); matrix[head.x][head.y]=false; countMove++; return true; } } return false; } private Node creatFood() { int x=0; int y=0; do{ Random r=new Random(); x=r.nextInt(maxX); y=r.nextInt(maxY); }while (matrix[x][y]); return new Node(x,y); } @Override public void run() { running=true; while (running){ try { Thread.sleep(timeInterval); } catch (InterruptedException e) { e.printStackTrace(); } if(!paused){ if(moveOn()){ setChanged(); notifyObservers(); }else { JOptionPane.showMessageDialog(null,"你失败了","GAME OVER",JOptionPane.INFORMATION_MESSAGE); break; } } }if(!running){ JOptionPane.showMessageDialog(null,"你停止了游戏","game over",JOptionPane.INFORMATION_MESSAGE); } } public void speedUp(){ timeInterval*=speedChangeRate; } public void speedDown(){ timeInterval/=speedChangeRate; } public void changePauserState(){ paused=!paused; } public boolean isRunning(){ return running; } public void SetRunning(boolean running){ this.running=running; } public LinkedList getNodeArray(){ return nodeArray; } public Node getFood(){ return food; } public int getSore(){ return score; } public String toString(){ String result=""; for(int i=0;i<nodeArray.size();++i){ Node n=(Node)nodeArray.get(i); result+="["+n.x+""+n.y+"]"; } return result; } public class Node{ int x; int y; Node(int x,int y){ this.x=x; this.y=y; } }}
package snakeategg;import javafx.beans.Observable;import javax.swing.*;import java.awt.*;import java.util.Iterator;import java.util.LinkedList;import java.util.Observer;/** * Created by Administrator on 2016/11/9. */public class SnakeView extends JFrame implements Observer{ public static final int nodeWidth=10; public static final int nodeHeight=10; private int canvasWidth; private int cancasHeight; private int startX=0; private int startY=0; JLabel labelScore; Canvas paitCanvas; public SnakeView(){ this(30,40,0,0); } public SnakeView(int maxX,int maxY){ this(maxX,maxY,0,0); } public SnakeView(int maxX,int maxY,int startX,int startY){ this.canvasWidth=maxX*nodeWidth; this.cancasHeight=maxY*nodeHeight; this.startX=startX; this.startY=startY; init(); } private void init() { this.setName("蛇吃蛋"); this.setLocation(startX,startY); Container cp = this.getContentPane(); labelScore=new JLabel("Score"); cp.add(labelScore,BorderLayout.NORTH); paitCanvas=new Canvas(); paitCanvas.setSize(canvasWidth+1,cancasHeight+1); cp.add(paitCanvas,BorderLayout.CENTER); JPanel panelBottom=new JPanel(); panelBottom.setLayout(new BorderLayout()); JPanel panel1=new JPanel(); panel1.setLayout(new BorderLayout()); JLabel lablehelp; lablehelp=new JLabel("pageup,pagedown for speed",JLabel.CENTER); panel1.add(lablehelp,BorderLayout.NORTH); lablehelp=new JLabel("enter ot r or s for start",JLabel.CENTER); panel1.add(lablehelp,BorderLayout.CENTER); panelBottom.add(panel1,BorderLayout.NORTH); lablehelp=new JLabel("q for stop",JLabel.CENTER); panelBottom.add(lablehelp); cp.add(panelBottom,BorderLayout.SOUTH); this.pack(); this.setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } @Override public void update(java.util.Observable o, Object arg) { SnakeModel model=(SnakeModel) o; Graphics g = paitCanvas.getGraphics(); g.setColor(Color.white); g.fillRect(0,0,canvasWidth,cancasHeight); g.setColor(Color.black); LinkedList na=model.getNodeArray(); Iterator it = na.iterator(); while (it.hasNext()){ SnakeModel.Node n=(SnakeModel.Node) it.next(); drawNode(g,n); } g.setColor(Color.RED); SnakeModel.Node n = model.getFood(); drawNode(g,n); this.updateScore(model.getSore()); } private void updateScore(int sore) { String s="Score:"+sore; labelScore.setText(s); } private void drawNode(Graphics g, SnakeModel.Node n) { g.fillRect(n.x*nodeWidth,n.y*nodeHeight,nodeWidth-1,nodeHeight-1); }}
package snakeategg;/** * Created by Administrator on 2016/11/9. */public class Test { public static void main(String []args){ SnakeControl control=new SnakeControl(30,30); }}
0 0
- java写出蛇吃蛋小游戏
- 【python】200行写出2048小游戏
- 写出自己的一个 2048小游戏
- Java小游戏
- java 小游戏
- Java 小游戏
- Java小游戏之控制台小游戏
- java io 写入写出
- java文件写入写出
- Java写出多位阿姆斯特朗数!
- java简单小游戏!
- JAVA小游戏-推棋子
- 做java小游戏有感
- java写的小游戏
- 【Java】炸弹人小游戏
- Java猜拳小游戏
- java版扫雷小游戏
- 贪食蛇java小游戏
- xdoj-1109
- xshell SSH服务器拒绝访问密码。请再试一次
- Boltzmann 玻尔兹曼机(BM)
- UIDocumentInteractionController 第三方应用中打开自己的文件 方法
- PHP命名空间 namespace 及导入 use 的用法
- java写出蛇吃蛋小游戏
- angularjs 配置路由按需加载html\js文件[不依赖第三方插件]
- C++构造函数调用顺序
- Error:Execution failed for task ':app:prepareDebugAndroidTestDependencies'.
- xdoj-1040
- Progressbar进度条和SeekBar拖动条的简单使用
- AndroidContacts操作系列之 查看底层联系人表结构
- 定制ListView的界面
- 在tableView、scrollView、collectionView上层添加一个固定的UIButton,不随其滚动