java swing版本 贪食蛇 小游戏

package test002;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
/*
 * 1--窗口+面板+固定
 * 2--在界面上画出蛇
 * 3--让蛇动起来
 * 4--让蛇听键盘的方向键指挥
 * 5--随机产生豆子并画在界面上
 * 6--指挥蛇吃到豆子并长长身体
 * 7--撞墙GAME OVER !
 * 8--咬到自己的尾巴 GAME OVER !
 * 9--修复BUG
 */
public class SnakeGame extends JFrame implements KeyListener{
	private static final long serialVersionUID = 1L;
	private int fw = 800 ;
	private int fh = 600 ;
	private SP sp = null ;
	private int sex = 200 ; //蛇关节元素属性
	private int sey = 200 ;
	private int sesize = 20  ;
	private SE se = null ;
	private Timer timer = new Timer();
	private LinkedList<SE> ses = new LinkedList<SE>();
	private String direction = "up" ; //蛇行走的方向
	private int bx ; //豆子属性
	private int by ;
	private int bsize = sesize  ;
	private Bean bean = null ;
	private Random rand = new Random();
	private boolean bean_is_eated = false ;
	public SnakeGame() {
		this.setAlwaysOnTop(true);
		this.setUndecorated(true);
		this.getContentPane().setBackground(Color.BLACK);
		this.setSize(800, 600);
		this.setLocationRelativeTo(null);
		sp = new SP();
		this.add(sp);
		this.setVisible(true);
		this.addKeyListener(this);
	}
	class SP extends JPanel{
		private static final long serialVersionUID = 1L;
		public SP() {
			this.setOpaque(false);
			this.getSE() ;  //调用创建蛇的方法
			this.getBean_not_on_snakebody() ;//调用创建豆子的方法
			timer.schedule(new TimerTask() {
				@Override
				public void run() {  //需要执行的任务
					if("up".equalsIgnoreCase(direction)){
						ses.removeLast() ; // 移除最后一个元素
						//在原来第一个元素的基础上 新增一个元素
						ses.addFirst(new SE(ses.getFirst().getSex(),ses.getFirst().getSey()-ses.getFirst().getSesize() , ses.getFirst().getSesize()));
						//在原来方向的基础上 尾部增长一个关节元素对象
						if(bean_is_eated){
							ses.addLast(new SE(ses.getLast().getSex(),ses.getLast().getSey()+ses.getLast().getSesize(),ses.getLast().getSesize()));
							bean_is_eated = false ;
						}
						//判断是否撞墙  撞墙  GAME OVER !
						if(ses.getFirst().getSey()<0){
							JOptionPane.showMessageDialog(sp, "GAME OVER !", "撞墙提示", JOptionPane.DEFAULT_OPTION);
							Runtime.getRuntime().exit(0);
						}
					}
					if("left".equalsIgnoreCase(direction)){
						ses.removeLast() ; // 移除最后一个元素
						//在原来第一个元素的基础上 新增一个元素
						ses.addFirst(new SE(ses.getFirst().getSex()-ses.getFirst().getSesize(),ses.getFirst().getSey() , ses.getFirst().getSesize()));
						//在原来方向的基础上 尾部增长一个关节元素对象
						if(bean_is_eated){
							ses.addLast(new SE(ses.getLast().getSex()+ses.getLast().getSesize(),ses.getLast().getSey(),ses.getLast().getSesize()));
							bean_is_eated = false ;
						}
						//判断是否撞墙  撞墙  GAME OVER !
						if(ses.getFirst().getSex()<0){
							JOptionPane.showMessageDialog(sp, "GAME OVER !", "撞墙提示", JOptionPane.DEFAULT_OPTION);
							Runtime.getRuntime().exit(0);
						}
					}
					if("down".equalsIgnoreCase(direction)){
						ses.removeLast() ; // 移除最后一个元素
						//在原来第一个元素的基础上 新增一个元素
						ses.addFirst(new SE(ses.getFirst().getSex(),ses.getFirst().getSey()+ses.getFirst().getSesize() , ses.getFirst().getSesize()));
						//在原来方向的基础上 尾部增长一个关节元素对象
						if(bean_is_eated){
							ses.addLast(new SE(ses.getLast().getSex(),ses.getLast().getSey()-ses.getLast().getSesize(),ses.getLast().getSesize()));
							bean_is_eated = false ;
						}
						//判断是否撞墙  撞墙  GAME OVER !
						if(ses.getFirst().getSey()+sesize>fh){
							JOptionPane.showMessageDialog(sp, "GAME OVER !", "撞墙提示", JOptionPane.DEFAULT_OPTION);
							Runtime.getRuntime().exit(0);
						}
					}
					if("right".equalsIgnoreCase(direction)){
						ses.removeLast() ; // 移除最后一个元素
						//在原来第一个元素的基础上 新增一个元素
						ses.addFirst(new SE(ses.getFirst().getSex()+ses.getFirst().getSesize(),ses.getFirst().getSey() , ses.getFirst().getSesize()));
						//在原来方向的基础上 尾部增长一个关节元素对象
						if(bean_is_eated){
							ses.addLast(new SE(ses.getLast().getSex()-ses.getLast().getSesize(),ses.getLast().getSey(),ses.getLast().getSesize()));
							bean_is_eated = false ;
						}
						//判断是否撞墙  撞墙  GAME OVER !
						if(ses.getFirst().getSex()+sesize>fw){
							JOptionPane.showMessageDialog(sp, "GAME OVER !", "撞墙提示", JOptionPane.DEFAULT_OPTION);
							Runtime.getRuntime().exit(0);
						}
					}
					//蛇咬到自己身体的判断
					for (int i = 1; i < ses.size(); i++) {
						if(ses.getFirst().getSex()==ses.get(i).getSex() && ses.getFirst().getSey()==ses.get(i).getSey()){
							JOptionPane.showMessageDialog(sp, "你是猪啊,咬到自己身体啦!", "自残了,兄弟!", JOptionPane.DEFAULT_OPTION);
							Runtime.getRuntime().exit(0);
						}
					}
					sp.eatBean();  //调用吃豆子的方法
					sp.repaint() ;
				}
			} , 0 , 200 );
		}
		@Override
		public void paint(Graphics g) {
			for (int i = 0; i < ses.size(); i++) {
				//画出豆子
				g.setColor(Color.WHITE);
				g.fill3DRect(bean.getBx(), bean.getBy(), bean.getBsize(), bean.getBsize(), true);

				//画出蛇
				if(i==0){
					g.setColor(Color.RED);
				}else{
					g.setColor(Color.GREEN);
				}
				g.fill3DRect(ses.get(i).getSex(), ses.get(i).getSey(), ses.get(i).getSesize(), ses.get(i).getSesize(), true);

			}
		}
		public void eatBean(){
			//豆子被到了    //蛇的头部坐标和豆子的坐标重合
			if(ses.getFirst().getSex()==bean.getBx() && ses.getFirst().getSey()==bean.getBy()){
				bean = new Bean() ;
				sp.getBean_not_on_snakebody() ;
				bean_is_eated = true ;
			}
		}
		public void getBean_not_on_snakebody(){
			this.getBean() ;
//			* 豆子不能出现在蛇的身体上   用 bx 、by 同时和蛇的身体每一个元素进行比较 保证没有全等
			for (int i = 0; i < ses.size(); i++) {
				if(ses.get(i).getSex() == bean.getBx() && ses.get(i).getSey() == bean.getBy()){
					this.getBean() ;
				}
			}
		}
		public void getBean(){
//				 * 不能出现在右边的边界上    bx != fw
//				 * 豆子的x坐标必须能够整除(余数为0 )蛇身体元素的尺寸    bx %  sesize  == 0
				while(true){
					bx = rand.nextInt(fw);
					System.out.println(bx);
					if(bx != fw && bx%sesize==0){
						break ;
					}
				}
//				 * 不能出现在下边的边界上    by != fh
//				 * 豆子的y坐标必须能够整除(余数为0) 蛇身体元素的尺寸   by %  sesize  == 0
				for(;;){
					by = rand.nextInt(fh);
					if(by != fh && by%sesize==0){
						break ;
					}
				}
			bean = new Bean(bx, by, bsize);
			System.out.println(bean);
		}
		public void getOneSEData(){ //获取一个蛇关节元素的数据
		}
		public void getSE(){//获取一个蛇关节对象
			for (int i = 0; i < 4; i++) {
				se = new SE(sex, sey+sesize*i, sesize) ;
				ses.add(se);
			}
		}
		public void getSnake(){ //获取一整条蛇
		}
	}
	@Override
	public void keyPressed(KeyEvent e) {
		//方向 不能改变为相反的方向  例如:left  不能  修改为 right
		if(e.getKeyCode()==KeyEvent.VK_LEFT && !"right".equalsIgnoreCase(direction)){
			direction = "left" ;
		}
		if(e.getKeyCode()==KeyEvent.VK_DOWN && !"up".equalsIgnoreCase(direction)){
			direction = "down" ;
		}
		if(e.getKeyCode()==KeyEvent.VK_RIGHT && !"left".equalsIgnoreCase(direction)){
			direction = "right" ;
		}
		if(e.getKeyCode()==KeyEvent.VK_UP && !"down".equalsIgnoreCase(direction)){
			direction = "up" ;
		}
		if(e.getKeyCode()==32){
			Runtime.getRuntime().exit(0);
		}
	}
	public static void main(String[] args) {
		new SnakeGame();
	}

