java小游戏-贪吃蛇

类别:Java 点击:0 评论:0 推荐:

SnakeGame.java

package SnakeGame;

import javax.swing.*;
public class SnakeGame
{
 public static void main( String[] args )
 {
  JDialog.setDefaultLookAndFeelDecorated( true );
  GameFrame temp = new GameFrame();
 }
}


Snake.java

package SnakeGame;

import java.awt.*;
import java.util.*;

class Snake extends LinkedList
{
 public int snakeDirection = 2;
 public int snakeReDirection = 4;
 public Snake()
 {
  this.add( new Point( 3, 3 ) );
  this.add( new Point( 4, 3 ) );
  this.add( new Point( 5, 3 ) );
  this.add( new Point( 6, 3 ) );
  this.add( new Point( 7, 3 ) );
  this.add( new Point( 8, 3 ) );
  this.add( new Point( 9, 3 ) );
  this.add( new Point( 10, 3 ) );
 }
 public void changeDirection( Point temp, int direction )
 {
  this.snakeDirection = direction;
  switch( direction )
  {
   case 1://up
    this.snakeReDirection = 3;
    this.add( new Point( temp.x, temp.y - 1 ) );
    break;
   case 2://right
    this.snakeReDirection = 4;
    this.add( new Point( temp.x + 1, temp.y ) );
    break;
   case 3://down
    this.snakeReDirection = 1;
    this.add( new Point( temp.x, temp.y + 1 ) );
    break;
   case 4://left
    this.snakeReDirection = 2;
    this.add( new Point( temp.x - 1, temp.y ) );
    break;
  }
 }
 public boolean checkBeanIn( Point bean )
 {
  Point temp = (Point) this.getLast();
  if( temp.equals( bean ) )
  {
   return true;
  }
  return false;
 }
 
 public void removeTail()
 {
  this.remove( 0 );
 }
 
 public void drawSnake( Graphics g, int singleWidthX, int singleHeightY, int cooPos )
 { 
  g.setColor( ColorGroup.COLOR_SNAKE );
  Iterator snakeSq = this.iterator();
  while ( snakeSq.hasNext() )
  {
    Point tempPoint = (Point)snakeSq.next();
    this.drawSnakePiece( g, tempPoint.x, tempPoint.y,
     singleWidthX, singleHeightY, cooPos );
  }
 }
 
 public void drawSnakePiece( Graphics g, int temp1, int temp2,
   int singleWidthX, int singleHeightY, int cooPos )
 {
  g.fillRoundRect( singleWidthX * temp1 + 1,
      singleHeightY * temp2 + 1,
      singleWidthX - 2,
      singleHeightY - 2,
      cooPos,
      cooPos );
 }
 public void clearEndSnakePiece( Graphics g, int temp1, int temp2,
   int singleWidthX, int singleHeightY, int cooPos )
 {
  g.setColor( ColorGroup.COLOR_BACK );
  g.fillRoundRect( singleWidthX * temp1 + 1,
      singleHeightY * temp2 + 1,
      singleWidthX - 2,
      singleHeightY - 2,
      cooPos,
      cooPos );
 }
}

GameFrame.java

package SnakeGame;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.awt.geom.*;

