分享
 
 
 

java小游戏-贪吃蛇

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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;

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有