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

📄 greedysnake.java

📁 贪吃蛇程序 我自己做的 比较的简单贪吃蛇程序 我自己做的 比较的简单
💻 JAVA
字号:
import java.awt.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
class Snakenode{//蛇节点
	int x;
	int y;
	Snakenode(int x,int y)
	{
		this.x=x;
		this.y=y;
	}
}

class key implements KeyListener{//【【【【【【【【【【【【【【【【接口】】】】】】】】】】】】】】】】】
	
	public static final int right=1;//简单宏方向定义
	public static final int left=3;
	public static final int up=2;
	public static final int down=4;
	
	static int position=1;	
	static boolean gamestate=true;	//控制蛇的动不动
	public int getPosition()
	{
		return position;
	}
	public boolean getgame()
	{
		return gamestate;//true or false
	}
	public void keyPressed(KeyEvent e)
	{
		int k=e.getKeyCode();//int getKeyCode()  返回此 AWTKeyStroke 的数字键代码。 
		switch(k)
		{
		case KeyEvent.VK_UP:
		case KeyEvent.VK_E:
			if(position!=down) position=up;break;
			
		case KeyEvent.VK_LEFT:
		case KeyEvent.VK_S:
			if(position!=right) position=left;break;
			
		case KeyEvent.VK_DOWN:
		case KeyEvent.VK_D:
			if(position!=up)   position=down;break;
			
		case KeyEvent.VK_RIGHT:
		case KeyEvent.VK_F:
			if(position!=left) position=right;break;
			
		case KeyEvent.VK_ENTER:
			gamestate=!gamestate;
		
		}
	}
	public void keyReleased(KeyEvent e){}//本程序没用到
	public void keyTyped(KeyEvent e){}//本程序没用到
}

public class CrazySnake //Main Class
{
    static canvas can=new canvas();//创建一个画布对象
   
	public static void main(String args[])
	{
		try 
		{    
          JFrame jFrame=new JFrame("疯狂贪吃蛇");//总容器  JFrame 
		  JLabel lab=new JLabel
		  (
				"<html>" +
				"<body>" +
				"<font size=4 Color=RED>方向键控制蛇的运动方向"+
				"或e,s,d,f键控制运动方向,<br>在程序" +
				"运行中按\"ENTER\"可控制暂停/运行状态<br>" +
				"运动的步长为1,2,4,8</font></body>" +
				"</html>"
		  );

		control thread1=new control();

		  can.setBackground(Color.WHITE);
		  can.setSize(100,100);

		 jFrame.getContentPane().setLayout(new BorderLayout());;
		 jFrame.setSize(520,601);
		 jFrame.add(can,"Center");
		 jFrame.add(lab,"South");
		 jFrame.addKeyListener(new key());//
		 can.addKeyListener(new key());
		 jFrame.setResizable(false);
		 jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		 jFrame.setVisible(true);
		 jFrame.pack();
		 thread1.start();//线程开始
	//【【【【【【i/o】】】】】】运用添加时间----------------------------------------------------------------
					FileOutputStream fos=new FileOutputStream("c:\\TimeRecord.txt");
					OutputStreamWriter osw=new OutputStreamWriter(fos);
					BufferedWriter bw=new BufferedWriter(osw);
					bw.write("上次使用时间:");					
					java.sql.Date date = new java.sql.Date(System.currentTimeMillis()); 					
					String dd =date.toString();					
					bw.write(dd);					
					bw.close();					
	//添加时间----------------------------------------------------------------------
		} catch (Exception e) {			
			e.printStackTrace();// TODO Auto-generated catch block
		}	
	}	
}

class control extends Thread
{   
	LinkedList link=new LinkedList();	
	key position=new key();	
	canvas can=new canvas();	
	int nodex=0,nodey=0;	
	int foodx,foody;//食物
	Snakenode snakenode1;	
	static int sumRet = 0;//进入的总次数标记,

	
	public void run()//必须
	{
		link.addFirst(new Snakenode(nodex,nodey));
		snakenode1 = create();
		while(true){
				can.draw(snakenode1,0);
				try{			       					
					int [] sequeseSpeedArray = {1000,1000,1,1000,1,1,1,1000,1,1,1,1,1,1,1};//控制步长的。。。1,2,4,8  就是8421  便于记忆  !!
					++sumRet;
					int ret = sumRet%15;//  sequeseSpeedArray中有十五个元素,十五个为周期循环
					Thread.sleep(sequeseSpeedArray[ret]);
					if(position.getgame() == true)
					{
						if(position.getPosition() == 1)//方向-right
						{
							nodex++;
						}
						else if(position.getPosition() == 2)//up
						{
							nodey--;
						}
						else if(position.getPosition() == 3)//left
						{
							nodex--;
						}
						else if(position.getPosition() == 4)//down
						{
							nodey++;
						}
					
						if(position.getgame()==true&&(nodey<0||nodey>=25||nodex<0||nodex>=25))
						{
							gameOver();
						}						
				
						link.addFirst(new Snakenode(nodex,nodey));					
						if(snakenode1.x==nodex&&snakenode1.y==nodey)
						{
							snakenode1=create();
						}
						else
						{
							can.draw((Snakenode)link.getLast(), 2);
							link.removeLast();
						}
					}
					can.drawnode(link);
				}
				catch(InterruptedException e){}
				catch(Exception e1)
				{
					System.out.print(e1+" ><有异常 ");
				}			
		}
	}
	
	public void gameOver()
	{
		JOptionPane.showMessageDialog(null,"头撞歪了 >< ","警告",JOptionPane.INFORMATION_MESSAGE);
		
		key.gamestate=false;
		//key.position=1;//设置下次的初始位置
		
		Iterator it=link.iterator();
		
		while(it.hasNext())
		{
			Snakenode no1=(Snakenode)it.next();
			(new canvas()).draw(no1,2);
		}
		link.clear();
		nodex=0;nodey=0;
		link.add(new Snakenode(0,0));
	}
	
	public static Snakenode create()//随机在画布中创建食物的方法
	{
		Random rand=new Random();
		int x=rand.nextInt(25);
		int y=rand.nextInt(25);
		return new Snakenode(x,y);
	}
}

class canvas extends Canvas{//窗体的组件之一
	
	public void drawnode(LinkedList link)
	{ 
		Iterator it=link.iterator();
		
		while(it.hasNext())
		{
			Snakenode tmpSnakeNode=(Snakenode)it.next();
			draw(tmpSnakeNode,1);
		}
	}
	public void draw(Snakenode node,int i){
		
		Graphics g=  CrazySnake.can.getGraphics();		
		if(i == 0)
		{
			g.setColor(Color.pink);
		}
		if(i == 1)
		{
			g.setColor(Color.green);
		}
		if(i == 2)
		{
			g.setColor(Color.white);//路线
		}//还可添加其他颜色以备用if。。
		g.fillRect(node.x*20+1, node.y*20+1, 18,18);//画出节点
		
	}
	public void paint(Graphics g)//画出线条
	{
		g.setColor(Color.black);
		for(int i=0;i<=500;i=i+20)
		{
			g.drawLine(0,i,500,i);
	    	g.drawLine(i,0,i,500);
		}
	}
}

⌨️ 快捷键说明

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