class GameFrame extends JFrame
{
 private Toolkit tempKit;
 private int horizontalGrid, verticalGrid;
 private int singleWidthX, singleHeightY;
 private int cooPos;
 private Snake mainSnake;
 private LinkedList eatedBean;
 {
  eatedBean = new LinkedList();
 }
 private Iterator snakeSq;
 public javax.swing.Timer snakeTimer;
 private int direction = 2;
 private int score;
 private String info;
 private Point bean, eatBean;
 {
  bean = new Point();
 }
 private boolean flag;
 private JMenuBar infoMenu;
 private JMenu[] tempMenu;
 private JMenuItem[] tempMenuItem;
 private JRadioButtonMenuItem[] levelMenuItem, versionMenuItem;
 private JLabel scoreLabel;
 {
  scoreLabel = new JLabel();
 }
 private Graphics2D g;
 private ImageIcon snakeHead;
 {
  snakeHead = new ImageIcon( "LOGO.gif" );
 }
 private ConfigMenu configMenu;
 private boolean hasStoped = true;
 public GameFrame()
 {

  this.tempKit = this.getToolkit();
  this.setSize( tempKit.getScreenSize() );
  this.setGrid( 60, 40, 5 );
  this.getContentPane().setBackground( ColorGroup.COLOR_BACK );
  this.setUndecorated( true );
  this.setResizable( false );
  this.addKeyListener( new KeyHandler() );
  GameFrame.this.snakeTimer = new javax.swing.Timer( 80, new TimerHandler() );
  this.getContentPane().add( scoreLabel, BorderLayout.SOUTH );
  this.scoreLabel.setFont( new Font( "Fixedsys", Font.BOLD, 15 ) );
  this.scoreLabel.setText( "Pause[SPACE] - Exit[ESC]" );
  this.configMenu = new ConfigMenu( this );
  this.setVisible( true );
  
 }
 public void setGrid( int temp1, int temp2, int temp3 )
 {
  this.horizontalGrid = temp1;
  this.verticalGrid = temp2;
  this.singleWidthX = this.getWidth() / temp1;
  this.singleHeightY = this.getHeight() / temp2;
  this.cooPos = temp3;
 }
 
 private class KeyHandler extends KeyAdapter
 {
  public void keyPressed( KeyEvent e )
  {
   if( e.getKeyCode() == 27 )
   {
    snakeTimer.stop();
    if( JOptionPane.showConfirmDialog( null, "Are you sure to exit?" ) == 0 )
    {
     System.exit( 0 );
    }
    snakeTimer.start();
   }
   else if( e.getKeyCode() == 37 && mainSnake.snakeDirection != 2 )//left
   {
    direction = 4;
   }
   else if( e.getKeyCode() == 39 && mainSnake.snakeDirection != 4 )//right
   {
    direction = 2;
   }
   else if( e.getKeyCode() == 38 && mainSnake.snakeDirection != 3 )//up
   {
    direction = 1;
   }
   else if( e.getKeyCode() == 40 && mainSnake.snakeDirection != 1 )//down
   {
    direction = 3;
   }
   else if( e.getKeyCode() == 32 )
   {
    if( !hasStoped )
    {
     if( !flag )
     {
      
      snakeTimer.stop();
      configMenu.setVisible( true );
      configMenu.setMenuEnable( false );
      flag = true;
     }
     else
     {
      snakeTimer.start();
      configMenu.setVisible( false );
      configMenu.setMenuEnable( true );
      flag = false;
     }
    }
   }
  }
 }
 
 private class TimerHandler implements ActionListener
 {
  public synchronized void actionPerformed( ActionEvent e )
  {
   Point temp = (Point) mainSnake.getLast();
   snakeSq = mainSnake.iterator();
   while ( snakeSq.hasNext() )
   {
    Point tempPoint = (Point)snakeSq.next();
    if( temp.equals( tempPoint ) && snakeSq.hasNext() != false )
    {
     snakeTimer.stop();
     stopGame();
     JOptionPane.showMessageDialog( null,
        "Your Score is " + score + "\n\nYou Loss!" );     
    }
   }
   System.out.println( temp.x + " " + temp.y );
   if( (temp.x == 0 && direction == 4) ||
    (temp.x == horizontalGrid-1 && direction == 2) ||
    (temp.y == 0 && direction == 1) ||
    (temp.y == verticalGrid-1  && direction == 3) )
   {
    snakeTimer.stop();
    stopGame();
    JOptionPane.showMessageDialog( null,
        "Your Score is " + score + "\n\nYou Loss!" );
   }
   if( direction != mainSnake.snakeReDirection )
   {
    moveSnake( direction );
   }
   mainSnake.drawSnake( getGraphics(), singleWidthX, singleHeightY, cooPos );
   drawBeanAndEBean( getGraphics() );
  }
 }
 
 
 public void stopGame()
 {
  this.hasStoped = true;
  this.snakeTimer.stop();
  Graphics2D g = (Graphics2D) GameFrame.this.getGraphics();
  g.setColor( ColorGroup.COLOR_BACK );
  super.paint( g );
  configMenu.setVisible( true );
 }
 
