一.实验代码
//Hero.java
package sxau_rjxy;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
//我方飞机
public class Hero {
public Hero(int x, int y, int r) {
super();
this.x = x;
this.y = y;
this.r = r;
}
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 int getR() {
return r;
}
public void setR(int r) {
this.r = r;
}
private int x;
private int y;
private int r;
private int score;
private int blood=100;
private int allBlood=100;
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
//自定义的paint()方法,名字随意
public void paint(Graphics g) {
// TODO Auto-generated method stub
Color c = g.getColor();//画笔有一个自带的颜色,我们通过这句话可以保存原始,在做完自己的操作后可以设回初始.
g.setColor(Color.blue);//我机蓝色
g.fillOval(x-r, y-r, r*2,r*2);
//g.drawRect(50, 50,480, 60);//空心的
g.setColor(Color.orange);//满血时
g.fillRect(50, 50, allBlood, 60);
g.setColor(Color.red);//当前血量
g.fillRect(50, 50, blood, 60);
g.setColor(Color.BLUE);//如何分清的颜色?
g.setFont(new Font("楷体", Font.BOLD, 60));//设置了分数的相关信息
g.drawString("分数:"+ this.score,50,50);//分数的位置
g.setColor(c);
}
}
//Plane.java
package sxau_rjxy;
import java.awt.Color;
import java.awt.Graphics;
//敌机
public class Plane {
public Plane(int x, int y, int r) {
super();
this.x = x;
this.y = y;
this.r = r;
}
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 int getR() {
return r;
}
public void setR(int r) {
this.r = r;
}
private int x;
private int y;
private int r;
private int speed;
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
//自定义的paint()方法,名字随意
public void paint(Graphics g) {
// TODO Auto-generated method stub
Color c = g.getColor();
g.setColor(Color.black);//敌机黑色
g.fillOval(x-r, y-r, r*2,r*2);
g.setColor(c);
}
}
//Bullet.java package sxau_rjxy; import java.awt.Color; import java.awt.Graphics; public class Bullet { public Bullet(int x, int y, int r) { super(); this.x = x; this.y = y; this.r = r; } 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 int getR() { return r; } public void setR(int r) { this.r = r; }
//Mygame.java package sxau_rjxy; import java.awt.Color; import java.awt.Dimension; import java.awt.Toolkit; import javax.swing.JFrame; public class Mygame { public static void main(String[] args) { // TODO Auto-generated method stub JFrame jf = new JFrame("飞机大战");//创建窗体 Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); jf.setBounds(0, 0, dim.width, dim.height); //jf.setBackground(Color.red); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); MyJPanel panel= new MyJPanel(dim);//相当于管家 jf.add(panel); /* * Thread t = new Thread(panel); * t.start(); */ jf.setResizable(false); jf.setVisible(true); } }
private int x;private int y;private int r;//自定义的paint()方法,名字随意public void paint(Graphics g) {// TODO Auto-generated method stubColor c = g.getColor();g.setColor(Color.white);//子弹白色g.fillOval(x-20, y-r, r*2,r*2);g.setColor(c);}}//MyJPanel.java package sxau_rjxy; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionAdapter; import java.awt.event.MouseMotionListener; import java.util.ArrayList; import java.util.Iterator; import javax.swing.JPanel; public class MyJPanel extends JPanel implements Runnable{ @Override public void run() { // TODO Auto-generated method stub /*while(true){ int y = p.getY(); p.setY(y++); repaint(); try { Thread.sleep(100); } catch (InterruptedException e){ // TODO Auto-generated catch block e.printStackTrace(); } }*/ int y; int count =0; while(true){ //使子弹慢下来产生,改变被除的也可以改变间距 if(count%10==0){ Bullet bullet = new Bullet(hero.getX(),hero.getY()-hero.getR(),5); bullets.add(bullet); } count++; //让飞机动起来 for(int i= 0;i<planes.size();i++){ Plane p=planes.get(i); //y=p.getY()+1; y=p.getY()+p.getSpeed();//把1变成y.getSpeed()使得飞机速度真正改变 p.setY(y); if(y>bgy){ p.setY(0);//开始循环了,但运行出来是由于横坐标没变,显示一样 p.setX((int)(Math.random()*(bgx-60)+30));//两个一起则图案显示不同,随机 } if(isHit(p,hero)){ //不移除,改变飞机的位置即可 p.setY(0); p.setX((int)(Math.random()*(bgx-60)+30)); hero.setBlood(hero.getBlood()-10); } } //让子弹动起来 for(int i= 0;i<bullets.size();i++){ Bullet b=bullets.get(i); y=b.getY()-10;//速度减慢,间距也可以被改变 //使子弹不越界 if(y<0){ bullets.remove(i); } b.setY(y); for(int j=0;j<planes.size();j++){ Plane p= planes.get(j); if(isHit(b,p)){ bullets.remove(j); /*bullets.remove(int index); * bullets.remove(Object o); * 方法的最终结果是一样的,传进去的参数类型不同,但是内容是一样的 */ p.setY(0); p.setX((int)(Math.random()*(bgx-60)+30)); hero.setScore(hero.getScore()+10);//设置分数 } } } //bullet.setY(bullet.getY()-1);//让子弹动起来,即坐标变化 try { Thread.sleep(20);//如果没sleep,那么它屏幕上没圈了,因为太快 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } repaint();//没它之前,运行出的结果是静态的,因为没有重新画它 }//这是一个死循环,while(true) }
//判断飞机和hero是否相撞 private boolean isHit(Plane p, Hero hero) { // TODO Auto-generated method stub if((hero.getX()-p.getX())*(hero.getX()-p.getX())+(hero.getY()-p.getY())*(hero.getY()-p.getY())<=(hero.getR()+p.getR())*(hero.getR()+p.getR())){ return true; } return false; } //判断子弹是否击中飞机 private boolean isHit(Bullet b,Plane p) { // TODO Auto-generated method stub if((b.getX()-p.getX())*(b.getX()-p.getX())+(b.getY()-p.getY())*(b.getY()-p.getY())<=(b.getR()+p.getR())*(b.getR()+p.getR())){ return true; } return false; } //Plane p = new Plane(200,200,50); //Plane[] planes = new Plane[10]; ArrayList<Plane> planes = new ArrayList<Plane>();//保存飞机的引用,才能画它;定义了容器 ArrayList<Bullet> bullets = new ArrayList<Bullet>(); //Plane hero= new Plane(bgx, bgy, 30);//不对,不能共用敌机的类 Hero hero; Bullet bullet; @Override //重写的paint()方法,系统调用 public void paint(Graphics g) { // TODO Auto-generated method stub //super.paint(g); //Color c = g.getColor(); //g.setColor(Color.red); //g.fillOval(p.getX()-p.getR(), p.getY()-p.getR(), p.getR()^2,p.getR()); //g.setColor(c); super.paint(g); //p.paint(g); /*画敌机 * for(int i =0;i<planes.size();i++){ Plane p= planes.get(i); p.paint(g); } */ //画敌机 Iterator<Plane> it = planes.iterator(); while(it.hasNext()){ Plane p = it.next(); p.paint(g); } //画子弹 for(int i =0;i<bullets.size();i++){ Bullet b=bullets.get(i); b.paint(g); } //画hero hero.paint(g); //bullet.paint(g); } private int bgx; private int bgy; public MyJPanel (Dimension dim){ bgx =dim.width; bgy =dim.height; this.setBackground(Color.lightGray); //创建飞机 for(int i = 0;i<=10;i++){ Plane p= new Plane((int)(Math.random()*(bgx-60)+30),(int)(Math.random()*(bgy-60)+30),30); p.setSpeed((int)(Math.random()*5+1));//使飞机的速度不一样 planes.add(p); } hero= new Hero(bgx/2, bgy-60, 30); /* * Hero hero = new Hero(bgx/2, bgy-60, 30); * 因为前面已经定义过Hero hero ; * 所以运行出错,空白一片; */ bullet = new Bullet(hero.getX(),hero.getY()-hero.getR(),5); this.addMouseMotionListener(new MyMonitor()); this.addKeyListener(new MyMonitor2()); this.setFocusable(true);//必须要这,监听键盘时必须加,不然没反应 new Thread(this).start();//线程启动第二种方法 }
//内部类 private class MyMonitor extends MouseMotionAdapter{ @Override public void mouseDragged(MouseEvent e) { // TODO Auto-generated method stub //super.mouseDragged(e); hero.setX(e.getX()); hero.setY(e.getY()); } } private class MyMonitor2 extends KeyAdapter{ @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub super.keyPressed(e); //System.out.println("ss");//用来测试键盘事件是否响应了 int code = e.getKeyCode(); if(code==KeyEvent.VK_LEFT){ hero.setX(hero.getX()-10); } if(code==KeyEvent.VK_RIGHT){ hero.setX(hero.getX()+10); } if(code==KeyEvent.VK_UP){ hero.setY(hero.getY()-10); } if(code==KeyEvent.VK_DOWN){ hero.setY(hero.getY()+10); } } } }
二.运行结果
三.实验心得
06.29
1.运行时会有卡顿现象,原因?
电脑卡,或者是由于未关闭进程,造成多个程序占用资源,系统卡机
2.在运行时判断hero和飞机相撞时出现问题,没碰到就减血了,原因?
g.fillOval(x-r,y-r,r*2,r*2);最后传进的两个参数是圆的直径,所以必须得表示圆的直径,如果是其他值,那么最后在设置撞击的条件时会有冲突
3.设置的颜色程序如何实现的自己不会出错?
4.画笔有一个自带的颜色,我们通过这句话可以保存原始,在做完自己的操作后可以设回初始.
eg:Color c = g.getColor();g.setColor(c);
5.setFont(new Font(String name,int style,int size))用来设置字体的相关信息.eg:
g.setFont(new Font("楷体", Font.BOLD, 60));//设置了分数的相关信息
g.drawString("分数:"+this.score,50,50);//分数的位置
6.bullets.remove(j);或者bullets.remove(i);]
j是序号,i是下标,调用的函数不同,原因具体如下:
/*bullets.remove(int index);
* bullets.remove(Object o);
* 方法的最终结果是一样的,传进去的参数类型不同,但是内容是一样的
*/
7.如何判断飞机和hero是否相撞?
private boolean isHit(Plane p, Hero hero) {if((hero.getX()-p.getX())*(hero.getX()-p.getX())+(hero.getY()-p.getY())*(hero.getY()-p.getY())<=(hero.getR()+p.getR())*(hero.getR()+p.getR())){
return true;
}
return false;
}
if(isHit(p,hero)){
//不移除,改变飞机的位置即可
p.setY(0);
p.setX((int)(Math.random()*(bgx-60)+30));
hero.setBlood(hero.getBlood()-10);
}