	@Override
	public void keyTyped(KeyEvent e) {
	}
	@Override
	public void keyReleased(KeyEvent e) {
	}
}
class SE implements Serializable{

	/**
	 * 蛇的关节对象
	 */
	private static final long serialVersionUID = 1L;
	private int sex ;
	private int sey ;
	private int sesize ;
	public SE() {
		super();
		// TODO Auto-generated constructor stub
	}
	public SE(int sex, int sey, int sesize) {
		super();
		this.sex = sex;
		this.sey = sey;
		this.sesize = sesize;
	}
	public int getSex() {
		return sex;
	}
	public void setSex(int sex) {
		this.sex = sex;
	}
	public int getSey() {
		return sey;
	}
	public void setSey(int sey) {
		this.sey = sey;
	}
	public int getSesize() {
		return sesize;
	}
	public void setSesize(int sesize) {
		this.sesize = sesize;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + sesize;
		result = prime * result + sex;
		result = prime * result + sey;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		SE other = (SE) obj;
		if (sesize != other.sesize)
			return false;
		if (sex != other.sex)
			return false;
		if (sey != other.sey)
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "SE [sesize=" + sesize + ", sex=" + sex + ", sey=" + sey + "]";
	}

}
class Bean implements Serializable {
	/**
	 * 豆子对象
	 */
	private static final long serialVersionUID = 1L;
	private int bx ;
	private int by ;
	private int bsize ;
	public Bean() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Bean(int bx, int by, int bsize) {
		super();
		this.bx = bx;
		this.by = by;
		this.bsize = bsize;
	}
	public int getBx() {
		return bx;
	}
	public void setBx(int bx) {
		this.bx = bx;
	}
	public int getBy() {
		return by;
	}
	public void setBy(int by) {
		this.by = by;
	}
	public int getBsize() {
		return bsize;
	}
	public void setBsize(int bsize) {
		this.bsize = bsize;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + bsize;
		result = prime * result + bx;
		result = prime * result + by;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Bean other = (Bean) obj;
		if (bsize != other.bsize)
			return false;
		if (bx != other.bx)
			return false;
		if (by != other.by)
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "Bean [bsize=" + bsize + ", bx=" + bx + ", by=" + by + "]";
	}
}

