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

📄 gameframe.java

📁 greedy snake!greedy snake!
💻 JAVA
字号:
//GameFrame.java
//package SnakeGame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
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 + -