Jump to content
chain

Java Snake

Recommended Posts

  • Administrators

meh just a snake game....i made this like a year ago when i was just learning java 😜

i was bored and saw no one has posted one so i figure i'll post the first one. 🙂

*known bugs:

  1. can't restart without refreshing page
  2. rapid movement causes snake to turn back into self

URL: http://picklecodes.co.cc/Games/Snake/

 

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.*;

public class Snake extends Applet implements KeyListener,  Runnable
{
  // The object we will use to write with instead of the standard screen graphics
  Graphics bufferGraphics;
  // The image that will contain everything that has been drawn on
  // bufferGraphics.
  Image offscreen;
  // To get the width and height of the applet.
  Dimension dim;
  Random r=new Random();
  Level level=new Level();

  boolean playedLastGame=false;
  int bodies=2;
  int lives=3;
  int countApple=0;
  Wall[] w = new Wall[500];
  Section[] s=new Section[300];
  Apple[] a=new Apple[10];
  MovePoint[] mp=new MovePoint[100];

  //credits
  String version = "1.0";
  boolean game,puase;
  boolean gameOver;
  int GameOverTimer=0;
  int x,y;

  //timer
  Thread t,t1;

  public void start(){
  t = new Thread(this);
  t.start();
}

public void run(){
    t1 = Thread.currentThread();
    while(t1 == t){
        updateSpace();
        try{
             t1.sleep(100);    
            }catch(InterruptedException e){}
        }
}

public void init() {
  // We'll ask the width and height by this
  dim = getSize();
  setBackground(Color.black);
  // Create an offscreen image to draw on
  // Make it the size of the applet, this is just perfect larger
  // size could slow it down unnecessary.
  offscreen = createImage(dim.width,dim.height);
  // by doing this everything that is drawn by bufferGraphics
  // will be written on the offscreen image.
  bufferGraphics = offscreen.getGraphics(); 

  for (int i=0; i < s.length; i++) { s[i]=null; }
  for (int i=0; i < w.length; i++) { w[i]=null; }
  for (int i=0; i < a.length; i++) { a[i]=null; }
  for (int i=0; i < mp.length; i++) { mp[i]=null; }
  level.setLevel(0);

  this.setFocusable(true);
  this.requestFocus();
 addKeyListener(this);
 game=false;
}

public void reinit() 
{
int tempGoal = level.getGoal();
level.reset();
level.setGoal(tempGoal + 5);
bodies=2;
countApple=0;

  for (int i=0; i < s.length; i++) { s[i]=null; }
  for (int i=0; i < w.length; i++) { w[i]=null; }
  for (int i=0; i < a.length; i++) { 
            a[i]=new Apple(); 
            a[i].init();
        for (int ii=0; ii < w.length; ii++) {
            if (w[ii] != null) {
while (w[ii].x == a[i].x && w[ii].y == a[i].y) { a[i].init(); ii=0; }
}
}

    }
  for (int i=0; i < mp.length; i++) { mp[i]=null; }
  s[0]=new Section();
  s[1]=new Section();
  s[2]=new Section();
  s[0].init(250,250,"right");
  s[1].init(245,250,"right");
  s[2].init(240,250,"right");
  s[0].setHead(true);
        puase=true;
}

public boolean updateSpace() {
  // Wipe off everything that has been drawn before
  // Otherwise previous drawings would also be displayed.
  bufferGraphics.clearRect(0,0,dim.width,dim.height);

if (game == false) {
if (gameOver == true) {
 bufferGraphics.setColor(Color.green);
 bufferGraphics.drawString("Game Over!",dim.width / 2 - 100,dim.height / 2);
 GameOverTimer++;
 if (GameOverTimer >= 10) { 
     gameOver=false;
     GameOverTimer=0;
    }
}
else {
 bufferGraphics.setColor(Color.green);
 bufferGraphics.drawString("Pickled Snake",dim.width / 2 - 100,dim.height / 2);
 bufferGraphics.drawString("Press Space to Start ",dim.width / 2 - 100,dim.height / 2 + 15);
}
}
else {

if (puase != true) {
  level.time+=0.1;
  level.time=Round(level.time,1);
}

  for (int i=0; i < s.length; i++) {
    if (s[i] != null) {
        if (puase != true) { s[i].move(); }
      //check collsion with apples
      if (bodies <= s.length) {
        for (int ii=0; ii < a.length; ii++) {
            if (a[ii] != null) {
          if (s[0].x == a[ii].x && s[0].y == a[ii].y) {   
            int X=s[bodies].x;
            int Y=s[bodies].y;
            String D=s[bodies].direction;
            bodies++;
            if (D == "up") {
              s[bodies]=new Section();
              s[bodies].init(X, Y+5, D);
            }
            if (D == "down") {
              s[bodies]=new Section();
              s[bodies].init(X, Y-5,  D);
            }
             if (D == "right") {
              s[bodies]=new Section();
              s[bodies].init(X-5, Y, D);
            }
             if (D == "left") {
              s[bodies]=new Section();
              s[bodies].init(X+5, Y, D);
            }
                 a[ii].init();
                  for (int iii=0; iii < w.length; iii++) {
            if (w[iii] != null) {
         while (w[iii].x == a[ii].x && w[iii].y == a[ii].y) { a[ii].init(); iii=0; }
    }
}
              countApple++;
              break;
          }
        }
       }
      }
       //check if snake section collides with self

              if (i != 0 && s[0].x == s[i].x && s[0].y == s[i].y || s[0].x < 0 || s[0].y < 0 ||  s[0].x > dim.width  || s[0].y > dim.height) { 
                  LoseLive();
                  return false;
            }

 //check if snake section is over move point if so then move in the direction told by move point
      for (int ii=0; ii < mp.length; ii++) {
        if (mp[ii] != null) {
          if (s[i].x == mp[ii].x && s[i].y == mp[ii].y) { 
            s[i].direction=mp[ii].direction;
            if (bodies == i) { mp[ii]=null; }
          }
        }
      }
      s[i].Paint(bufferGraphics);
    }
  }
          //paint walls
               for (int i=0; i < w.length; i++) { 
                   if (w[i] != null) {
                     //check if snake section collides with a wall
                   if (s[0].x == w[i].x && s[0].y == w[i].y) {
                     LoseLive();
                     return false;
                    } 
                   w[i].Paint(bufferGraphics);
                }
                }
  for (int i=0; i < a.length; i++) {
    a[i].Paint(bufferGraphics);
  }

    //check the level goal
            if (countApple >= level.getGoal()) { 
                level.setLevel(level.getLevel() + 1);
                reinit();
            }

  bufferGraphics.setColor(Color.orange);
  bufferGraphics.drawString("Time: "+ level.time,10,15);
  bufferGraphics.drawString("Lives: "+ lives,80,15);
  bufferGraphics.drawString("Level: "+ level.getLevel(),(dim.width / 2) - 75,15);
  bufferGraphics.drawString("Goal: "+ level.getGoal(),dim.width - 100,15);
  bufferGraphics.drawString("Apples:  "+ countApple,dim.width - 100,30);

  if (puase == true) {
bufferGraphics.setColor(Color.green);
bufferGraphics.drawString("Puase ",dim.width / 2 ,dim.height / 2);
}

}

 repaint();
 return true;
}
/** this controls the lives */
public void LoseLive() { 
lives--;
if (lives <= 0) { EndGame(); }
reinit();
}
/** this ends the game */
public void EndGame() { 
resetGame();
gameOver=true;
game=false; 
}
/** this resets the game and destroys everything not being used */
public void resetGame() {
level.reset();
lives=3;
 for (int i=0; i < s.length; i++) { s[i]=null; }
  for (int i=0; i < w.length; i++) { w[i]=null; }
  for (int i=0; i < a.length; i++) { a[i]=null; }
  for (int i=0; i < mp.length; i++) { mp[i]=null; }
}
//paint
public void paint(Graphics g) 
{

  //credits
  bufferGraphics.setColor(Color.orange);
  bufferGraphics.drawString("Java Snake game "+ version,10,470);
  bufferGraphics.drawString("By: Pickle",10,480);

  // draw the offscreen image to the screen like a normal image.
  // Since offscreen is the screen width we start at 0,0.
  g.drawImage(offscreen,0,0,this); 
}
public void update(Graphics g)  { paint(g); } 

//key events
public void keyPressed(KeyEvent e ) { 
if (puase != true) {
  switch (e.getKeyCode()) {
    case KeyEvent.VK_LEFT:  
    if (s[0].direction == "left" || s[0].direction == "right") {}
else {
      s[0].direction="left";
      for (int i=0; i < mp.length; i++) {
        if (mp[i] == null) {
          mp[i]=new MovePoint();
          mp[i].init(s[0].x,s[0].y,"left");
          break;
        }
      }
    }
    break;
    case KeyEvent.VK_RIGHT:
    if (s[0].direction == "left" || s[0].direction == "right") {}
else {
      s[0].direction="right";
      for (int i=0; i < mp.length;  i++) {
              if (mp[i] == null) {
           mp[i]=new MovePoint();
          mp[i].init(s[0].x,s[0].y,"right");
          break;
        }
      }
    }
    break;
    case KeyEvent.VK_UP: 
    if (s[0].direction == "up" || s[0].direction == "down") {}
else {
      s[0].direction="up";
      for (int i=0; i < mp.length;  i++) {
              if (mp[i] == null) {
          mp[i]=new MovePoint();
          mp[i].init(s[0].x,s[0].y,"up");
          break;
        }
      }
    }
    break;
    case KeyEvent.VK_DOWN:  
    if (s[0].direction == "up" || s[0].direction == "down") {}
else {
      s[0].direction="down";
      for (int i=0; i < mp.length;  i++) {
              if (mp[i] == null) {
          mp[i]=new MovePoint();       
          mp[i].init(s[0].x,s[0].y,"down");
          break;
        }
      }
    }
    break;
    case KeyEvent.VK_SPACE:  
    if (game == false) {
    game=true; 
    reinit();
}
    break;
  }
}

   if (e.getKeyChar() == 'p') {
    if (puase == true) { puase=false; }
else { puase=true; }
}

}

public void keyReleased( KeyEvent e ) { }
public void keyTyped( KeyEvent e ) {}

//for my rounding needs
public static float Round(float Rval, int Rpl) {
  float p = (float)Math.pow(10,Rpl);
  Rval = Rval * p;
  float tmp = Math.round(Rval);
  return (float)tmp/p;
}

/**
 * records Level Info
 */
private class Level {
int level = 0;
int goal=0;
float time = 0.0f;
public Level() { }

public void reset() {
goal=0;
time = 0.0f;
}
public void setLevel(int l) { level=l; }
public void setGoal(int g) { goal=g; }
public int getLevel() { return level; }
public int getGoal() { return goal; }
}

/**
*  record snake sections
*/
private class Section {
  int x,y;
  String direction=null;
  boolean head=false;
  public Section() { }
  public void init(int X, int Y,  String B) {
    direction=B;
    x=X;
    y=Y;
  }
  public void setHead(boolean h) { head=h; }
  public void move() {
    if (direction == "up") { y-=5; }
    if (direction == "down") { y+=5; }
    if (direction == "right") { x+=5; }
    if (direction == "left") { x-=5; }
  }
  public void Paint(Graphics g) {
      g.setColor(Color.green);
      g.fillOval(x,y,5,5);
      if (head == true) { 
      g.setColor(Color.black);
      g.fillOval(x - 2,y - 2,2,2);
      g.fillOval(x - 4,y - 2,2,2);
    }
  }
  //end class section
}

/**
* record Move point
*/
private class MovePoint {
  int x,y;
  String direction;
  public MovePoint() {  }
  public void init(int X, int Y, String B) {
    direction=B;
    x=X;
    y=Y;
  }
  //end class section
}
/**
*Draw Wall Randomly
*/
private class Wall  {
  int x,y;
  public Wall() { }
  public void init(int X, int Y) { 
    x=X - (X % 5);
    y=Y - (Y % 5);
  }
  public void Paint(Graphics g) {
      g.setColor(Color.gray);
      g.fillOval(x,y,5,5);
  }
  //end class Wall
}

/**
*Draw Apple Randomly
*/
private class Apple {
  int x,y;
  public Apple() { }
  public void init() { 
    int rand=r.nextInt(dim.width);
    x=rand - (rand % 5);
    rand=r.nextInt(dim.height);
    y=rand - (rand % 5);
  }
  public void Paint(Graphics g) {
      g.setColor(Color.red);
      g.fillOval(x,y,5,5);
  }
  //end class apple
}

//end
}

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...


×
×
  • Create New...