 public void resetGame()
 {
  System.gc();
  this.hasStoped = false;
  Graphics2D g = (Graphics2D) GameFrame.this.getGraphics();
  g.setColor( ColorGroup.COLOR_BACK );
  super.paint( g );
  this.mainSnake = new Snake();
  this.createBean( bean );
  this.eatedBean.clear();
  mainSnake.drawSnake( getGraphics(), singleWidthX, singleHeightY, cooPos );
  this.snakeTimer.start();
  this.direction = 2;
  this.score = 0;
  this.scoreLabel.setText( "Pause[SPACE] - Exit[ESC]" );  
 }

 private void moveSnake( int direction )
 {
  if( mainSnake.checkBeanIn( this.bean ) )
  {
   this.score += 100;
   this.scoreLabel.setText( this.info + " Current Score:" + this.score );
   this.eatedBean.add( new Point(this.bean) );
   this.createBean( this.bean );
  }
  mainSnake.changeDirection( (Point) mainSnake.getLast(), direction );
  Point temp = (Point) mainSnake.getFirst();
  if( eatedBean.size() != 0 )
  {
   if( eatedBean.getFirst().equals( temp ) )
   {
    eatedBean.remove( 0 );
   }
   else
   {
    mainSnake.clearEndSnakePiece( getGraphics(), temp.x, temp.y,
     singleWidthX, singleHeightY, cooPos );
    mainSnake.removeTail();
   }
  }
  else
  {
   mainSnake.clearEndSnakePiece( getGraphics(), temp.x, temp.y,
    singleWidthX, singleHeightY, cooPos );
   mainSnake.removeTail();
  }
 }
 
 private void drawBeanAndEBean( Graphics g )
 {
  g.setColor( ColorGroup.COLOR_BEAN );
  this.drawPiece( g, this.bean.x, this.bean.y );
  g.setColor( ColorGroup.COLOR_EATEDBEAN );
  snakeSq = eatedBean.iterator();
  while ( snakeSq.hasNext() )
  {
    Point tempPoint = (Point)snakeSq.next();
    this.drawPiece( g, tempPoint.x, tempPoint.y );
  }  
 }
 
 private void drawPiece( Graphics g, int x, int y )
 {
  g.fillRoundRect( this.singleWidthX * x + 1,
      this.singleHeightY * y + 1,
      this.singleWidthX - 2,
      this.singleHeightY - 2,
      this.cooPos,
      this.cooPos ); 
 }
 
 private void createBean( Point temp )
 {
  LP:
  while( true )
  {
   temp.x = (int) (Math.random() * this.horizontalGrid);
   temp.y = (int) (Math.random() * this.verticalGrid);
   snakeSq = mainSnake.iterator();
   while ( snakeSq.hasNext() )
   {
    if( snakeSq.next().equals( new Point( temp.x, temp.y ) ) )
    {
     continue LP;
    }
   }
   break;
  }
 }
}

ConfigMenu.java