时间: 2024-10-19 04:44:21

java swing版本 贪食蛇 小游戏的相关文章

Javascript贪食蛇小游戏

试玩:http://hovertree.com/game/9/ 贪吃蛇是一种风靡全球的小游戏,就是一条小蛇,不停地在屏幕上游走,吃各个方向出现的蛋,越吃越长.只要蛇头碰到屏幕四周,或者碰到自己的身子,小蛇就立即毙命.和别的游戏不同,贪食蛇是一个悲剧性的游戏.许多电子游戏都是打通关到底,游戏操作者以胜利而告终.而贪食蛇的结局却是死亡.“贪食蛇”,要命的就在一个“贪”字上.所以,有时候真的需要及时收手,不要逼人太甚.如果没有余地,就算你的手再快,面临的结局也是——崩盘. HTML代码如下: <!DO

java swing版本打飞机源码

原文:java swing版本打飞机源码 源代码下载地址:http://www.zuidaima.com/share/1553224165755904.htm 运行效果图

java 第61节 石头剪刀布小游戏

2016-07-02 package com.java1995; public class Player { // 封装 private String name;// 玩家姓名 private int score;// 积分 // 构造器 public Player(String name, int score) { super(); this.name = name; this.score = score; } // 实现封装 public String getName() { return

【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一)

