This article for everyone recommended a classic Java implementation of the game: greedy Snake, I believe we have played, how to achieve the NA?
Effect Chart:
Don't say much nonsense, directly to the code:
1,
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);
Add an observer, let view become Model observer
model.addobserver (view);
(New Thread (model)). Start ();
}
2,
Package mvctest;
Snakecontrol.java import java.awt.event.KeyEvent;
Import Java.awt.event.KeyListener;
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) {//Run state, handle the key switch (keycode) {case KeyEvent.VK_UP:model.changeDire
Ction (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:}///Under any circumstances, the key causes the restart of the game if (keycode = Keyevent.vk_r | |
KeyCode = = keyevent.vk_s | |
KeyCode = = Keyevent.vk_enter) {model.reset ();
keyreleased (KeyEvent e) {} public void keytyped (KeyEvent e) {}}}
3,
Package mvctest;
Snakemodel.java import javax.swing.*;
Import Java.util.Arrays;
Import java.util.LinkedList;
Import java.util.Observable;
Import Java.util.Random; Class Snakemodel extends observable implements Runnable {boolean[][] matrix; Indicates that there are no snakes or food linkedlist nodearray = new LinkedList ();
Food Node of snake body;
int MaxX;
int Maxy; int direction = 2; Snake runs in the direction of Boolean running = false; Running state int timeinterval = 200; Time interval, milliseconds double speedchangerate = 0.75; The rate of change at each time is Boolean paused = false; Pause Sign int score = 0; Score int countmove = 0;
The number of moves before eating food//up and down should is even//right and left should is 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; Snake runs in the direction timeinterval = 200; Time interval, millisecond paused = false; Pause sign score = 0; Score Countmove = 0;
The number of times to move before eating//initial Matirx, all clear 0 matrix = new boolean[maxx][];
for (int i = 0; i < MaxX ++i) {Matrix[i] = new Boolean[maxy];
Arrays.fill (Matrix[i], false); }//Initial the snake//init snake body, if the transverse position is over 20, the length is 10, otherwise the transverse position of half int initarraylength = MaxX > 20?
10:MAXX/2;
Nodearray.clear (); for (int i = 0; i < initarraylength ++i) {int x = MAXX/2 + I;//maxx is initialized to int y = MAXY/2; Maxy is initialized to//nodearray[x,y]: [10,15]-[11,15]-[12,15]~~[20,15]//The default running direction is up, so the first nodearray of the game becomes://
[10,14]-[10,15]-[11,15]-[12,15]~~[19,15] Nodearray.addlast (New Node (x, y));
Matrix[x][y] = true;
//Create Food food = Createfood ();
MATRIX[FOOD.X][FOOD.Y] = true; } PublIC void changedirection (int newdirection) {//change direction cannot be in the same direction as the original or reverse if (direction% 2!= newdirection% 2) {di
Rection = newdirection;
} public boolean moveOn () {Node n = (node) nodearray.getfirst ();
int x = n.x;
int y = N.Y;
According to the direction or decrease the coordinate value switch (direction) {case up:y--;
Break
Case down:y++;
Break
Case left:x--;
Break
Case right:x++;
Break
///If the new coordinates fall within a valid range, process if ((0 <= x && x < MaxX) && (0 <= y && y < Maxy)) {
if (Matrix[x][y]) {//If there is something on the point of the new coordinate (snake or food) if (x = = Food.x && y = = food.y) {//Eat food, success Nodearray.addfirst (food);
From the snake head to give a long//fractional rule, with the number of changes in direction and speed of two elements related to int scoreget = (10000-200 * countmove)/timeinterval; Score + = scoreget > 0?
Scoreget:10;
Countmove = 0; Food = Createfood (); Create a new food matrix[food.x][food.y] = true;
Set food location return true;
else//Eat the snake itself, failure return false;
else {//If there is nothing on the point of the new coordinate (snake body), move the snake Nodearray.addfirst (new Node (x, y));
Matrix[x][y] = true;
n = (Node) nodearray.removelast ();
MATRIX[N.X][N.Y] = false;
countmove++;
return true; return false;
Touch Edge, failed} public void run () {running = true;
while (running) {try {thread.sleep (timeinterval);
catch (Exception e) {break; } if (!paused) {if (MoveOn ()) {setchanged ();
Model Notice View data has been updated notifyobservers ();
else {joptionpane.showmessagedialog (null, ' You failed ', "Game over",
Joptionpane.information_message);
Break
}} running = false; } pRivate Node Createfood () {int x = 0;
int y = 0;
Randomly acquiring a position within a valid region that does not overlap with the snake body and food do {Random r = new Random ();
x = R.nextint (MaxX);
y = R.nextint (Maxy);
while (Matrix[x][y]);
return new Node (x, y);
public void Speedup () {timeinterval *= speedchangerate;
public void Speeddown () {timeinterval/= speedchangerate;
public void Changepausestate () {paused =!paused;
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;
} class Node {int x;
int y;
Node (int x, int y) {this.x = x;
This.y = y;
}
}
4,
Package mvctest;
Snakeview.java import javax.swing.*;
Import java.awt.*;
Import Java.util.Iterator;
Import java.util.LinkedList;
Import java.util.Observable;
Import Java.util.Observer;
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 ();
Create top score Display Labelscore = new JLabel ("Score:");
Cp.add (Labelscore, Borderlayout.north);
Create the middle game display area Paintcanvas = new Canvas ();
Paintcanvas.setsize (canvaswidth + 1, canvasheight + 1);
Paintcanvas.addkeylistener (Control); CP.add (Paintcanvas, Borderlayout.center);
Create the bottom help bar 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 ("spaces 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, Nodewid
Th-1, nodeHeight-1);
public void Updatescore () {String s = "Score:" + model.score;
Labelscore.settext (s);
public void update (observable o, Object Arg) {repaint ();
}
}
The purpose of this article is to bring you a memorable classic, but the main purpose is to help you learn Java programming.