贪吃蛇小游戏(团队)

贪吃蛇小游戏

成员介绍
成员 任务分配 职务
郑伊杰 Git的提交和上传,蛇的移动和边界处理,蛇吃食物,添加蛇的长度显示分数 组长
曾纪 游戏界面的设计,所需要的图片制作,博客的编写 组员
安省龙 显示分数,重新开始,游戏结束,添加音乐 组员
gitee地址

https://gitee.com/zheng-yijie/java_-snake/tree/master

前期调查

图片来源于网络,侵删
贪吃蛇由蛇头,蛇身构成,然后需要在画布上随机生成食物,每吃掉一个就要生成新的食物,并且蛇的长度会+1

参考项目

https://blog.csdn.net/doubututou/article/details/112800349?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-3&spm=1001.2101.3001.4242
https://blog.csdn.net/wtfsb/article/details/103044241?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-3&spm=1001.2101.3001.4242

功能框架图

1.思维导图

2.流程图

面对对象设计
包-类图

UML

项目运行截图

1.开始

2.游戏进行中

3.游戏结束

项目代码
1.Snakewindow
public class Snakewindows {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		JFrame frame =new JFrame();
		frame.setBounds(400,200,900,720);
		frame.setResizable(false);//设置游戏窗口不可拖动
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭后同时关闭窗口
		SnakePanel panel=new SnakePanel();
		new Play("MT1990 - 点星(Point The Star).mp3").start();//播放背景音乐
		frame.add(panel);
		frame.setVisible(true);//显示该窗体


	}

}
2.SnakePanel
public class SnakePanel extends JPanel implements KeyListener,ActionListener{
	ImageIcon back =new ImageIcon("back.png");
	ImageIcon body =new ImageIcon("body.png");
	ImageIcon down =new ImageIcon("down.png");
	ImageIcon food =new ImageIcon("food.png");
	ImageIcon left =new ImageIcon("left.png");
	ImageIcon right =new ImageIcon("right.png");
	ImageIcon up =new ImageIcon("up.png");

	//导入所有要使用的图片
	
	int[]snakex =new int [750];//蛇的横坐标
	int[]snakey =new int [750];//蛇的纵坐标
	int len=3;//蛇的长度设计
	String direction ="R";//R为右L为左U为上D为下
	
	Random r=new Random();
	int foodx=r.nextInt(34)*25+25;
	int foody=r.nextInt(24)*25+75;//食物坐标
	
	
	
	boolean isStarted=false;//判断游戏是否开始
	boolean isFaild=false;
	
	
	Timer timer= new Timer(100,this);//蛇的速度 监听
	
	
	
	public SnakePanel() {
		this.setFocusable(true);
		initSnake();
		this.addKeyListener(this);
		timer.start();
		
	}
	
	int score=0;//添加分数数值
	
	
	
	public void initSnake() {
		isStarted=false;
		isFaild=false;
		len=3;
		score=0;
		direction="R";
		snakex[0]=100;
		snakey[0]=100;
		snakex[1]=75;
		snakey[1]=100;
		snakex[2]=50;
		snakey[2]=100;//加载蛇的位置数据和加载蛇的出现
		
		
	}
  
	/* (non-Javadoc)
	 * @see javax.swing.JComponent#paint(java.awt.Graphics)
	 */
	public void paint(Graphics g) {
		// TODO Auto-generated method stub
		this.setBackground(Color.BLACK);
		g.fillRect(25, 75, 850, 600);
		back.paintIcon(this,g,25,11);
		
		
		
		if(direction.equals("R")) {
			right.paintIcon(this, g, snakex[0], snakey[0]);
		}else if(direction.equals("L")) {
			left.paintIcon(this, g, snakex[0], snakey[0]);
		}else if(direction.equals("U")) {
			up.paintIcon(this, g, snakex[0], snakey[0]);
		}else if(direction.equals("D")) {
			down.paintIcon(this, g, snakex[0], snakey[0]);
		}//蛇头制作
		
		
		for (int i = 1; i < len; i++) {
			body.paintIcon(this, g, snakex[i], snakey[i]);
		}
		
		if(!isStarted) {
			g.setColor(Color.BLACK);
			g.setFont(new Font("arial",Font.BOLD,30));
			g.drawString("Press Space to PLAY/PAUSE Game", 210, 350);
		}//空格键提示语
		if(isFaild) {
			g.setColor(Color.RED);
			g.setFont(new Font("arial",Font.BOLD,30));
			g.drawString("GAME OVER", 350, 350);
			
		}
		
		food.paintIcon(this, g, foodx, foody);
		
		g.setColor(Color.BLACK);
		g.setFont(new Font("arial",Font.BOLD,15));
		g.drawString("Score:"+score, 750, 40);
		g.drawString("Length:"+len, 750, 60);

	}
	
