用java做一个较为完整的贪吃蛇

@[
------ 因为有个关于游戏的兴趣课没去,该课讲得是贪吃蛇,所以自己一直都想尝试去做下的,借这个寒假的机会,就自己学了,自己做的还是较为全面的,有登陆界面,可以选择游戏难度,游戏过程有背景音乐,死亡时也有特殊音乐

(一)制作游戏登陆界面

1.1添加游戏开始背景图

1.2设置开始与退出登陆

1.3添加游戏模式选择框

游戏效果图展示
用java做一个较为完整的贪吃蛇
游戏代码

package Snake;

import java.applet.AudioClip;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;


public class View{
	JFrame  frame=new  JFrame();
	ImageIcon  loginview=new ImageIcon("./src/Image/loginview.jpg");//登陆界面背景图
	JButton  ks_jb;
	JButton  tc_jb;
	Backimage  im=new  Backimage();
	Combobox combobox=new Combobox();//下拉列表框模型
	JComboBox<String>jc=new  JComboBox<>(combobox);//下拉列表框
	String  x="model";
	
	
	public  View(){
		
		    frame.setSize(406,329);
			//窗口可见
			frame.setVisible(true);
			//窗口关闭方式
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			//窗口不可改变
	 	    frame.setResizable(false);
	 	    //窗口放于中心
	 	    frame.setLocationRelativeTo(null);
	 	    
	 	    //设置字体,位置
	 	    ks_jb=new  JButton("开始");
	 	    tc_jb=new  JButton("退出");
	 	    ks_jb.setBounds(90,250,60,30);
	 	    ks_jb.setFont(Front.f1);
	 	    tc_jb.setBounds(260,250,60,30);
	 	    tc_jb.setFont(Front.f1);
	 	    jc.setBounds(170,250,70,30);
	 	    jc.setFont(Front.f1);
	 	   
	 	    
	 	    im.setBounds(0, 0, 406, 329);
	 	    frame.setLocationRelativeTo(null);
	 	    
	 	    frame.getContentPane().setLayout(null);
	 	    frame.getContentPane().add(ks_jb);
	 	    frame.getContentPane().add(tc_jb);
	 	    frame.getContentPane().add(jc);
	 	    frame.getContentPane().add(im);
	 	    
	 	    //增加选项监听器
	 	   jc.addItemListener(new Listener());
	 	   //增加动作监听器
	 	   ks_listener  ks_tin=new  ks_listener();
	 	   tc_listener  tc_tin=new  tc_listener();
	 	   
	 	   
	 	   ks_jb.addActionListener(ks_tin);
	 	   tc_jb.addActionListener(tc_tin);
	 	 
   		
            	
	}
	
	class Backimage extends JPanel
	{

		//要把图片画到JPanle,需要重写一个Paint方法
		public void paint(Graphics g) //
		{
			loginview.paintIcon(this, g, 0, 0);
		}
	}
	
	//下拉列表框模型
	class  Combobox  extends  AbstractListModel<String>implements  ComboBoxModel<String>{
        String  selecteditem=null;
        String[]test={"简单","困难","地狱"};
		@Override
		public int getSize() {
			// TODO Auto-generated method stub
			return test.length;
			}

		@Override
		public String getElementAt(int index) {
			// TODO Auto-generated method stub
			return test[index];
		}

		@Override
		public void setSelectedItem(Object anItem) {//返回选项的索引值
			// TODO Auto-generated method stub
			selecteditem=(String)anItem;
		}

		@Override
		public Object getSelectedItem() {//返回索引值对应的选项
			// TODO Auto-generated method stub
			return selecteditem;
		}
		
	}
	
	    public  class  Listener  implements  ItemListener{

			@Override
			public void itemStateChanged(ItemEvent e) {
				// TODO Auto-generated method stub
				if (e.getStateChange() == ItemEvent.SELECTED) {
                     x=combobox.getSelectedItem().toString();
                }

			}
	    	
	    }
	    
	   
		
	public  class  ks_listener  implements  ActionListener{
		 @Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				
				if(x.equals("model")){
					JOptionPane.showMessageDialog(frame,"请先选择游戏模式");
					}
				
				else  if(x.equals("简单")){
					System.out.println("简单");
					Snake  snake=new  Snake(200);
					frame.dispose();
				}
				else  if(x.equals("困难")){
					Snake  snake=new  Snake(50);
					frame.dispose();
				}
				else  if(x.equals("地狱")){
					Snake  snake=new  Snake(10);
					frame.dispose();
				}
		
	}
	}
	public  class  tc_listener  implements  ActionListener{
		 @Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);
				
		
	}
	}
	public  static  void  main(String[]  args){
		try {
            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } catch (Exception e) {
            e.printStackTrace();
        }
		 View  view=new  View();
	}
	
}

