利用java编写的精灵吃豆的游戏

学完线程的时候做了一个精灵吃豆的小游戏。

窗体类:

package www.csdn.net.zuoye;

//用窗体实现精灵吃豆子的小游戏
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class GameJFrame extends JFrame implements KeyListener {
	// 定义起始位置
	private int x = 30, y = 30;
	// 定义中间变量
	private boolean flag = true;
	private static final int DIR_UP = 1;
	private static final int DIR_DOWN = 2;
	private static final int DIR_LEFT = 3;
	private static final int DIR_RIGHT = 4;

	// 定义初始化弧度
	private int arc1 = 20;
	private int arc2 = 320;
	// 定义计数器(通过计数器让上下两张嘴都动起来)
	private int count = 0;
	// 定义豆的对象
	private Bean bean;
	// 定义方向
	private int dir = -1;
	// 生成随机数
	private Random random;
	//定义分数
	private int score=0;
	//定义速度
	private int k=100;
	public GameJFrame() {
		this.setBounds(300, 200, 200, 300);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationRelativeTo(null);
		this.setResizable(false);
		/*
		 * 1.this.setBackground(Color.gray);
		 * this.getContentPane().setVisible(false);
		 */
		this.getContentPane().setBackground(Color.pink);
		new Thread() {
			public void run() {
				while (flag) {
					try {
						boolean temp = checkHit();
						if (temp) {
							initBean();
							score++;
							if(score%10==0){
								k-=5;
							}
						}
						Thread.sleep(k);
						count++;
						if (count % 2 == 0) {// 嘴张开以及闭住的情况
							arc1 = 40;
							arc2 = 280;
						} else {
							arc1 = 20;
							arc2 = 320;
						}
						switch (dir) {
						case DIR_UP:
							y -= 5;
							break;
						case DIR_DOWN:
							y += 5;
							break;
						case DIR_LEFT:
							x -= 5;
							break;
						case DIR_RIGHT:
							x += 5;
							break;
						default:
							break;
						}
						repaint();
						if (y > 275 || y < 30) {
							flag = false;
							JOptionPane.showMessageDialog(null, "游戏结束,你的分数为:"+score);
							dispose();
						}else if(x>176||x==0){
							flag=false;
							JOptionPane.showMessageDialog(null, "游戏结束,你的分数为:"+score);
							dispose();
						}
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}.start();

		// 添加监听
		this.addKeyListener(this);

		// 创建随机的对象
		random = new Random();
		initBean();
	}

	public void initBean() {
		// 随机产生坐标
		int rx = random.nextInt(5)+10;
		int ry = random.nextInt(15)+7;
		// 产生豆
		bean = new Bean(rx * Bean.r * 2, ry * Bean.r * 2);// 坐标必须是随机产生的
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		g.setColor(Color.red);// 设置绘制的颜色

		switch (dir) {
		case DIR_UP:
			g.fillArc(x, y, 20, 20, arc1 + 90, arc2);
			break;
		case DIR_DOWN:
			g.fillArc(x, y, 20, 20, arc1 + 270, arc2);
			break;
		case DIR_LEFT:
			g.fillArc(x, y, 20, 20, arc1 + 180, arc2);
			break;
		case DIR_RIGHT:
			g.fillArc(x, y, 20, 20, arc1, arc2);
			break;
		default:// 为了能够显示,需要有个显示的状态
			g.fillArc(x, y, 20, 20, arc1, arc2);
		}

		// 绘制豆
		g.setColor(Color.yellow);
		g.fillArc(bean.getX(), bean.getY(), Bean.r * 2, Bean.r * 2, 0, 360);
		// g.fillArc(x, y, 20, 20, arc1, arc2);//圆形
		// g.fillRect(50, 30, 20, 20);//矩形
	}

	public static void main(String[] args) {
		GameJFrame g = new GameJFrame();
		g.setVisible(true);
	}

	/**
	 * 输入某个键的时候执行
	 */
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		System.out.println("键入");
	}

	/**
	 * 按下的时候执行
	 */
	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		// System.out.println("按键");
		// 获取按键的值
		int key = e.getKeyCode();// 查询键值(用这个方法给上下左右键加事件)
		// 根据上下左右箭头改变方法
		switch (key) {
		case 38:
			dir = DIR_UP;
			break;
		case 40:
			dir = DIR_DOWN;
			break;
		case 37:
			dir = DIR_LEFT;
			break;
		case 39:
			dir = DIR_RIGHT;
			break;
		default:
			break;
		}
	}

	/**
	 * 抬起的时候执行
	 */
	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		// System.out.println("抬起");
	}

	// 定义碰撞检测
	public boolean checkHit() {
		if (bean != null) {
			if (bean.getX() == x) {
				if (Math.abs(bean.getY() - y) < 13) {
					return true;// 被碰到了
				}
			}
			if (bean.getY() == y) {
				if (Math.abs(bean.getX() - x) < 13) {
					return true;
				}
			}
		}
		return false;
	}
}


