游戏-贪吃蛇
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;
}
}
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;
}
}