(二)制作游戏运行过程

2.1画出蛇的运行范围

2.2添加上部标题图

2.3设计蛇的移动

2.4利用计时器循环运行

2.5添加游戏背景音乐

效果图展示
用java做一个较为完整的贪吃蛇
用java做一个较为完整的贪吃蛇
游戏代码

package Snake;
import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;



public class Snake  implements KeyListener{
	
	JFrame  frame=new  JFrame("贪吃蛇");
	
	Drawpanel  panel=new  Drawpanel();
	
	//蛇的身体组成图及食物
	ImageIcon sup = new ImageIcon("./src/Image/up.png"); 
	ImageIcon sdown = new ImageIcon("./src/Image/down.png"); 
    ImageIcon sleft = new ImageIcon("./src/Image/left.png"); 
    ImageIcon sright = new ImageIcon("./src/Image/right.png");
	ImageIcon sfood = new ImageIcon("./src/Image/food.png");  
	ImageIcon sbody = new ImageIcon("./src/Image/body.png");  
    ImageIcon pan = new ImageIcon("./src/Image/pan.png"); 
    
    
    //用数组存储蛇的各个部位
    int[] snakex=new  int[100];
    int[] snakey=new  int[100];
    //随机生成食物位置
    Random  random=new  Random();
    int  foodx=random.nextInt(34)*25+25;
    int  foody=random.nextInt(24)*25+75;
    
    int  len;//身体长度
    int  score;//得分
    
    String  sdirection;//运动方向
    
    boolean  start;//开始标志
    boolean  end;//结束标志
    
    int i;
    
    
    Timer timer=new Timer();//计时器
    Smove  smove=new  Smove();//计时器运行的方法
    
    File file;//音频文件
	AudioClip audioclip;//播放
	URL  url;//转换成路径
    
	public  Snake(int  velocity){
		//增加键盘监听器
		frame.addKeyListener(this);
		
		initialization();
		
	    frame.setSize(911,700);
		//窗口可见
		frame.setVisible(true);
		//窗口关闭方式
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//窗口不可改变
 	   // frame.setResizable(false);
 	    //窗口放于中心
		panel.setBounds(0,0,911,700);
 	    frame.setLocationRelativeTo(null);
 	    frame.getContentPane().add(panel);
 	    timer.schedule(smove,0,velocity);//开始循环运行
 	    
 	    
 	  
 	   
 
	}
	//建立画板
	class  Drawpanel extends  JPanel{
		  
		//用画笔
		public  void  paint(Graphics  g){
			
			 g.fillRect(25, 75, 850, 650);//运行图
			 
			 //标题
			 pan.paintIcon(this, g, 25, 11);
			 //蛇头
	         if(sdirection.equals("u")){
	        	 sup.paintIcon(this, g, snakex[0], snakey[0]);
	         }
	         else if(sdirection.equals("d")){
	        	 sdown.paintIcon(this, g, snakex[0], snakey[0]);
	         }
	         else if(sdirection.equals("l")){
	        	 sleft.paintIcon(this, g, snakex[0], snakey[0]);
	         }
	         else if(sdirection.equals("r")){
	        	 sright.paintIcon(this, g, snakex[0], snakey[0]);
	         }
			//蛇身
	         for(i=1;i<len;i++)
	         {
	        	 sbody.paintIcon(this, g, snakex[i], snakey[i]);
	         }
	         //食物
	         sfood.paintIcon(this, g, foodx, foody);
	         
	         //长度以及得分
	         g.setColor(Color.BLACK);
	         g.setFont(new Font("arial",Font.PLAIN,15));
	         g.drawString("score : "+score, 650, 37);
	         g.drawString("len :"+len, 650, 57);
	         
	         
		}
	}
	
