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

📄 snake.java

📁 一个小游戏
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Snake
{
	public static void main(String[] args){
		MainFrame mainframe=new MainFrame();
		mainframe.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
	}
}

class MainFrame extends JFrame implements ActionListener,KeyListener
{
	JMenuBar menubar;
	JMenu menu1, menu2; 
	JMenuItem menuitem1,menuitem2,menuitem3,menuitem4;
	int ROWS=30,COLS=30;
	int i=0,j=0;
	JPanel[][] panel=new JPanel[ROWS][COLS];
	final int UP=1,LEFT=2,DOWN=3,RIGHT=4; 
	SnakeBody snakebody;
	SnakeThread snakethread;
	private int speed = 60;		//default speed
	boolean END = false;
	boolean pause = false;	
	boolean firstStart = true;
	
	MainFrame(){
		super("SNAKE");
		setLayout(new GridLayout(ROWS,COLS));
		  
		menubar=new JMenuBar();
		setJMenuBar(menubar);
		
		menu1=new JMenu("MENU");
		menuitem1=new JMenuItem("START");
		menuitem2=new JMenuItem("EXIT");
		menu1.add(menuitem1);
		menu1.add(menuitem2);
		menubar.add(menu1);
		
		menu2=new JMenu("SET");
		menuitem3=new JMenuItem("SLOW");
		menuitem4=new JMenuItem("SPEED");
		menu2.add(menuitem3);
		menu2.add(menuitem4);	
		menubar.add(menu2);	
		
		menuitem1.addActionListener(this);
		menuitem2.addActionListener(this);
		menuitem3.addActionListener(this);
		menuitem4.addActionListener(this);
		
		for(i=0;i<ROWS;i++){
			for(j=0;j<COLS;j++){
				panel[i][j]=new JPanel();
				panel[i][j].setBackground(Color.white);
				add(panel[i][j]);
				panel[i][j].addKeyListener(this);
			}  
		} 
		addKeyListener(this); 

		
		try{
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			javax.swing.SwingUtilities.updateComponentTreeUI(this);
		} 
		catch(Exception ex){  } 
		pack();
		setVisible(true);
		setResizable(false);
	}//end MainFrame constructor
	
	public void setSpeed( int snakeSpeed ){
		speed = snakeSpeed < 0 ? 60 : snakeSpeed ;
	}//end method setSpeed
	
	public int getSpeed(){
		return speed;
	}//end method getSpeed
	
	public void actionPerformed(ActionEvent e){
		if(e.getSource()==menuitem1){
			if( firstStart == true ){
				snakebody=new SnakeBody();	//class SnakeBody defined below		
				snakethread=new SnakeThread();	//class SnakeThread defined below
				snakethread.start();
				firstStart = false;
			}
			else
				snakebody=new SnakeBody();
		}//press "开始" menuitem
		else if(e.getSource()==menuitem2){
			System.exit(0);
		}//press "退出" menuitem
		else if(e.getSource()==menuitem3){
			setSpeed(getSpeed()+30);
		}//press "减速" menuitem
		else if(e.getSource()==menuitem4){
			setSpeed(getSpeed()-30);
		}//press "加速" menuitem

	}//end method actionPerformed
	
	public void keyPressed(KeyEvent e){
		if(e.getKeyCode() == KeyEvent.VK_ESCAPE){
			if(pause == false)
				pause = true;
			else
				pause = false;
		}//press Esc to pause
		else if(e.getKeyCode() == KeyEvent.VK_RIGHT){
			if(snakebody.direction!=LEFT)
				snakebody.direction=RIGHT;
		}
		else if(e.getKeyCode() == KeyEvent.VK_LEFT){
			if(snakebody.direction!=RIGHT)
				snakebody.direction=LEFT;
		}
		else if(e.getKeyCode() == KeyEvent.VK_UP){
			if(snakebody.direction!=DOWN)
				snakebody.direction=UP;   
		}
		else if(e.getKeyCode() == KeyEvent.VK_DOWN){
			if(snakebody.direction!=UP)
				snakebody.direction=DOWN;
		}
	}//end method keyPressed
	
	public void keyTyped(KeyEvent e){ }   
	public void keyReleased(KeyEvent e){ } 
	
	class SnakeBody
	{
		private int length,direction=0;
		private int[] rows,cols;
		private int lastrow,lastcol;
		private int x,y;
		private int i;
		private Container container = getContentPane();
		
		SnakeBody(){
			END=false;
			length=3;
			direction=UP;
			rows=new int[ROWS*COLS];
			cols=new int[ROWS*COLS];
			
			for(i=0;i<length;i++){
				rows[i]=ROWS/2+i;
				cols[i]=COLS/2;
			}
			
			for(i=0;i<ROWS;i++){
				for(j=0;j<COLS;j++)
					panel[i][j].setBackground(Color.white);
			}
			
			for(i=0;i<length;i++)
				panel[rows[i]][cols[i]].setBackground(Color.red);
    
			x=(int)(Math.random()*ROWS);
			y=(int)(Math.random()*COLS);
			
			while(panel[x][y].getBackground().equals(Color.red)){
				x=(int)(Math.random()*ROWS);
				y=(int)(Math.random()*COLS);
			}
			
			panel[x][y].setBackground(Color.blue);
		}//end SnakeBody constructor
		
		public void move(){
			lastrow=rows[length-1];
			lastcol=cols[length-1];     
			panel[rows[length-1]][cols[length-1]].setBackground(Color.white);

			for(i=length-1;i>0;i--){
				rows[i]=rows[i-1];
				cols[i]=cols[i-1];
			} 
			
			for(i=1;i<length;i++)
				panel[rows[i]][cols[i]].setBackground(Color.red);
			
			if(direction==UP) 
				rows[0]-=1;
			else if(direction==DOWN)
				rows[0]+=1; 
			else if(direction==LEFT)
				cols[0]-=1;
			else if(direction==RIGHT)
				cols[0]+=1;
    
			if(rows[0]>=ROWS||rows[0]<0||cols[0]>=COLS||cols[0]<0){
				END=true;
				JOptionPane.showMessageDialog( container, "游戏结束,请重新开始!");
				return;
			}
			if(panel[rows[0]][cols[0]].getBackground().equals(Color.red)){
				END=true;
				JOptionPane.showMessageDialog( container, "游戏结束,请重新开始!");
				return;
			}
               
			if(panel[rows[0]][cols[0]].getBackground().equals(Color.blue)){
				length++;
				rows[length-1]=lastrow;
				cols[length-1]=lastcol;
				panel[rows[length-1]][cols[length-1]].setBackground(Color.red);
				x=(int)(Math.random()*ROWS);
				y=(int)(Math.random()*COLS);
				while(panel[x][y].getBackground().equals(Color.red)){
					x=(int)(Math.random()*ROWS);
					y=(int)(Math.random()*COLS);
				}
				panel[x][y].setBackground(Color.blue);
			}//end if equal blue
			
			panel[rows[0]][cols[0]].setBackground(Color.red);   
		}//end method move
		
	}//end class SnakeBody
	
	class SnakeThread extends Thread{
		public void run(){
			while(true) {
				try{   
					Thread.sleep(getSpeed());
					if(pause == true || END)
						snakethread.interrupt();
					else
						snakebody.move(); 			
				}
				catch(InterruptedException ie){}
			}//end while loop
		} 
	}//end class SnakeThread
	
}//end class MainFrame

⌨️ 快捷键说明

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