java简易版贪吃蛇

第一次写博客,有点紧张,哈哈。我是在校大学生,计算机专业,喜欢敲代码·······话不多说,进入正题。
        个人对java还是比较感兴趣的,在学余之力,做了一个贪吃蛇小游戏,大家可以参考参考。由于学习java不久,该游戏还做的不是很完整,没有加入一个计分器,在后续有时间一定逐步完善这个小游戏,整合再发,希望大家支持。
 

package Game;

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JDialog;
import javax.swing.JFrame;


public class game01 extends JFrame{
	/**
	 * @诚哥
	 * 简单易懂的贪吃蛇
	 */
	
	//获得图片
	Image wall=GameUtil.getImage("images/墙.png");
	Image food=GameUtil.getImage("images/食物2.png");
    Image head=GameUtil.getImage("images/head.png");
	
    //这两个坐标为蛇运动的下一个坐标
    int X;
    int Y;
	
    //该参数为蛇是否死亡
    boolean life=true;
    
    //该参数在这里可暂时不用管
    boolean flag=true;
    
	//设置两个存储蛇的位置的容器
	ArrayList<Integer> listx=new ArrayList<>();
	ArrayList<Integer> listy=new ArrayList<>();
	
	//因为食物要随机出现,所以这里运用了随机类,以便产生随机数
	Random random=new Random();
	int foodx=random.nextInt(11);
	int foody=random.nextInt(11);
	
	//方向参数,0为上,1为下,2为左,3为右
	int direction=1;
	//该参数为蛇的长度,初始时为1
	int count=1;
	int score=0;

