制作人:尹子杰,朱健钊
项目简介:
团队选择任务为小游戏,选择具体游戏为飞机大战,不仅是因为编写出游戏有一定的挑战性和难度,是对我们本学期java学习的检测,更能通过本次代码编写找到自身更多不足之处,也让我们更加了解了我们所学的知识点的应用。我们通过努力完成了这个项目,其中不足的地方也请老师指出我们改正。
项目关键技术:
java变量、java数据类型、判断语句、循环结构、数组、Java集合、简单窗口创建、图形图片绘制、双缓存技术、事件-鼠标和键盘事件、awt抽象窗口工具包、部分复杂算法、大部分注释、GUI界面、面向对象程序设计、线程等
开发工具:idea
开发环境:jdk11
项目需求分析:
1.方法简单,游戏方式简单,更容易上手游玩。
2.能够方便操作,可以用鼠标灵活操作。
功能演示截图
任务分配
位置姓名 | 任务分配 |
组长:朱健钊 | 完成大体的布置,检查、修改共同完成各模块内容最后整合一起 |
组员:尹子杰 | 图片的查找,模块内容的细分以及具体处理 |
git项目提交地址:untitle: 雷霆战机java课程设计——朱健钊,尹子杰 (gitee.com)
git提交截图:
代码部分:
Bomb
package game; import java.awt.Graphics; import java.awt.image.ImageObserver; import javax.swing.ImageIcon; public class Bomb { private int x; private int y; private int height; private int width; private ImageIcon imageIcon = new ImageIcon("img/bomb.png"); private int flag; public Bomb(int x, int y) { this.x = x; this.y = y; this.height = this.imageIcon.getIconHeight(); this.width = this.imageIcon.getIconWidth(); } public int getX() { return this.x; } public void setX(int x) { this.x = x; } public int getY() { return this.y; } public void setY(int y) { this.y = y; } public int getHeight() { return this.height; } public void setHeight(int height) { this.height = height; } public int getWidth() { return this.width; } public void setWidth(int width) { this.width = width; } public ImageIcon getImageIcon() { return this.imageIcon; } public void setImageIcon(ImageIcon imageIcon) { this.imageIcon = imageIcon; } public void drawImage(Graphics g) { g.drawImage(this.imageIcon.getImage(), this.x, this.y, (ImageObserver)null); } public void delete() { ++this.flag; } public int getFlag() { return this.flag; } public void setFlag(int flag) { this.flag = flag; } }
Bullet
package game; import java.awt.Graphics; import java.awt.image.ImageObserver; import javax.swing.ImageIcon; public class Bullet { private int x; private int y; private int width; private int height; private ImageIcon bulletImageIcon = new ImageIcon("img/bullet.png"); public Bullet(int x, int y) { this.width = this.bulletImageIcon.getIconWidth(); this.height = this.bulletImageIcon.getIconHeight(); this.x = x; this.y = y; } public int getX() { return this.x; } public void setX(int x) { this.x = x; } public int getY() { return this.y; } public void setY(int y) { this.y = y; } public int getWidth() { return this.width; } public void setWidth(int width) { this.width = width; } public int getHeight() { return this.height; } public void setHeight(int height) { this.height = height; } public ImageIcon getBulletImageIcon() { return this.bulletImageIcon; } public void setBulletImageIcon(ImageIcon bulletImageIcon) { this.bulletImageIcon = bulletImageIcon; } public void drawImage(Graphics g) { g.drawImage(this.bulletImageIcon.getImage(), this.x, this.y, (ImageObserver)null); } public void move() { this.y -= 4; } }
Emeny
package game; import java.awt.Graphics; import java.awt.image.ImageObserver; import java.util.Random; import javax.swing.ImageIcon; public class Enemy { private int x; private int y; private int height; private int width; private ImageIcon enemyImageIcon = new ImageIcon("img/enemy.png"); public Enemy() { this.height = this.enemyImageIcon.getIconHeight(); this.width = this.enemyImageIcon.getIconWidth(); Random random = new Random(); this.x = random.nextInt(GameMain.width - this.width); this.y = -random.nextInt(GameMain.height - this.height); } public void move() { ++this.y; } public void drawImage(Graphics g) { g.drawImage(this.enemyImageIcon.getImage(), this.x, this.y, (ImageObserver)null); } public int getX() { return this.x; } public void setX(int x) { this.x = x; } public int getY() { return this.y; } public void setY(int y) { this.y = y; } public int getHeight() { return this.height; } public void setHeight(int height) { this.height = height; } public int getWidth() { return this.width; } public void setWidth(int width) { this.width = width; } public ImageIcon getEnemyImageIcon() { return this.enemyImageIcon; } public void setEnemyImageIcon(ImageIcon enemyImageIcon) { this.enemyImageIcon = enemyImageIcon; } }
GamePanel
package game; import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.util.ArrayList; import java.util.List; public class GamePanel extends JPanel implements MouseMotionListener { //读取英雄机的图片 ImageIcon heroImage = new ImageIcon("img/hero.png"); //英雄机坐标 int heroX = 300; int heroY = 500; private int number;//记录分数 //定义一个集合来装所有敌机 private List<Enemy> enems = new ArrayList<Enemy>();//定义一个集合来装所有的敌机 //定义一个集合来装所有子弹对象 private List<Bullet> bullets = new ArrayList<Bullet>(); //定义一个集合用来装爆炸图片 private List<Bomb> bombs =new ArrayList<Bomb>(); public GamePanel() {//创建十个敌人 for (int i = 0; i < 10; i++) { enems.add(new Enemy()); } } //鼠标按键在组件上按下并拖动时调用 @Override public void mouseDragged(MouseEvent e) { heroX = e.getX() - (heroImage.getIconWidth() / 2);//使鼠标与战机重合 heroY = e.getY() - (heroImage.getIconHeight() / 2);//把鼠标的y赋值 repaint();//重新绘制 } //鼠标光标移动到组件上但无按键按下时调用 @Override public void mouseMoved(MouseEvent e) { heroX = e.getX() - (heroImage.getIconWidth() / 2); heroY = e.getY() - (heroImage.getIconHeight() / 2); repaint(); } /** * 绘制图片 这个方法是窗口对象来调用 * @param g */ @Override public void paint(Graphics g) { super.paint(g); g.drawString("ZJZ and YZJ", 250, 30); //绘制分数板 g.setFont(new Font("", Color.RED.getRed(), 30)); g.drawString("当前得分:"+number, 20, 30); //1.绘制英雄机 //g.drawImage(heroImage.getImage(), 350, 0, null); g.drawImage(heroImage.getImage(), heroX, heroY, null); //2.绘制敌机 for (int i = 0; i < enems.size(); i++) { Enemy enemy = enems.get(i); enemy.drawImage(g);//重新绘制 } //3.绘制子弹 for (int i = 0; i < bullets.size(); i++) { Bullet bullet=bullets.get(i); bullet.drawImage(g); } //4.绘制爆炸图片 for(int i=0;i<bombs.size();i++){ Bomb bomb = bombs.get(i); bomb.drawImage(g); } } /** * 这个方法做初始化使用 * 创建一些组件(英雄机,子弹,敌人) */ public void init() { int flag=0;//控制子弹流出的速度 while (true) { flag++; if(flag % 15 ==0) { //创建一些子弹 Bullet bullet = new Bullet(heroX + (heroImage.getIconWidth() / 2), heroY); //把子弹添加到集合 bullets.add(bullet); } //让敌机往下移动 for (int i = 0; i < enems.size(); i++) { Enemy enemy = enems.get(i); enemy.move();//改变敌机的y坐标 //判断敌机的y值是否大于窗口的高夫 if(enemy.getY()>GameMain.height){ //删除敌机 enems.remove(enemy); //再加一个新的敌机 enems.add(new Enemy()); } } //让子弹飞起来 for (int i = 0; i < bullets.size(); i++) { Bullet tempBullet = bullets.get(i); tempBullet.move(); } //删除越界子弹数 for (int i = 0; i < bullets.size(); i++) { Bullet bullet=bullets.get(i); if(bullet.getY()<0){//越界 bullets.remove(bullet); } } //处理子弹碰到敌机的效果 for (int i = 0; i < enems.size(); i++) { Enemy enemy=enems.get(i);//敌机 for (int j = 0; j < bullets.size(); j++) { Bullet bullet=bullets.get(j);//子弹 if(isHit(enemy,bullet)){ enems.remove(enemy);//先删除集中的敌机 enems.add(new Enemy());//再加入敌机 bullets.remove(bullet);//删除子弹 //创建一个爆炸图片的对象 Bomb bomb=new Bomb(enemy.getY(),enemy.getY());//爆炸的地方是敌机被消灭的地方 bombs.add(bomb);//添加到集合中 number+=10;//每次碰撞加十分 } } } for (int i = 0; i < bombs.size(); i++) { Bomb bomb=bombs.get(i); bomb.delete();//立马删看不到效果,删五次 if(bomb.getFlag()>10){ bombs.remove(bomb);//删集合 } } repaint();//重新绘制,使图片动起来 try {//休眠五毫秒,否则我们看不见 Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } } } //碰撞方法 public boolean isHit(Enemy e, Bullet b){ // 1.指定一个区域 Rectangle rect = new Rectangle(e.getX(), e.getY(), e.getWidth(), e.getHeight()); // 2.表示 (x,y) 坐标空间中的位置的点 Point p = new Point(b.getX()+b.getWidth()/2,b.getY()+b.getHeight()/2); return rect.contains(p);//敌机包含子弹 } }
GameMain
package game; import java.awt.Component; import javax.swing.JFrame; public class GameMain { static int width = 600; static int height = 800; public GameMain() { } public static void main(String[] args) { JFrame frame = new JFrame(); frame.setTitle("飞机大战"); frame.setSize(width, height); frame.setLocationRelativeTo((Component)null); frame.setDefaultCloseOperation(3); GamePanel j = new GamePanel(); frame.add(j); frame.addMouseMotionListener(j); frame.setVisible(true); j.init(); } }