package SnakeGame;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class ConfigMenu extends JMenuBar
{
 
 GameFrame owner;
 JMenu[] menu;
 JMenuItem[] menuItem;
 JRadioButtonMenuItem[] speedItem, modelItem, standardItem;
 private UIManager.LookAndFeelInfo looks[];
 public ConfigMenu( GameFrame owner )
 {
  this.owner = owner;
  owner.setJMenuBar( this );
  String[] menu_name = {"Snake Game", "Game Configure", "Game Help"};
  menu = new JMenu[menu_name.length];
  for( int i = 0; i < menu_name.length; i++ )
  {
   menu[i] = new JMenu( menu_name[i] );
   menu[i].setFont( new Font( "Courier", Font.PLAIN, 12 ) );
   this.add( menu[i] );
  }
  
  
  String[] menuItem_name = {"Start Game", "Stop Game", "Exit Game",
         "Game Color",
         "About..."};
  menuItem = new JMenuItem[menuItem_name.length];
  for( int i = 0; i < menuItem_name.length; i++ )
  {
   menuItem[i] = new JMenuItem( menuItem_name[i] );
   menuItem[i].setFont( new Font( "Courier", Font.PLAIN, 12 ) );
   menuItem[i].addActionListener( new ActionHandler() );
  }
  menu[0].add( menuItem[0] );
  menu[0].add( menuItem[1] );
  menu[0].addSeparator();
  menu[0].add( menuItem[2] );
  menu[1].add( menuItem[3] );
  menu[2].add( menuItem[4] );
  
  
  String[] inner_menu_name = {"Game Speed", "Window Model", "Game Standard "};
  JMenu[] inner_menu = new JMenu[inner_menu_name.length];
  for( int i = 0; i < inner_menu_name.length; i++ )
  {
   inner_menu[i] = new JMenu( inner_menu_name[i] );
   inner_menu[i].setFont( new Font( "Courier", Font.PLAIN, 12 ) );
   menu[1].add( inner_menu[i] );
  }
  
  ButtonGroup temp1 = new ButtonGroup();
  String[] speedItem_name = {"Speed-1", "Speed-2", "Speed-3", "Speed-4", "Speed-5"};
  speedItem = new JRadioButtonMenuItem[speedItem_name.length];
  for( int i = 0; i < speedItem_name.length; i++ )
  {
   speedItem[i] = new JRadioButtonMenuItem( speedItem_name[i] );
   inner_menu[0].add( speedItem[i] );
   speedItem[i].setFont( new Font( "Courier", Font.PLAIN, 12 ) );
   speedItem[i].addItemListener( new ItemHandler() );
   temp1.add( speedItem[i] );
  }
  
  
  ButtonGroup temp2 = new ButtonGroup();
  String[] modelItem_name = { "Linux", "Mac", "Windows" };
  modelItem = new JRadioButtonMenuItem[modelItem_name.length];
  for( int i = 0; i < modelItem_name.length; i++ )
  {
   modelItem[i] = new JRadioButtonMenuItem( modelItem_name[i] );
   inner_menu[1].add( modelItem[i] );
   modelItem[i].setFont( new Font( "Courier", Font.PLAIN, 12 ) );
   modelItem[i].addItemListener( new ItemHandler() );
   temp2.add( modelItem[i] );
  }
  
  ButtonGroup temp3 = new ButtonGroup();
  String[] standardItem_name = { "60 * 40", "45 * 30", "30 * 20" };
  standardItem = new JRadioButtonMenuItem[standardItem_name.length];
  for( int i = 0; i < standardItem_name.length; i++ )
  {
   standardItem[i] = new JRadioButtonMenuItem( standardItem_name[i] );
   inner_menu[2].add( standardItem[i] );
   standardItem[i].setFont( new Font( "Courier", Font.PLAIN, 12 ) );
   standardItem[i].addItemListener( new ItemHandler() );
   temp3.add( standardItem[i] );
  }
  looks = UIManager.getInstalledLookAndFeels();
 }
 
 private class ActionHandler implements ActionListener
 {
  public void actionPerformed( ActionEvent e )
  {
   if( e.getSource() == menuItem[0] )
   {
    owner.resetGame();
    ConfigMenu.this.setVisible( false );
   }
   else if( e.getSource() == menuItem[1] )
   {
    owner.stopGame();
    ConfigMenu.this.setVisible( true );
    ConfigMenu.this.setMenuEnable( true );
   }
   else if( e.getSource() == menuItem[2] )
   {
    System.exit( 0 );
   }
   else if( e.getSource() == menuItem[3] )
   {
    ConfigDialog temp = new ConfigDialog( owner );
    temp.setVisible( true );
   }
   else if( e.getSource() == menuItem[4] )
   {
    JOptionPane.showMessageDialog( null, "Sanke Game 2.0 Version!\n\n" +
             "Author: FinalCore\n\n" );
   }
  }
 }
 
 private class ItemHandler implements ItemListener
 {
  public void itemStateChanged( ItemEvent e )
  {
   for( int i = 0; i < speedItem.length; i++ )
   {
    if( e.getSource() == speedItem[i] )
    {
     owner.snakeTimer.setDelay( 150 - 30 * i );
    }
   }
   if( e.getSource() == standardItem[0] )
   {
    owner.setGrid( 60, 40, 5 );
   }
   else if( e.getSource() == standardItem[1] )
   {
    owner.setGrid( 45, 30, 10 );
   }
   else if( e.getSource() == standardItem[2] )
   {
    owner.setGrid( 30, 20, 15 );
   }
   for( int i = 0; i < modelItem.length; i++ )
   {
    if( e.getSource() == modelItem[i] )
    {
     try
     {
      UIManager.setLookAndFeel( looks[i].getClassName() );
     }catch(Exception ex){}
    }
   }
  }
 }
 
 public void setMenuEnable( boolean temp )
 {
  menu[1].setEnabled( temp );
 }
 
}

