Java 源代码贪吃蛇

gejun123 贡献于2012-06-04

作者 jack  创建于2012-04-28 14:13:23   修改者  修改于1899-12-30 00:00:00字数14829

文档摘要:Java 源代码贪吃蛇
关键词:

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,$False$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.*; { 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; } }

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档