said the simple version of the snake ...
Enumerate variables in 3 + directions (originally wanted to write the greedy snake to walk. Imagine that my snake is a rectangle with an unsightly slant and no writing.
Left and right key control move space pause
Snackclient class
Package Com.xynu.snaker;import Java.awt.color;import Java.awt.font;import java.awt.graphics;import Java.awt.event.actionevent;import Java.awt.event.actionlistener;import Java.awt.event.keyadapter;import Java.awt.event.keyevent;import Java.io.ioexception;import Java.util.arraylist;import Java.util.Random;import Javax.swing.jframe;import Javax.swing.jmenu;import Javax.swing.jmenubar;import Javax.swing.JMenuItem;import Javax.swing.jpanel;public class Snackclient extends JFrame {private static, snackclient sc;private snackbody snackfood;// Current game state Private Boolean gamestate = True;private mycomponent mc;//Game Private Boolean pause = False;private JMenu menu;private JMenuBar menubar;//Low Level private JMenuItem lowspeeditem;//level private JMenuItem midspeeditem;//High level private JMenuItem heightspeeditem;//re-start private jmenuitem restartitem;public int speed = 15;static int score = 0;private Maxscore ms;//snake body ar raylist<snackbody> Snackbodys = new arraylist<snackbody> ();//Snake head static snackbody snackhead;pRivate static final Long serialversionuid = 1l;public snackclient () {//Initialize menu bar Initmenu (); mc = new MyComponent (); mc.setback Ground (Color.Black); add (MC); Settitle ("snake"); setSize (+); Setlocationrelativeto (null); Setdefaultcloseoperation (Jframe.exit_on_close); setvisible (true); setresizable (false); snackhead = new SnackBody (100 (int i = 0; i < 2; i++) {Snackbodys.add (new Snackbody ( -100, -100, this));} ms = new Maxscore (); Showsnackfood (); Addkeylistener (new Mykeylistener ()); new Paintthread (). Start (); private void Initmenu () {//TODO auto-generated Method Stubmenu = new JMenu ("parameter setting"); Lowspeeditem = new JMenuItem ("low Grade"); mi Dspeeditem = new JMenuItem ("middle class"), Heightspeeditem = new JMenuItem ("High Level"); Restartitem=new jmenuitem ("restart"); Lowspeeditem.addactionlistener (new ActionListener () {public void actionperformed (ActionEvent e) {//TODO Auto-generated method stubspeed = 15;}}); Midspeeditem.addactionlistener (new ActionListener () {public void actionperformed (ActionEvent e) {//TODO AutO-generated method stubspeed = 17;}}); Heightspeeditem.addactionlistener (new ActionListener () {public void actionperformed (ActionEvent e) {//TODO Auto-generated method stubspeed = 20;}}); Restartitem.addactionlistener (new ActionListener () {public void actionperformed (ActionEvent e) {//TODO auto-generated Method Stubdispose (); sc=new snackclient ();}}); Menu.add (Lowspeeditem); Menu.add (Midspeeditem); Menu.add (Heightspeeditem); Menu.add (restartitem); menubar = new JMenuBar (); Menubar.add (menu); Setjmenubar (menubar);} public Boolean ispause () {return pause;} public void Setpause (Boolean pause) {this.pause = pause;} public static void Main (string[] args) {//TODO auto-generated Method stubsc = new Snackclient ();} public class MyComponent extends JPanel {/** * */private static final long serialversionuid = 1l;protected void Paintcomp Onent (Graphics g) {//TODO auto-generated method Stubsuper.paintcomponent (g); if (!gamestate) {font font = new Font ("Microsoft Ya Black", Font.Bold, G.setfont (font); G.setcolor (COLOR.RED); g.DrawString ("GAME over!!", this.getwidth ()/2-150,this.getheight ()/2); return;} If a snake hits a snake or crashes the game ends if (snackhead.hitwall () | | | snackhead.hitsnackbody (SNACKBODYS)) {gamestate = false;} If the snake head eats food if (snackhead.hitsnackbody (Snackfood)) {Snackbodys.add (snackfood); score++;//refreshes food Showsnackfood ();} Draw Food Snackfood.draw (g);//Draw Snake if (gamestate) {for (Snackbody Sb:snackbodys) {Sb.draw (g);}} Draw the snake head if (gamestate) {Snackhead.draw (g);} try {g.drawstring ("Current score:" + score * 100 + "game Highest score:" + ms.getmaxscore (), 0, 10);} catch (IOException e) {//TODO auto-generated catch Blocke.printstacktrace ();}}} Randomly appearing food public void Showsnackfood () {Random r = new Random (); Boolean exit = True;while (exit) {int x = R.nextint (mc.getwid Th ()-snackhead.getwidth ()), int y = R.nextint (Mc.getheight ()-snackhead.getheight ()), Snackfood = new Snackbody (x, Y, SC) ; if (Snackfood.hitsnackbody (snackhead) | | snackfood.hitsnackbody (SNACKBODYS)) {continue;} Exit = FALSE;}} Keyboard events public class Mykeylistener extends Keyadapter {@Overridepublic void keypressed (KeyEvent e) {//TODO auto-generated method Stubsnackhead.keypress (e);} @Overridepublic void keyreleased (KeyEvent e) {//TODO auto-generated method Stubsnackhead.keyrelease (e);}} Game refresh public class Paintthread extends Thread {public void run () {//TODO auto-generated method Stubwhile (True) {if (!pau SE) {repaint (); try {thread.sleep ()} catch (Interruptedexception e) {//TODO auto-generated catch Blocke.printstacktrace ();}}}}}
Packaged Snake body Snackbody class
Package Com.xynu.snaker;import Java.awt.color;import Java.awt.graphics;import java.awt.graphics2d;import Java.awt.rectangle;import Java.awt.event.keyevent;import Java.awt.geom.rectangle2d;import java.util.ArrayList; public class Snackbody {private int x;private int y;private int speed = 15;private int width = 15;private int height = 15; Private Boolean left, right, up, down;private Direction dir = direction.d, CurDir = direction.d;private snackclient sc;pub Lic Snackbody () {super ();//TODO auto-generated constructor stub}public snackbody (int x, int y, snackclient SC) {super (); t his.x = X;this.y = Y;this.sc = SC;} public int GetX () {return x;} public void SetX (int x) {this.x = x;} public int GetY () {return y;} public void sety (int y) {this.y = y;} public int getwidth () {return width;} public void setwidth (int width) {this.width = width;} public int getheight () {return height;} public void setheight (int height) {this.height = height;} Public Direction Getdir () {return dir;} public void Draw (Graphics g) {graphics2d g2 = (graphics2d) g; rectangle2d r2 = new Rectangle2d.double (x, y, width, height);//Snake as Yellow g2.setcolor (Color.yellow);//Snake head is red if (this = = Snackclient.snackhead) G2.setcolor (color.red); G2.fill (R2); if (this = = Snackclient.snackhead) {this.speed = Sc.speed; Move ();}} Keyboard event public void KeyPress (KeyEvent e) {switch (E.getkeycode ()) {Case KeyEvent.VK_RIGHT:right = true;break;case keyevent . Vk_left:left = true;break;case KeyEvent.VK_UP:up = true;break;case KeyEvent.VK_DOWN:down = true;break;case keyevent.vk_ SPACE:sc.setPause (!sc.ispause ()); break;} Judgedir ();} Judging the direction if you want to move in eight directions is also the same as private void Judgedir () {//TODO auto-generated method stubif (left &&!right &&!up &&!down) CurDir = direction.l;if (!left && right &&!up &&!down) CurDir = direction.r;if (!left &&!right && up &&!down) CurDir = direction.u;if (!left &&!right &&!up &A mp;& down) CurDir = DIRECTION.D;} */* The movement of the snake body moves according to the body of the snake * The first snake body equals the position of the snake head before moving.* The second section of the Snake body equals the position of the first snake before moving. * And so */private void Move () {if (dir = = Direction.l && CurDir = = DIRECTION.R) CurDir = dir;if (dir = = Direction.r && CurDir = = direction.l) CurDir = dir;if (dir = = direction.u && CurDir = = DIRECTION.D ) CurDir = dir;if (dir = = direction.d && CurDir = = direction.u) CurDir = dir;if (dir! = curdir) dir = Curdir;int PreX = X;int PreY = y;if (dir = = DIRECTION.L) {x-= Speed;prex + = 1;} if (dir = = DIRECTION.R) {x + = Speed;prex-= 1;} if (dir = = direction.u) {y-= Speed;prey + = 1;} if (dir = = direction.d) {y + = speed;prey-= 1;} int tempx, tempy;for (Snackbody body:sc.snackBodys) {tempx = Body.getx (); tempy = Body.gety (); Body.setx (PreX); Body.sety ( PreY);p rex = Tempx;prey = Tempy;}} public void Keyrelease (KeyEvent e) {switch (E.getkeycode ()) {Case KeyEvent.VK_RIGHT:right = false;break;case KEYEVENT.VK _left:left = false;break;case KeyEvent.VK_UP:up = false;break;case KeyEvent.VK_DOWN:down = false;break;}} Return to the snake body rectangle public Rectangle Getrec () {return new ReCtangle (x, y, width, height);} The collision event of the snake head and the Snake Body public boolean hitsnackbody (Snackbody sb) {if (the This = SB) return false;if (This.getrec (). intersects ( Sb.getrec ())) {return true;} return false;} public boolean hitsnackbody (arraylist<snackbody> Snackbodys) {in (Snackbody Snackbody:snackbodys) {if (This! = SN Ackbody) {if (Hitsnackbody (snackbody)) {return true;}}} return false;} public Boolean Hitwall () {if (x <= 0 | | y <= 0 | | x >= sc.getwidth ()-width| | y >= sc.getheight ()-height) { return true;} return false;}}
Highest score Maxscore class
Package Com.xynu.snaker;import Java.io.bufferedreader;import Java.io.bufferedwriter;import java.io.File;import Java.io.filereader;import Java.io.filewriter;import Java.io.ioexception;public class MaxScore {public int getMaxScore () throws Ioexception{file file=new File ("MaxScore.txt"), if (!file.exists ()) {file.createnewfile ();} BufferedReader br=new BufferedReader (new FileReader (file)); String s=br.readline (); int max=0;if (! "". Equals (s) &&s!=null) {max=integer.parseint (s);} else{max=0;} if (Snackclient.score*100>max) {max=snackclient.score*100; BufferedWriter bw=new BufferedWriter (new FileWriter (file)), Bw.write (max+ ""); Bw.close ();} Br.close (); return Max;}}
Run results
Java Simple snake