ConfigDialog.java

package SnakeGame;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ConfigDialog extends JDialog
{
 private Container c;
 private JFrame owner;
 private OwnPanel[] panel = new OwnPanel[4];
 Box box1, box2;
 private JButton commitButton, cancelButton;
 Color[] color = new Color[4];
 public ConfigDialog( Frame owner )
 {
  this.owner = (JFrame) owner;
  this.setSize( 400, 200 );
  this.setResizable( false );
  this.setTitle( "Config Your Game" );
  this.c = this.getContentPane();
  this.c.setBackground( Color.WHITE );
  this.c.setLayout( new FlowLayout() );
  this.box1 = Box.createVerticalBox();
  for( int i = 0; i < panel.length; i++ )
  {
   panel[i] = new OwnPanel();
   panel[i].addActionListener( new ActionHandler() );
   this.box1.add( panel[i] );
   this.box1.add( Box.createVerticalStrut( 4 ) );
  }
  this.panel[0].setText( "   Background" );
  this.panel[1].setText( "   Snake" );
  this.panel[2].setText( "   Bean" );
  this.panel[3].setText( "   EatedBean" );
  this.panel[0].setBack( ColorGroup.COLOR_BACK );
  this.panel[1].setBack( ColorGroup.COLOR_SNAKE );
  this.panel[2].setBack( ColorGroup.COLOR_BEAN );
  this.panel[3].setBack( ColorGroup.COLOR_EATEDBEAN );
  this.box2 = Box.createHorizontalBox();
  this.commitButton = new JButton( "确定" );
  this.commitButton.setFont( Font.getFont( "Fixedsys" ) );
  this.commitButton.addActionListener( new ActionHandler() );
  this.cancelButton = new JButton( "取消" );
  this.cancelButton.setFont( Font.getFont( "Fixedsys" ) );
  this.cancelButton.addActionListener( new ActionHandler() ); 
  this.box2.add( this.commitButton );
  this.box2.add( Box.createHorizontalStrut( 20 ) );
  this.box2.add( this.cancelButton );
  this.box1.add( this.box2 );
  this.c.add( this.box1, BorderLayout.NORTH );
  this.setLocation( ( this.getToolkit().getScreenSize().width - this.getWidth() )/2,
    ( this.getToolkit().getScreenSize().height - this.getHeight() )/2 );
  this.setVisible( true );
 }
 public void setOwnerColor( Color temp )
 {
  this.owner.getContentPane().setBackground( temp );
 }
 private class ActionHandler implements ActionListener
 {
  public void actionPerformed( ActionEvent e )
  {
   for( int i = 0; i < color.length; i++ )
   {
    if( e.getSource() == panel[i].reButton() )
    {
     color[i] = JColorChooser.showDialog( ConfigDialog.this,
            "Choose BackGround Color",
            Color.WHITE );
     if( color[i] != null )
     {
      panel[i].setBack( color[i] );
     }
    }
   }
   if( e.getSource() == commitButton )
   {
    color[0] = (color[0]==null?ColorGroup.COLOR_BACK:color[0]);
    color[1] = (color[1]==null?ColorGroup.COLOR_SNAKE:color[1]);
    color[2] = (color[2]==null?ColorGroup.COLOR_BEAN:color[2]);
    color[3] = (color[3]==null?ColorGroup.COLOR_EATEDBEAN:color[3]);
    ConfigDialog.this.setVisible( false );
    ColorGroup.setCOLOR_BACK( color[0] );
    owner.getContentPane().setBackground( color[0] );    
    ColorGroup.setCOLOR_SNAKE( color[1] ); 
    ColorGroup.setCOLOR_BEAN( color[2] );
    ColorGroup.setCOLOR_EATEDBEAN( color[3] );
    ConfigDialog.this.dispose();
   }
   else if( e.getSource() == cancelButton )
   {
    ConfigDialog.this.setVisible( false );
    ConfigDialog.this.dispose();
   }

  }
 }
}

