项目介绍
程序目标描述(即开发的目的):
1.掌握使用标识符、数据类型、表达式、if、return、for、复合语句。
2.了解面向对象的使用。包括(封装、继承、多态)基本特征。
3.记住一些固定语句固定用法。
程序用途描述(即希望具备功能):
1.能实现图形化界面。2.能实现图片的加载。
3.能实现图片的移动。
问题来源与资料采集(构思的来源与引用的代码或思想及其来源,请以哈佛引用格式附参考文献):
1.思想来源于IG夺冠现场,思聪大口吃热狗,然后就出现了各种p图表情包(来源于表情包)。2.代码来源于网上看视频学习。
设计方案
设计基本思想:
1.构造窗体。2.背景图片添加到窗体中。3.把游戏图片画上去。
4.是图片从上向下进行移动。5.把图片出入集合中。6.图片相撞清除集合中的图片。7.绑定鼠标监听事件。
程序实现代码
package noom.ml.yu;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.TimerTask;
public class DogGame extends JPanel implements Runnable,MouseMotionListener {
private Wsc wsc = new Wsc();
private List<HotDog> list = new ArrayList<>();
int sum = 0;
public DogGame(){
Icon icon = new ImageIcon(DogGame.class.getResource("/Beijing.jpg"));
JLabel label = new JLabel(icon);
this.add(label);
}
// 采用定时器的方式,创建很多的热狗对象,存入到list集合中
// 使用Java的定时器的API,定时器每隔1秒钟执行一次方法
public void createHotDogs() {
TimerTask timerTask = new TimerTask() {
public void run() {
HotDog dog = new HotDog(list);
}
};
java.util.Timer timer = new java.util.Timer();
timer.schedule(timerTask,0,1000);
}
// 重写面板的绘图方法
public void paint(Graphics g) {
super.paint(g);
g.drawImage(wsc.getImage(),wsc.getX(),wsc.getY(),null);
for (int i = 0; i < list.size(); i++) {
HotDog hotDog = list.get(i);
hotDog.move();
int n = hotDog.clear(wsc);
sum += n;
g.drawImage(hotDog.getImage(),hotDog.getX(),hotDog.getY(),null);
}
g.setColor(Color.yellow);
g.setFont(new Font("宋体",Font.BOLD,20));
g.drawString("您现在已经吃了"+sum+"个热狗",20,30);
if(sum>=4){
g.drawString("真香(热狗就是好吃)!",250,30);
}
}
// 线程run方法
public void run() {
while(true){
this.repaint();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
int x = e.getX();
wsc.setX(x);
}
// 主函数,运行主函数开始游戏
public static void main(String[] args) {
JFrame frame = new JFrame("吃热狗游戏");
frame.setSize(489,650);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
DogGame dogGame = new DogGame();
frame.add(dogGame);
dogGame.createHotDogs();
dogGame.repaint();
new Thread(dogGame).start();
dogGame.addMouseMotionListener(dogGame);
frame.setVisible(true);
}
}
package qimozuoye;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.List;
import java.util.Random;
public class HotDog {
private int x;
private int y;
private BufferedImage image;
private Random random = new Random();
private List<HotDog> list;
// 热狗随机出现的位置
public HotDog(List<HotDog> list){
try {
image = ImageIO.read(HotDog.class.getResource("/HotDog.png"));
this.list = list;
y = 0;
x = random.nextInt(400);
this.list.add(this);
} catch (IOException e) {
e.printStackTrace();
}
}
public void move(){
y += 10;
if(y >= 600){
this.list.remove(this);
}
}
// 吃热狗碰撞,消除数据
// 返回消除的数量
public int clear(Wsc wsc){
int dogx2 = x;
int dogx3 = dogx2+66;
int dogy = y;
int dogy2 = dogy+102;
int wscx = wsc.getX();
int wscx2 = wscx+30;
int wscx3 = wscx + 80;
int wscy = wsc.getY();
int flagx2 = dogx2 - wscx2;
int flagx3 = dogx3 - wscx3;
int flagy = dogy2 - wscy;
if(flagx2 > -20 && flagx3 < 20 && flagy > 20 && flagy < 40){
boolean remove = this.list.remove(this);
if(remove){
return 1;
}
}
return 0;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public BufferedImage getImage() {
return image;
}
public void setImage(BufferedImage image) {
this.image = image;
}
}
package qimozuoye;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
public class Wsc{
private int x;
private int y;
private BufferedImage image;
public Wsc() {
try {
x = 180;
y = 500;
image = ImageIO.read(Wsc.class.getResource("/Wsc.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public BufferedImage getImage() {
return image;
}
public void setImage(BufferedImage image) {
this.image = image;
}
}
描述:生成多个热狗从上向下(热狗x不变,y增大)用鼠标移动思聪吃热狗。
分析与结论(开发过程中的问题):
1.窗口大小需要反复调整未达到最佳效果。
2.程序未能读取图片。
3.程序的复杂代码难理解。
4.类、对象、方法、属性易混淆。
5.敲代码慢且容易出错。
6.出错难以解决。
7.版本不同导致异常。
8.图片实现不了移动。
9.窗口文字需要反复调整。
总结与改进(总结与对改进工作的初步构想):
总结:1.通过以往对Java的学习和认识,以为只能实现底层开发(如:DOS)不能实现图形化。2.通过这次实践唤起了对Java的热爱。3.Java并不是很难着手,只要上课认真听老师细心讲解。加上部分类或对象的直接拖动,集成开发环境强大功能 。学习起来还是很容易上手的。
改进:1.代码格式不规范。2.能实现用键盘来控制主图片的移动。3.能实现背景图片的移动。4.能实现背景音乐。