先扯几句闲话 往往非科班出身的编程爱好者,以C作为入门语言时,往往会问:“我学了这个XX,能做些什么?” 其实,配合Google,基本上啥都能做了. 你甚至连链表都不需要,就可以写一个贪食蛇小游戏 :) 本系列将分4个部分,让任何一个仅仅会二维数组合结构体的初学者写出自己的贪食蛇 进入正题.我们先分析一下问题,确定下四个部分. 0.分析游戏的本质以及在控制台中的表现形式 1.分析贪食蛇游戏的基本结构 2.确定实现方案 3.全部源代码 一.游戏,或者视频游戏的本质是什么? 0.游戏的本质是程序 对

Java Swing打猎射击游戏编程代码下载

代码下载地址:http://www.zuidaima.com/share/1858069987494912.htm 原文:Java Swing打猎射击游戏编程代码下载 这是一款java swing编写的打猎射击游戏,从这款游戏的编程中,我们可以练习如何进行射击对象的消失及相关按键的监听. 该游戏的一大亮点还是对运动图片的二级缓冲功能,运行时可以感受到非常的流畅,对于想从事游戏编程的人员来说是必须要掌握的一个技能点. 游戏操作:通过鼠标点击野猪和小鸟来是实现击中功能,子弹不足时提示"装载子弹...

Egret5.2.2 微信小游戏行的示例排行榜

Egret5.2.2版本发布微信小游戏后,在开放数据域有一个默认排行榜.这个文件夹代码+图大小就22kb. 排行榜的效果就是示范用的,很丑...带翻页. 代码如下,基本就是使用canvas渲染了一个排行榜. 好处是不需要额外新建另一个Egret项目来实现排行榜,减小了代码体积. 坏处是canvas手动绘制排行榜,没有egret的eui可视化编辑,非常的不方便. 代码很长,慢慢看.... /** * 微信开放数据域 * 使用 Canvas2DAPI 在 SharedCanvas 渲染一个排行榜,

使用Laya引擎开发微信小游戏(上)

本文由云+社区发表 使用一个简单的游戏开发示例,由浅入深,介绍了如何用Laya引擎开发微信小游戏. 作者:马晓东,腾讯前端高级工程师. 微信小游戏的推出也快一年时间了,在IEG的游戏运营活动中,也出现了越来越多的以小游戏作为载体运营的活动类型,比如游戏预约,抢先试完等等,都收到了非常良好的效果. 在支持微信小游戏的游戏引擎中,Cocos,Egret,Laya都对小游戏的开发提供了很多强大的支持.前段时间正好抽空研究了一下这块的内容,现做一个总结,针对如何使用Laya引擎开发微信小游戏给大家做一下

java swing开发打飞机的小游戏源代码下载

原文:java swing开发打飞机的小游戏源代码下载 源代码下载地址:http://www.zuidaima.com/share/1550463716084736.htm 这是我为了熟悉java设计模式而练习的代码.其中肯定有很多不足的地方.希望各位牛人们 能多多指点.谢谢

java swing开发短小精悍的俄罗斯方块小游戏源代码下载,仅300行代码

原文:java swing开发短小精悍的俄罗斯方块小游戏源代码下载,仅300行代码 源代码下载地址:http://www.zuidaima.com/share/1550463495146496.htm java swing开发短小精悍的俄罗斯方块小游戏源代码下载,仅300行代码, 很久以前找到的一个Swing实现的俄罗斯方块,短线精悍,算法值得一看 经验证代码可用,确实短小精悍,值得下载. package com.zuidaima.swing.game; import java.awt.*; i