class OwnPanel extends JPanel
{
 private JLabel temp1;
 private JTextField temp2;
 private JButton temp3;
 OwnPanel()
 {
  temp1 = new JLabel();
  temp1.setFont( Font.getFont( "Fixedsys" ) );
  temp2 = new JTextField();
  temp3 = new JButton( "Change" );
  temp3.setFont( Font.getFont( "Fixedsys" ) );
  temp2.setEditable( false );
  temp2.setColumns( 10 );
  this.add( temp1 );
  this.add( temp2 );
  this.add( temp3 );
  this.setLayout( new GridLayout( 1, 3 ) );
 }
 public void setButtonName( String temp )
 {
  temp3.setName( temp );
 }
 public void setBack( Color temp )
 {
  temp2.setBackground( temp );
 }
 public void setText( String temp )
 {
  temp1.setText( temp );
 }
 public Object reButton()
 {
  return temp3;
 }
 public void addActionListener( ActionListener ac )
 {
  temp3.addActionListener( ac );
 }
}

Tools.java

package SnakeGame;

import java.awt.*;
import javax.swing.*;

class ColorGroup
{
 static Color COLOR_BACK = Color.WHITE;
 static Color COLOR_SNAKE = new Color( 43, 110, 187 );
 static Color COLOR_BEAN = Color.BLUE;
 static Color COLOR_EATEDBEAN = Color.CYAN;
 static void setCOLOR_BACK( Color temp )
 {
  COLOR_BACK = temp;
 }
 static void setCOLOR_SNAKE( Color temp )
 {
  COLOR_SNAKE = temp;
 }
 static void setCOLOR_BEAN( Color temp )
 {
  COLOR_BEAN = temp;
 }
 static void setCOLOR_EATEDBEAN( Color temp )
 {
  COLOR_EATEDBEAN = temp;
 }
}


final class MenuGet
{
 public static JMenu getMenu( String temp )
 {
  JMenu reMenu = new JMenu( temp );
  reMenu.setFont( Font.getFont( "Fixedsys" ) );
  return reMenu;
 }
}

final class MenuItemGet
{
 public static JMenuItem getMenuItem( String temp )
 {
  JMenuItem reMenuItem = new JMenuItem( temp );
  reMenuItem.setFont( Font.getFont( "Fixedsys" ) );
  return reMenuItem;
 }
}

本文地址:http://com.8s8s.com/it/it10901.htm