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

窗体类:

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;

}

}

效果:

java吃豆游戏_利用java编写的精灵吃豆的游戏相关推荐

  1. java mysql jdbc 封装_利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包括增删改查、JavaBean反射原理,附源代码)...

    近期看老罗的视频,跟着完毕了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完毕对数据库的增删改查.当中查询这块,包含普通的查询和利用反射完毕的查询,主要包含以下几个函数接口 ...

  2. java界面设计股票_利用JAVA实现股票交易系统设计参考.doc

    利用JAVA实现股票交易系统设计参考 目 录 摘要1 关键词1 Abstract2 Key words2 1 概述3 1.1 Java体系结构3 1.2 Java的优点3 1.3 Java的应用3 2 ...

  3. java 获取文件名长度_利用Java文件类File的方法,获取磁盘文件的文件名、长度、大小等特性...

    利用Java文件类File的方法,获取磁盘文件的文件名.长度.大小等特性. 如题,大神们谁可以编写一个这样的java程序?     happy530755 | 浏览 1482 次 |举报 我 ...

  4. java 对象复制 反射_利用Java反射机制实现对象相同字段的复制操作

    一.如何实现不同类型对象之间的复制问题? 1.为什么会有这个问题? 近来在进行一个项目开发的时候,为了隐藏后端数据库表结构.同时也为了配合给前端一个更友好的API接口文档(swagger API文档) ...

  5. java calendar日期计算_利用Java中Calendar计算两个日期之间的天数和周数

    前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每 ...

  6. java 方法数统计_利用Java简单实现一个代码行数统计器方法实例

    前言 哈喽,我是小黑, 最近学了java的输入输出流后一直心痒痒,总想找一点事情来做,所以用java代码来实现了一下统计代码的所有行数,看一下我上大学以来到底打了多少行. 先附上实现代码吧! pack ...

  7. java日期相差周_利用Java中Calendar计算两个日期之间的天数和周数

    前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每 ...

  8. java 生成pdf 乱码_利用java处理fop导出pdf的中文乱码问题解决方案

    本文的作用是,生成带中文的加密pdf格式的文件,防止被人修改. 在项目下建立docbook-xsl, fo-res, out, sample四个文件夹 docbook-xsl目录: 放从sourcef ...

  9. python抽奖游戏_利用Python写一个抽奖程序,解密游戏内抽奖的秘密

    原标题:利用Python写一个抽奖程序,解密游戏内抽奖的秘密 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客 ...

最新文章

  1. 不知道发这些有啥用!多分享些技术噻...
  2. 百度网络推广介绍网站在更换老域名时都需注意哪些?
  3. Matlab保存为unv,matlab之图像处理(2)
  4. 决策类AI成最具商业价值应用产品 第四范式入选Gartner中国5大代表厂商
  5. 前端学习(1944)vue之电商管理系统电商系统之绘制分类组件的基本结构
  6. mysql视图中调用函数写法_从视图中调用函数
  7. ARMA模型性质之平稳AR模型得统计性质
  8. ubuntu16.04源码安装opencv3.4.0
  9. Malta中any函数
  10. 【项目.源码】深度学习实现任意风格任意内容的极速风格迁移
  11. 【成功解决】Error:(3, 46) java: 程序包org.springframework.context.annotation不存在
  12. 自媒体文章采集工具,采集多个平台的文章
  13. python 主函数传参_Python函数传参详解
  14. scapy(二):基于流量分析的SQL注入检测
  15. 如何进入DOS系统及常用DOS命令总结
  16. 职称论文通过查重之后就能发表吗?
  17. oracle制造分销模块,oracle ebs表结构及功能总结(财务,制造,分销模块)
  18. 激光雷达是什么?为什么移动机器人必不可少?
  19. 前端之JS篇(二)——数据类型基础概念
  20. 小程序根据国外经纬度显示地图

热门文章

  1. 现存问题以及解决方案:在ASP.NET AJAX中从客户端向服务器端传送DataTable
  2. Celery中文翻译-Application
  3. android -------- NDK 入门指南
  4. 云计算市场竞争激烈 亚马逊微软IBM阿里业绩亮眼
  5. Vcenter5.5安装部署:[2]web client的安装
  6. OS X快捷键小技巧
  7. 浅析堡垒机概念及工作原理(转)
  8. NFV节省企业宽带成本—Vecloud微云
  9. 达梦数据库查看当前执行的查询并杀死session
  10. RHEL7.2上基于eSpeak实现TTS