豆子类:

package www.csdn.net.zuoye;

//绘制豆
public class Bean {
	// 坐标
	private int x, y;
	// 豆的半径
	public static int r=5;
	public int getX() {//获取横坐标
		return x;
	}
	public int getY() {//获取纵坐标
		return y;
	}
	public Bean(int x, int y) {
		this.x = x;
		this.y = y;
	}
}

效果:



 

吃豆豆 一、 背景描述 在完成面向对象、Swing、线程的课程后,可以开始练习本项目的部署安排。安排本练习的主要目的理解面向对象、能够用面向对象的思路去思考问题,结合Swing和现成的知识完成本项目。 二、 实现要求 使用面向对象的方式,完成本项目。 三、 实现技术 a) 熟练使用if、for等语句进行逻辑操作。 b) 分析数据的属性和方法,能够熟练地写出该数据表示的类。 c) 使用JFrame创建一个窗体。 d) 掌握ActionListener等事件的注册、添加、操作等。 e) 使用Grahpics能够绘制一般的图形、根据需要定制自己需要的复杂图形。 四、 类图 a) 类图 b) 类图说明 类名称 BigMouthFishFrame 类描述 大嘴鱼界面类。完成大嘴鱼的界面的绘制。该类继承JFrame。 包描述 main 函数描述 public static void main(String[] args) 程序的主函数。 BigMouthFishFrame() 构造函数。构造大嘴鱼界面。 类名称 BigMouthFish 类描述 大嘴鱼类。此类继承AcitonListener,实现AcitonPerformed方法,练习ActionListener的另一种实现方法。此类还练习定时器Timer的使用。此类还练习图形类Graphics的使用。 包描述 fish 函数描述 public BigMouthFish() 大嘴鱼缺省构造函数.创建一个位置为(200,200),大小为50,方向为右,颜色为Color.CYAN,速度为10的大嘴鱼 public BigMouthFish(int posx,int posy,int size,int direction,Color color,int speed) 根据位置、大小、方向、颜色、速度构造一个大嘴鱼。 public void move() 大嘴鱼移动。根据鱼的方向移动鱼。 public void changeColor(Color color) 改变大嘴鱼身体的颜色。 public void changeDir(int direction) 改变大嘴鱼的方向 public void paint(Graphics g) 使用画笔绘画大嘴鱼.大嘴鱼的头像:一个扇形的是鱼脸,上面有一个小圆是眼睛1.保存画笔颜色、2.绘制大嘴鱼的脸、3.绘制大嘴鱼的眼睛、4.恢复画笔颜色 类名称 FishPool 类描述 鱼池类。大鱼和小鱼放到此鱼池中,当大嘴鱼每10条小鱼的时候,鱼的size加1,速度加2。每条小鱼默认存在的时间是15秒钟。10秒后自动消失。此类练习if、for、Timer、内部类等的使用。更重要的是,希望学员做这个的游戏时候能做好严谨的逻辑考虑后,再动手。难点:大嘴鱼在鱼池边界的处理、大嘴鱼升级时的相关问题的处理。 包描述 fish 函数描述 FishPool() 鱼池的缺省构造函数。此处需要完成上下左右键的注册功能。 private void initFishBean() 初始化小鱼。保证小鱼生成的位置与大嘴鱼的位置不重叠。 private void beanNewPos() 小鱼重新生成新位置。保证小鱼生成的位置与大嘴鱼的位置不重叠。 public void paint(Graphics g) 覆盖JLabel的paint事件。 private void bigFishMove(int direction) 大嘴鱼的移动。根据大嘴鱼嘴的方向,判断其是否到了鱼池边界(此处为难点)。 private boolean isTouched() 检测大嘴鱼是否到了小鱼。 内部类 private class RightListenerImpl extends AbstractAction 内部类 - 向右按键事件。 private class DownListenerImpl extends AbstractAction 内部类 - 向下按键事件。 private class DownListenerImpl extends AbstractAction 内部类 - 向下按键事件。 private class LeftListenerImpl extends AbstractAction 内部类 - 向左按键事件。 private class TimerListenerImpl implements ActionListener 内部类 - 图形重回事件。 类名称 FishBean 类描述 类 包描述 fish 函数描述 public FishBean() 缺省构造函数。按位置(190,190),大小10,颜色Color.MAGENTA构造一
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值