	@Override
	public void keyPressed(KeyEvent e) {
		int keyCode=e.getKeyCode();
		if(keyCode==KeyEvent.VK_SPACE) {
			if(isFaild) {
				initSnake();
			}else {
				isStarted=!isStarted;//实现空格键可按动
			}
			repaint();
			
		}else if(keyCode== KeyEvent.VK_RIGHT && !direction.equals("L")) {
			direction="R";
		}else if(keyCode==KeyEvent.VK_LEFT && !direction.equals("R")) {
			direction="L";
		}else if(keyCode==KeyEvent.VK_UP &&!direction.equals("D")) {
			direction="U";
		}else if(keyCode==KeyEvent.VK_DOWN && !direction.equals("U")) {
			direction="D";
		}
	}
	@Override
	public void keyReleased(KeyEvent arg0) { 
		// TODO 自动生成的方法存根
		
	}
	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO 自动生成的方法存根
		
	}
	
	
	
	@Override
	public void actionPerformed(ActionEvent arg0) {
		timer.start();
		
		if(isStarted && !isFaild) {//判断 如果开始
			for(int i=len;i>0;i--) {
				snakex[i]=snakex[i-1];
				snakey[i]=snakey[i-1];
			}//身体移动的代码
			if(direction.equals("R")) {
				//横坐标+25
				snakex[0] = snakex[0]+25;
				if(snakex[0]>850) snakex[0] = 25;
				
			}else if(direction.equals("L")) {
				
				snakex[0] = snakex[0]-25;
				if(snakex[0]<25) snakex[0] = 850;
				
			}else if(direction.equals("U")) {
				
				snakey[0] = snakey[0]-25;
				if(snakey[0]<75) snakey[0] = 650;
				
			}else if(direction.equals("D")) {
				snakey[0] = snakey[0]+25;
				if(snakey[0]>650) snakey[0] = 75;//边界传送设置
			}
		}
		if(snakex[0] == foodx && snakey[0] == foody) {
			len++;
			score++;
			////////////////////////////得分显示
			/////////////////////////蛇吃食物并且长大,蛇与食物重合
			foodx = r.nextInt(34)*25+25;
			foody = r.nextInt(24)*25+75;
		}//到食物增加长度的逻辑
		for(int i=1;i<len;i++) {//判断游戏失败
			if(snakex[0] == snakex[i] && snakey[0] == snakey[i]) {
				isFaild = true;
			}
		}
		repaint();
	}
	

}
3.Play
class Play extends Thread{
    Player player;
    String music;
    public Play(String file) {
        this.music = file;
    }
     public void run() {
        try {
            play();     
        } catch (FileNotFoundException | JavaLayerException e) {
             e.printStackTrace();//在命令行打印异常信息在程序中出错的位置及原因
        }
    }
    public void play() throws FileNotFoundException, JavaLayerException { 
        BufferedInputStream buffer = new BufferedInputStream(new FileInputStream(music)); 
        player = new Player(buffer); 
        player.play(); 
    } 
} 
代码扫描

项目总结

1.有想要添加的功能,但也是由于上述原因未能实现,比如添加会导致游戏结束的炸弹,蛇的移动速度随着长度的增加变快或是变慢,随着游戏时间的增加让画布上的食物越来越多等。
2.背景音乐只能实现一打开游戏就播放,音量也是跟随系统音量并不能改变,不能实现暂停或者切换下一首等音乐器的基本操作

posted @ 2021-01-29 09:53  祖国庇佑我  阅读(300)  评论(0编辑  收藏  举报