	//该函数主要运用于画图,即画背景和蛇身、食物
	public void paint(Graphics g) {

		//画背景和食物
		g.drawImage(wall,0,50,null);
		g.drawImage(food,foodx*50,(foody+1)*50,null);
		
		if(life) {
			if(direction==0) {
				//求出蛇要运动的下一个坐标
				X=listx.get(0);
				Y=listy.get(0)-50;
				//画蛇的下一个位置
				g.drawImage(head,X,Y,null);
				//如果蛇的下一个位置刚好有食物
				if(X==foodx*50&&Y==(foody+1)*50) {
					/*因为蛇吃到了食物,要增长一节,而前面已经画好了蛇的一节,所以这里只需再画蛇
					 * 吃到食物之前的全部蛇身即可
					 */
					for(int i=0;i<count;i++) {
						g.drawImage(head,listx.get(i),listy.get(i),null);
					}
					
					//由于蛇增长了一节,所以要把集合中的数据加1,以存储增长的那一节
					listx.add(count, 0);
					listy.add(count, 0);
					//将集合中的数据统一往后移一位,以便第一个位置可以存储增长那一节的坐标
					for(int i=count-1;i>=0;i--) {
						listx.set(i+1, listx.get(i));
						listy.set(i+1, listy.get(i));
					}
					//蛇身加1
					count++;
					//吃到食物之后,要再随机产生一个食物
					foodx=random.nextInt(11);
					foody=random.nextInt(11);
					//考虑到如果食物与蛇身重合,则重新产生一个食物
					while(listx.contains(foodx*50)&&listy.contains((foody+1)*50)) {
						foodx=random.nextInt(11);
						foody=random.nextInt(11);
					}
					//如果蛇的下一个位置没有食物
				}else {
					/*由于前面已经打印了蛇的下一步,并且这里蛇没有吃到食物,
					 * 蛇并没有增长,所以这里只需画蛇的前count-1节
					 */
					for(int i=0;i<count-1;i++) {
						g.drawImage(head,listx.get(i),listy.get(i),null);
					}
					//蛇是需要移动的,这里把蛇坐标的全部坐标整体往前移一位
					for(int i=count-2;i>=0;i--) {
						listx.set(i+1, listx.get(i));
						listy.set(i+1, listy.get(i));
					}
				}
				//无论蛇有没有吃到食物,都需要把储存蛇的坐标的集合更新,因为蛇在不断移动
				listx.set(0, X);
				listy.set(0, Y);
				
				//当蛇向下移动,道理是一样的
			}else if(direction==1) {
				X=listx.get(0);
				Y=listy.get(0)+50;
				g.drawImage(head,X,Y,null);
				//当下一步有食物
				if(X==foodx*50&&Y==(foody+1)*50) {
					for(int i=0;i<count;i++) {
						g.drawImage(head,listx.get(i),listy.get(i),null);
					}
					listx.add(count, 0);
					listy.add(count, 0);
					for(int i=count-1;i>=0;i--) {
						listx.set(i+1, listx.get(i));
						listy.set(i+1, listy.get(i));
					}
					count++;
					foodx=random.nextInt(11);
					foody=random.nextInt(11);
					while(listx.contains(foodx*50)&&listy.contains((foody+1)*50)) {
						foodx=random.nextInt(11);
						foody=random.nextInt(11);
					}
					//下一步没有食物
				}else {
					for(int i=0;i<count-1;i++) {
						g.drawImage(head,listx.get(i),listy.get(i),null);
					}
					for(int i=count-2;i>=0;i--) {
						listx.set(i+1, listx.get(i));
						listy.set(i+1, listy.get(i));
					}
				}
				listx.set(0, X);
				listy.set(0, Y);
				
				//当蛇向左移动
			}else if(direction==2) {
				X=listx.get(0)-50;
				Y=listy.get(0);
				g.drawImage(head,X,Y,null);
				//下一步有食物
				if(X==foodx*50&&Y==(foody+1)*50) {
					for(int i=0;i<count;i++) {
						g.drawImage(head,listx.get(i),listy.get(i),null);
					}
					listx.add(count, 0);
					listy.add(count, 0);
					for(int i=count-1;i>=0;i--) {
						listx.set(i+1, listx.get(i));
						listy.set(i+1, listy.get(i));
					}
					count++;
					foodx=random.nextInt(11);
					foody=random.nextInt(11);
					while(listx.contains(foodx*50)&&listy.contains((foody+1)*50)) {
						foodx=random.nextInt(11);
						foody=random.nextInt(11);
					}
					//下一步没有食物	
				}else {
					for(int i=0;i<count-1;i++) {
						g.drawImage(head,listx.get(i),listy.get(i),null);
					}
					for(int i=count-2;i>=0;i--) {
						listx.set(i+1, listx.get(i));
						listy.set(i+1, listy.get(i));
					}
				}
				listx.set(0, X);
				listy.set(0, Y);
				
				//当蛇向右移动时
			}else{
				X=listx.get(0)+50;
				Y=listy.get(0);
				g.drawImage(head,X,Y,null);
				//下一步有食物
				if(X==foodx*50&&Y==(foody+1)*50) {
					for(int i=0;i<count;i++) {
						g.drawImage(head,listx.get(i),listy.get(i),null);
					}
					listx.add(count, 0);
					listy.add(count, 0);
					for(int i=count-1;i>=0;i--) {
						listx.set(i+1, listx.get(i));
						listy.set(i+1, listy.get(i));
					}
					count++;
					foodx=random.nextInt(11);
					foody=random.nextInt(11);
					while(listx.contains(foodx*50)&&listy.contains((foody+1)*50)) {
						foodx=random.nextInt(11);
						foody=random.nextInt(11);
					}
					//下一步没有食物
				}else {
					for(int i=0;i<count-1;i++) {
						g.drawImage(head,listx.get(i),listy.get(i),null);
					}
					for(int i=count-2;i>=0;i--) {
						listx.set(i+1, listx.get(i));
						listy.set(i+1, listy.get(i));
					}
				}
				listx.set(0, X);
				listy.set(0, Y);
			}
		}
		
		
		//下面四个if判断语句判断游戏是否结束
		if(Y==50) {
			life=false;
			
			if(flag){
				//为了不一直打开对话框,这里设置了一个标志位,只打开一次对话框,下同
				flag=false;
				JDialog d=new JDialog(this,true);
				TextField f=new TextField();
				f.setEditable(false);
				f.setText("游戏结束");
				d.add(f);
				d.setLocation(150, 200);
				d.setSize(300, 100);
				d.setVisible(true);
			}
		}
		
		if(X==0) {
			life=false;
			if(flag){
				flag=false;
				JDialog d=new JDialog(this,true);
				TextField f=new TextField();
				f.setText("游戏结束");
				f.setEditable(false);
				d.add(f);
				d.setLocation(150, 200);
				d.setSize(300, 100);
				d.setVisible(true);
			}
		}
		
		if(Y==600) {
			life=false;
			if(flag){
				flag=false;
				JDialog d=new JDialog(this,true);
				TextField f=new TextField();
				f.setEditable(false);
				f.setText("游戏结束");
				d.add(f);
				d.setLocation(150, 200);
				d.setSize(300, 100);
				d.setVisible(true);
			}
		}
		
		if(X==550) {
			life=false;
			if(flag){
				flag=false;
				JDialog d=new JDialog(this,true);
				TextField f=new TextField();
				f.setEditable(false);
				f.setText("游戏结束");
				d.add(f);
				d.setLocation(150, 200);
				d.setSize(300, 100);
				d.setVisible(true);
			}
		}
		
	}
	
	//打印界面线程
	class PaintThread extends Thread{
		public void run() {
			while(true) {
				repaint();
				try {
					Thread.sleep(400);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	//键盘监听器
	class KeyThread implements KeyListener{
		
		public void keyTyped(KeyEvent e) {
		}

		//控制蛇运动的方向
		@Override
		public void keyPressed(KeyEvent e) {
			if(e.getKeyCode()==KeyEvent.VK_UP) {
				if(direction!=1) {
					direction=0;
				}
			}
			if(e.getKeyCode()==KeyEvent.VK_DOWN) {
				if(direction!=0) {
					direction=1;
				}
			}
			if(e.getKeyCode()==KeyEvent.VK_LEFT) {
				if(direction!=3){
					direction=2;
				}
			}
			if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
				if(direction!=2) {
					direction=3;
				}
			}
		}

		public void keyReleased(KeyEvent e) {
		}
	}
	
	public void CreatWindows() {
		this.setSize(1200, 800);	
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//初始化蛇身
		listx.add(250);
		listy.add(200);
		
		/**
		 *个人在这里觉得键盘监听类似一个线程,就不用增加线程,直接可以使用,JVM虚
		 *拟机会自动扫描键盘监听器。
		 */
		this.addKeyListener(new KeyThread());
		
		new PaintThread().start();
	}
	
	public static void main(String[] args) {
		game01 g1=new game01();
		g1.CreatWindows();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值