⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameframe.java

📁 自己写的java贪吃蛇小游戏。
💻 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;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -