首页>代码>java swing开发贪吃蛇游戏>/Snake/src/demo/Snake.java
package demo;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class Snake extends JFrame implements Runnable{
	int x = 300;
	int y = 300;
	int x1 = 350;
	int y1 = 350;
	int mx = 10;
	int my = 0;
	int interval=400;
	int speed;
	int score;
	int time;
	boolean isRun;
	boolean paintFood;
	LinkedList<MySnake>snake = new LinkedList<MySnake>();
	JMenuBar bar = new JMenuBar();
	JLabel jl1 = new JLabel("                         速度级别:");
	JLabel jl2 = new JLabel();
	JLabel jl3 = new JLabel("        分数:");
	JLabel jl4 = new JLabel();
	JLabel jl0 = new JLabel("提示:按空格键开始/暂停游戏");
	JMenu jm1 = new JMenu("菜单");
	JMenu jm2 = new JMenu("帮助");
	JMenuItem[] jmi=new JMenuItem[4]; 
	public Snake(){
		//添加蛇体
		snake.add(new MySnake(x,y));
		snake.add(new MySnake(x-10,y));
		snake.add(new MySnake(x-20,y));
		snake.add(new MySnake(x-30,y));
		snake.add(new MySnake(x-40,y));
		//添加菜单条上的组件
		jmi[0] = new JMenuItem("重新开始");
		jmi[1] = new JMenuItem("退出");
		jmi[2] = new JMenuItem("玩法");
		jmi[3] = new JMenuItem("关于");
		jl1.setForeground(Color.magenta);
		jl2.setForeground(Color.green);
		jl3.setForeground(Color.magenta);
		jl4.setForeground(Color.green);
		jm1.add(jmi[0]);
		jm1.add(jmi[1]);
		jm2.add(jmi[2]);
		jm2.add(jmi[3]);
		bar.add(jm1);
		bar.add(jm2);
		bar.add(jl1);
		bar.add(jl2);
		bar.add(jl3);
		bar.add(jl4);
		setJMenuBar(bar);
		//添加提示标签
		setLayout(null);
		jl0.setBounds(260,0,180,30);
		jl0.setForeground(Color.red);
		add(jl0);
		for(int i=0;i<4;i++){
			jmi[i].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					if(e.getSource()==jmi[0]){
						Thread t = new Thread(new Snake());
						t.start();
					}
					if(e.getSource()==jmi[1]){
						System.exit(0);
					}
					if(e.getSource()==jmi[2]){
						JOptionPane.showMessageDialog(null,"玩法:吃掉绿色食物让蛇变得更长,以此获得更高的得分!");
					}
					if(e.getSource()==jmi[3]){
						JOptionPane.showMessageDialog(null,"作者:杨卓");
					}
				}
			});
		}
		addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent e){
				if(e.getKeyCode()==KeyEvent.VK_UP&&my==0){
					mx = 0;
					my = -10;
				}
				if(e.getKeyCode()==KeyEvent.VK_DOWN&&my==0){
					mx = 0;
					my = 10;
				}
				if(e.getKeyCode()==KeyEvent.VK_LEFT&&mx==0){
					mx = -10;
					my = 0;
				}
				if(e.getKeyCode()==KeyEvent.VK_RIGHT&&mx==0){
					mx = 10;
					my = 0;
				}
				/*if(e.getKeyCode()==KeyEvent.VK_PAGE_UP){
					interval-=20;
					speed++;
				}
				if(e.getKeyCode()==KeyEvent.VK_PAGE_DOWN){
					interval+=20;
					speed--;
				}*/
				if(e.getKeyCode()==KeyEvent.VK_SPACE){
					if(isRun==true){
						isRun = false;
					}else{
						isRun = true;
					}
				}
			}
		});
		setTitle("玩蛇");
		setSize(700,700);
		setLocation(350,20);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
	}
	public void paint(Graphics g){
		super.paint(g);
		//画蛇体
		for(int i=0;i<snake.size();i++){
			MySnake ms1 = snake.get(i);
			g.setColor(Color.red);
			g.fillOval(ms1.x,ms1.y,10,10);
		}
		//蛇头为蓝色
		g.setColor(Color.blue);
		g.fillOval(snake.getFirst().x,snake.getFirst().y,10,10);
		//画食物
		g.setColor(Color.green);
		while(paintFood){
			x1=(int)(10+Math.random()*50)*10;
			y1=(int)(10+Math.random()*50)*10;
			int i;
			for(i=0;i<snake.size();i++){
				if(x1==snake.get(i).x&&y1==snake.get(i).y){
					break;
				}
			}
			if(i==snake.size()){
				paintFood = false;
			}
		}
		g.fillOval(x1,y1,10,10);
		//画墙体
		g.setColor(Color.orange);
		for(int i=90;i<=100;i+=2){
			g.drawRect(i,i,700-2*i,700-2*i);
		}
	}
	public void run(){
		while(true){
			if(isRun){
				MySnake ms = snake.getFirst();
				snake.addFirst(new MySnake(ms.x+mx,ms.y+my));
				MySnake ms2 = snake.getFirst();
				speed = 1+score/50;
				interval = 400-80*score/50;
				jl2.setText(""+speed);
				jl4.setText(""+score);
				if(ms2.x==x1&&ms2.y==y1){
					score+=10;
					paintFood = true;
				}else{
					snake.removeLast();
				}
				for(int i=1;i<snake.size();i++){
					MySnake ms3=snake.get(i);
					//咬到自己,游戏结束
					if(ms2.x==ms3.x&&ms2.y==ms3.y){
						JOptionPane.showMessageDialog(null,"GameOver!");
						return;
					}
				}
				if(ms2.x<100||ms2.x>590||ms2.y<100||ms2.y>590){
					//碰到墙壁,游戏结束
					JOptionPane.showMessageDialog(null,"GameOver!");
					break;
				}
			}
			repaint();
			try{
				Thread.sleep(interval);
			}catch(Exception e){}
		}
	}
	public static void main(String[] args){
		Thread t = new Thread(new Snake());
		t.start();
	}
}
class MySnake{
	int x;
	int y;
	public MySnake(int x,int y){
		this.x=x;
		this.y=y;
	}
}
最近下载更多
zattttt  LV1 5月14日
xuweisong2010  LV28 2022年6月13日
Silence丶二哈  LV13 2021年5月12日
wang123999  LV19 2021年1月1日
菜鸟选手22  LV3 2020年12月25日
Spoil me  LV1 2020年12月17日
ykqwe123  LV1 2020年11月23日
675104182  LV14 2020年9月21日
xutanfei  LV3 2020年5月13日
yezi1110  LV1 2020年4月19日
最近浏览更多
zattttt  LV1 5月14日
zolscy  LV12 3月25日
kuknkk  LV1 2023年12月27日
jiemomo  LV12 2023年10月19日
lili010126  LV8 2023年6月16日
微信网友_6499754820063232  LV1 2023年6月1日
DHADHAJGFU 2023年6月1日
暂无贡献等级
luo110012  LV9 2023年5月17日
舒舒不吃葱花  LV2 2022年11月18日
627526996  LV8 2022年8月8日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友