	//初始化
	 public  void   initialization(){
		 snakex[0]=100;
		 snakex[1]=75;
		 snakex[2]=50;
		 snakey[0]=100;
		 snakey[1]=100;
		 snakey[2]=100;
		 
		  score=0;
		  len=3;
		 
		 start=true;
		 end=false;
		 sdirection="r";
		 
		 //音频文件循环播放
		 file=new  File("./src/Music/musicview.wav");
	 	    try {
				url=file.toURI().toURL();
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	 	    audioclip=Applet.newAudioClip(url);
	 	    audioclip.loop();
	 }
	
	 class Smove extends TimerTask{  
	        @Override  
	        
	        public void run() {  
	        	//蛇身运动
	        	if(start==true&&end==false){
	        		for(i=len;i>0;i--){
	        			snakex[i]=snakex[i-1];
	        			snakey[i]=snakey[i-1];
	        		}
	        		//蛇头运动
	        	if(sdirection.equals("u")){
	        		snakey[0]=snakey[0]-25;
	        		if(snakey[0]<75)
	        		{
	        			snakey[0]=650;
	        		}
	        	}
	        	else if(sdirection.equals("d")){
	        		snakey[0]=snakey[0]+25;
	        		if(snakey[0]>650){
	        			snakey[0]=75;
	        		}
	        		
	        	}
	        	else if(sdirection.equals("l")){
	        		snakex[0]=snakex[0]-25;
	        		if(snakex[0]<25){
	        			snakex[0]=850;
	        		}
	        		
	        	}
	        	else if(sdirection.equals("r")){
	        		snakex[0]=snakex[0]+25;
	        		if(snakex[0]>850){
	        			snakex[0]=25;
	        		}
	        	}
	        	//吃掉食物
	        	if(snakex[0]==foodx&&snakey[0]==foody){
	        		score++;
	        		len++;
	        		foodx=random.nextInt(34)*25+25;
	        		foody=random.nextInt(24)*25+75;
	        	}
	        	//触碰自身时死亡,游戏结束
	        	for(i=1;i<len;i++){
	        		if(snakex[0]==snakex[i]&&snakey[0]==snakey[i]){
	        			end=true;
	        			audioclip.stop();
	        			file=new  File("./src/Music/musicend.wav");
	        	 	    try {
	        				url=file.toURI().toURL();
	        			} catch (MalformedURLException e) {
	        				// TODO Auto-generated catch block
	        				e.printStackTrace();
	        			}
	        	 	    audioclip=Applet.newAudioClip(url);
	        	 	    audioclip.play();
	        			int  n=JOptionPane.showConfirmDialog(null, "是否开始下一局游戏", "贪吃蛇",JOptionPane.YES_NO_OPTION);
	        			if(n==0){
	        				audioclip.stop();
	        				initialization();
	        			}
	        			if(n==1){
	        				
	        				frame.dispose();
	        				View  view=new  View();
	        			}
	        		}
	        	}
	        	
	        	panel.repaint();//重复画图
	        
	     	
	        }
	        	      	
	      }    
	    }  
	 @Override
		public void keyPressed(KeyEvent e) {
			// TODO Auto-generated method stub
	     if(e.getKeyCode()==KeyEvent.VK_SPACE){
				
			}
			else  if( e.getKeyCode()==KeyEvent.VK_UP&&sdirection!="d"){
				sdirection="u";
				
			}
			else  if( e.getKeyCode()==KeyEvent.VK_DOWN&&sdirection!="u"){
				sdirection="d";
				
			}
			else  if( e.getKeyCode()==KeyEvent.VK_LEFT&&sdirection!="r"){
				sdirection="l";
				
			}
			else  if( e.getKeyCode()==KeyEvent.VK_RIGHT&&sdirection!="l"){
				sdirection="r";
				
			}
			 
			
		}

	 @Override
		public void keyTyped(KeyEvent e) {
			// TODO Auto-generated method stub
		
		}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

}