背景
这是大二上学期面向对象编程课(java)的大作业。当时是六个人一组(但是因为自己对这个课设挺感兴趣的,就自己一个人陆陆续续地写了快两周写完了),老师要求实现一个飞机大战的游戏,与https://freeasteroids.org/类似,就是传统的飞机射击陨石的游戏。
完整代码在
https://github.com/H4de5-7/Asteroids
要求
初始会有一定数量的陨石,飞机靠射击陨石获得分数,一定时间内会出现UFO。飞机、陨石、UFO、子弹在屏幕边界处不会消失,而是出现在屏幕的另一边。按ESC会出现菜单。
陨石
1、陨石要有大、中、小三种。大陨石被击毁后会生成中陨石,中陨石被击毁后会生成小陨石。
2、陨石随机方向、速度运动。
3、将当前的陨石都击毁后会进入下一关。
飞机
1、飞机有三条命,被击毁后会重生,有一段时间的无敌状态。
2、按shift可以闪现到安全位置。
3、可以左转(左箭头)、右转(右箭头)、加速(上箭头)、减速(下箭头)、射击(空格)。
UFO
1、一段时间随机出现。
2、以随机方向、速度运动
3、会向四面八方发射子弹。
代码逻辑
由于老师上课讲图形界面实现的时候用的是swing和awt(有点学院派了),我也就顺着用了。
主体代码分为窗口、画布、飞机、陨石、UFO、子弹、碎片七部分:
窗口
Window类为运行的main类,里面定义了窗口的大小等参数,添加了画布,并且让画布运行。
package Asteroids;
import javax.swing.*;
import java.awt.event.*;
public class Window {
public static void main(String[] args) {
int Height=Windows.HEIGHT.getValue();
int Width=Windows.WIDTH.getValue();
JFrame window = new JFrame();
window.setSize(Width, Height);
window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
Picture pic = new Picture();
window.add(pic);
MeListener ll = new MeListener(pic);
window.addKeyListener(ll);
window.setVisible(true);
//pic.Music();
pic.action();
}
}
package Asteroids;
public enum Windows{
HEIGHT(1000),WIDTH(1600);
private int Value;
private Windows(int rv){
this.Value=rv;
}
public int getValue(){
return Value;
}
}
}
}
画布
Picture实现了画布的功能,将每个对象画出来,并且通过刷新画布来实现各个对象的动作(如飞机的飞行等)。当时接触数据结构的时间比较短,用的是数组来实现多个对象的储存以及删除等操作。。。现在来看肯定是链表更适合。包括把闪现的操作写在画布上而不是飞机的类中现在看来也是挺离谱的。可吐槽的点太多了。。
画布中的action函数通过定时刷新画布来实现飞机飞行等动作。
package Asteroids;
import java.awt.*;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JComponent;
import java.awt.image.BufferedImage;
import java.awt.Polygon;
import java.util.Arrays;
import javax.imageio.ImageIO;
import java.io.File;
import java.net.URI;
import java.net.URL;
public class Picture extends JComponent{
public static BufferedImage background;
Me me=new Me();//创建一个飞机;
Bullet []BulletArray=new Bullet[0];//创建一个子弹数组
UFO []UFOArray=new UFO[0];//创建一个ufo数组
Bullet []UFOBulletArray=new Bullet[0];//
asteroids []asteroidsArray=new asteroids[0];//创建一个陨石数组
Balldisappear []ballArray=new Balldisappear[0];
int menuflag=0;
int score=0;
int scoretemp=0;
int ufobullettime=0;
int asteroidstime=0;
int ufoflag=1;
int wudinum=0;
int life=3;
int highest=0;
int startflag=0;
int addasteroidsflag=0;
int addasteroidsnum=1;
int yy=-1000;
int mehuanum=0;
int Height=Windows.HEIGHT.getValue();
int Width=Windows.WIDTH.getValue();
File f;
URI uri;
URL url;
static{
try{
background = ImageIO.read(Picture.class.getResource("background1.jpg"));
}catch(Exception e){
e.getStackTrace();
}
}
/*void Music(){//注意,java只能播放无损音质,如.wav这种格式"E:\\Studying\\Programming\\untitled\\src\\Asteroids\\The XX-Intro.wav"
try {
f = new File("The XX-Intro.wav"); //绝对路径
//uri = f.toURI();
url = f.toURL(); //解析路径
AudioClip aau;
aau = Applet.newAudioClip(url);
if(aau!=null)System.out.println("not null");
aau.play();
aau.loop(); //单曲循环
} catch (Exception e)
{
e.printStackTrace();
}
}*/
public void mehua(){
mehuanum++;
if(mehuanum<=150){
me.y1[0]-=1;
me.y1[1]-=1;
me.y1[2]-=1;
}
}
public void paintComponent(Graphics g){
if(startflag==1) {
if(menuflag==0) {
mehua();
paintbackground(g);
paintMe(g);
paintBullet(g);
paintScore(g);
paintUFO(g);
paintufobullet(g);
paintasteroids(g);
paintball(g);
if (life <= 0) {
paintover(g);
}
}else{
paintbackground(g);
paintMenu(g);
}
}else if(startflag==0){
paintbackground(g);
paintstart(g);
}
}
public void paintMe(Graphics g){
me.draw(g);
}
public void paintufobullet(Graphics g){
for(int i=0;i<UFOBulletArray.length;i++){
UFOBulletArray[i].drawred(g);
}
}
public void paintasteroids(Graphics g){
for(int i=0;i<asteroidsArray.length;i++){
asteroidsArray[i].draw(g);
}
}
public void paintbackground(Graphics g){
yy++;
if(yy>=0)yy=-Height;
g.drawImage(background, 0, yy, null);
}
public void paintball(Graphics g){
for(int i=0;i<ballArray.length;i++){
if(ballArray[i].flag==0) {
ballArray[i].draw(g);
}else if(ballArray[i].flag==1){
ballArray[i].drawline(g);
}
}
}
public void paintBullet(Graphics g){//画出子弹
for(int i=0;i<BulletArray.length;i++){
BulletArray[i].draw(g);
}
}
public void paintMenu(Graphics g) {
int menux = 550; // x坐标
int menuy = 200; // y坐标
Font font = new Font(Font.SANS_SERIF, Font.BOLD, 40); // 字体
g.setColor(Color.red);
g.setFont(font); // 设置字体
g.drawString("Accelerate : ↑" , menux, menuy); // 画分数
menuy += 80;
g.drawString("Decelerate : ↓" , menux, menuy); // 画分数
menuy += 80;
g.drawString("Turn left : ←" , menux, menuy);
menuy += 80;
g.drawString("Turn right : →" ,menux, menuy); // 画命 }
menuy += 80;
g.drawString("Fire : Space" , menux, menuy); // 画分数
menuy += 80;
g.drawString("Moving to a random safe place : Shift" , menux, menuy); // 画分数
}
public void paintScore(Graphics g) {
int scorex = 10; // x坐标
int scorey = 40; // y坐标
int scorexx=1000;
int scoreyy=40;
int menux=300;
int menuy=40;
Font font = new Font(Font.SANS_SERIF, Font.BOLD, 35); // 字体
g.setColor(Color.red);
g.setFont(font); // 设置字体
g.drawString("SCORE:" + score, scorex, scorey); // 画分数
g.drawString("HIGHEST SCORE:" + highest, scorexx, scoreyy); // 画分数
g.drawString("MENU(ESC)" , menux, menuy);
//g.drawString("MENU" , menux-100, menuy-30);
scorey = scorey + 50; // y坐标增20
g.drawString("LIFE:" + life, scorex, scorey); // 画命 }
}
public void paintover(Graphics g){
int scorex = 400; // x坐标
int scorey = 500; // y坐标
int scorexx=400;
int scoreyy=575;
int scorexxx=400;
int scoreyyy=650;
Font font = new Font(Font.SANS_SERIF, Font.BOLD, 100); // 字体
g.setColor(Color.WHITE);
g.setFont(font); // 设置字体
g.drawString("GAME OVER", scorex, scorey);
Font font1 = new Font(Font.SANS_SERIF, Font.BOLD, 50); // 字体
g.setFont(font1); // 设置字体
g.drawString("Your score is "+score, scorexx, scoreyy);
Font font2 = new Font(Font.SANS_SERIF, Font.BOLD, 50); // 字体
g.setFont(font2); // 设置字体
g.drawString("Please press 'B' to restart", scorexxx, scoreyyy);
}
public void paintstart(Graphics g){
int scorex = 400; // x坐标
int scorey = 400; // y坐标
Font font = new Font(Font.SANS_SERIF, Font.BOLD, 150); // 字体
g.setColor(Color.BLUE);
g.setFont(font); // 设置字体
g.drawString("Asteroids", scorex, scorey);
scorey+=60;
scorex+=150;
Font font1 = new Font(Font.SANS_SERIF, Font.BOLD, 50); // 字体
g.setColor(Color.BLUE);
g.setFont(font1); // 设置字体
g.drawString("Press 'S' to start", scorex, scorey); // 画命 }
}
public void paintUFO(Graphics g){
for(int i=0;i<UFOArray.length;i++){
UFOArray[i].draw(g);
}
}
public void ballfly(){
for(int i=0;i<ballArray.length;i++){
if(ballArray[i].count>=150){
Balldisappear temp = ballArray[i];
ballArray[i] = ballArray[ballArray.length - 1];
ballArray[ballArray.length - 1] = temp;
ballArray = Arrays.copyOf(ballArray, ballArray.length - 1);
}else ballArray[i].fly();
}
}
public void BulletFly() {//飞机子弹飞行
for(int i=0;i<BulletArray.length;i++) {
int index1=-1;
int index2=-1;
for (int j = 0; j < UFOArray.length; j++) {
if (!UFOArray[j].hit(new Polygon(new int[]{(int) (BulletArray[i].x + 2), (int) (BulletArray[i].x - 2), (int) (BulletArray[i].x), (int) (BulletArray[i].x)}, new int[]{(int) (BulletArray[i].y), (int) (BulletArray[i].y), (int) (BulletArray[i].y + 2), (int) (BulletArray[i].y - 2)}, 4))) {
index1 = i;
UFO temp = UFOArray[j];
UFOArray[j] = UFOArray[UFOArray.length - 1];
UFOArray[UFOArray.length - 1] = temp;
UFOArray = Arrays.copyOf(UFOArray, UFOArray.length - 1);
//j--;
for(int m=0;m<4;m++) {
ballArray = Arrays.copyOf(ballArray, ballArray.length + 1);
ballArray[ballArray.length - 1] = new Balldisappear(temp.cx, temp.cy);
}
score += 300;
scoretemp+=300;
}
}
for (int k = 0; k < asteroidsArray.length; k++) {
//double tempcx=0;double tempcy=0;
if (!asteroidsArray[k].hit(new Polygon(new int[]{(int) (BulletArray[i].x + 2), (int) (BulletArray[i].x - 2), (int) (BulletArray[i].x), (int) (BulletArray[i].x)}, new int[]{(int) (BulletArray[i].y), (int) (BulletArray[i].y), (int) (BulletArray[i].y + 2), (int) (BulletArray[i].y - 2)}, 4))) {
index2 = i;
asteroids temp = asteroidsArray[k];
//tempcx=asteroidsArray[k].cx;tempcy=asteroidsArray[k].cy;
asteroidsArray[k] = asteroidsArray[asteroidsArray.length - 1];
asteroidsArray[asteroidsArray.length - 1] = temp;
asteroidsArray = Arrays.copyOf(asteroidsArray, asteroidsArray.length - 1);
for(int m=0;m<4;m++) {
ballArray = Arrays.copyOf(ballArray, ballArray.length + 1);
ballArray[ballArray.length - 1] = new Balldisappear(temp.cx, temp.cy);
}
//k--;
if(temp.asteroidsflag==3) {
asteroidsArray = Arrays.copyOf(asteroidsArray, asteroidsArray.length + 1);
asteroidsArray[asteroidsArray.length - 1] = new asteroidsm(temp.cx, temp.cy);
asteroidsArray = Arrays.copyOf(asteroidsArray, asteroidsArray.length + 1);
asteroidsArray[asteroidsArray.length - 1] = new asteroidsm(temp.cx, temp.cy);
score += 300;
scoretemp+=300;
}else if(temp.asteroidsflag==2){
asteroidsArray = Arrays.copyOf(asteroidsArray, asteroidsArray.length + 1);
asteroidsArray[asteroidsArray.length - 1] = new asteroidsl(temp.cx, temp.cy);
asteroidsArray = Arrays.copyOf(asteroidsArray, asteroidsArray.length + 1);
asteroidsArray[asteroidsArray.length - 1] = new asteroidsl(temp.cx, temp.cy);
score += 400;
scoretemp+=400;
}else if(temp.asteroidsflag==1){
//System.out.println("xiao");
score += 500;
scoretemp+=500;
}
}
}
if (index1 != -1) {
Bullet temp = BulletArray[index1];
BulletArray[index1] = BulletArray[BulletArray.length - 1];
BulletArray[BulletArray.length - 1] = temp;
BulletArray = Arrays.copyOf(BulletArray, BulletArray.length - 1);
} else if (index2 != -1 && index1 == -1) {
Bullet temp = BulletArray[index2];
BulletArray[index2] = BulletArray[BulletArray.length - 1];
BulletArray[BulletArray.length - 1] = temp;
BulletArray = Arrays.copyOf(BulletArray, BulletArray.length - 1);
}
}
for(int i=0;i<BulletArray.length;i++) {
if (BulletArray[i].count < 850) {
BulletArray[i].fly();
} else {
Bullet temp = BulletArray[i];
BulletArray[i] = BulletArray[BulletArray.length - 1];
BulletArray[BulletArray.length - 1] = temp;
BulletArray = Arrays.copyOf(BulletArray, BulletArray.length - 1);
//i--;
}
}
}
public void UFOfly() {//UFO飞行
for(int i=0;i<UFOArray.length;i++) {
ufobullettime++;
if (ufobullettime % 40 == 0) {
UFOBulletArray = Arrays.copyOf(UFOBulletArray, UFOBulletArray.length + 1);
UFOBulletArray[UFOBulletArray.length-1]=new Bullet(UFOArray[i].cx,UFOArray[i].cy,ufoflag);
ufoflag = (ufoflag + 2) % 12;
}
if (UFOArray[i].hit(new Polygon(new int[]{(int) me.x1[0], (int) me.x1[1], (int) me.x1[2]}, new int[]{(int) me.y1[0], (int) me.y1[1], (int) me.y1[2]}, 3))) {
UFOArray[i].fly();
} else {
UFO temp=UFOArray[i];
UFOArray[i]=UFOArray[UFOArray.length-1];
UFOArray[UFOArray.length-1]=temp;
UFOArray = Arrays.copyOf(UFOArray, UFOArray.length - 1);
for(int m=0;m<4;m++) {
ballArray = Arrays.copyOf(ballArray, ballArray.length + 1);
ballArray[ballArray.length - 1] = new Balldisappear(temp.cx, temp.cy);
}
for(int m=0;m<4;m++) {
ballArray = Arrays.copyOf(ballArray, ballArray.length + 1);
ballArray[ballArray.length - 1] = new Balldisappear(me.cx, me.cy);
ballArray[ballArray.length - 1].flag=1;
ballArray[ballArray.length - 1].linepoint();
}
// i--;
life--;
me=new Me();
mehuanum=0;
mehua();
me.wudiflag=1;
}
}
}
public void ufobulletfly() {//ufo子弹飞行
for(int i=0;i<UFOBulletArray.length;i++){
if (UFOBulletArray[i].hit(new Polygon(new int[]{(int) me.x1[0], (int) me.x1[1], (int) me.x1[2]}, new int[]{(int) me.y1[0], (int) me.y1[1], (int) me.y1[2]}, 3))&&UFOBulletArray[i].count<1000) {
UFOBulletArray[i].fly();
} else if(UFOBulletArray[i].count>=1000){
Bullet temp=UFOBulletArray[i];
UFOBulletArray[i]=UFOBulletArray[UFOBulletArray.length-1];
UFOBulletArray[UFOBulletArray.length-1]=temp;
UFOBulletArray = Arrays.copyOf(UFOBulletArray, UFOBulletArray.length - 1);
//i--;
}else{
Bullet temp=UFOBulletArray[i];
UFOBulletArray[i]=UFOBulletArray[UFOBulletArray.length-1];
UFOBulletArray[UFOBulletArray.length-1]=temp;
UFOBulletArray = Arrays.copyOf(UFOBulletArray, UFOBulletArray.length - 1);
// i--;
for(int m=0;m<4;m++) {
ballArray = Arrays.copyOf(ballArray, ballArray.length + 1);
ballArray[ballArray.length - 1] = new Balldisappear(me.cx, me.cy);
ballArray[ballArray.length - 1].flag=1;
ballArray[ballArray.length - 1].linepoint();
}
life--;
me=new Me();
mehuanum=0;
mehua();
me.wudiflag=1;
}
}
}
public void asteroidsfly(){
for(int i=0;i<asteroidsArray.length;i++){
if (asteroidsArray[i].hit(new Polygon(new int[]{(int)me.x1[0],(int)me.x1[1],(int)me.x1[2]},new int[]{(int)me.y1[0],(int)me.y1[1],(int)me.y1[2]},3))) {
asteroidsArray[i].fly();
} else {
asteroids temp=asteroidsArray[i];
asteroidsArray[i]=asteroidsArray[asteroidsArray.length-1];
asteroidsArray[asteroidsArray.length-1]=temp;
asteroidsArray = Arrays.copyOf(asteroidsArray, asteroidsArray.length - 1);
// i--;
for(int m=0;m<4;m++) {
ballArray = Arrays.copyOf(ballArray, ballArray.length + 1);
ballArray[ballArray.length - 1] = new Balldisappear(temp.cx, temp.cy);
}
for(int m=0;m<4;m++) {
ballArray = Arrays.copyOf(ballArray, ballArray.length + 1);
ballArray[ballArray.length - 1] = new Balldisappear(me.cx, me.cy);
ballArray[ballArray.length - 1].flag=1;
ballArray[ballArray.length - 1].linepoint();
}
if(temp.asteroidsflag==3) {
asteroidsArray = Arrays.copyOf(asteroidsArray, asteroidsArray.length + 1);
asteroidsArray[asteroidsArray.length - 1] = new asteroidsm(temp.cx, temp.cy);
asteroidsArray = Arrays.copyOf(asteroidsArray, asteroidsArray.length + 1);
asteroidsArray[asteroidsArray.length - 1] = new asteroidsm(temp.cx, temp.cy);
}else if(temp.asteroidsflag==2){
asteroidsArray = Arrays.copyOf(asteroidsArray, asteroidsArray.length + 1);
asteroidsArray[asteroidsArray.length - 1] = new asteroidsl(temp.cx, temp.cy);
asteroidsArray = Arrays.copyOf(asteroidsArray, asteroidsArray.length + 1);
asteroidsArray[asteroidsArray.length - 1] = new asteroidsl(temp.cx, temp.cy);
}else if(temp.asteroidsflag==1){
}
life--;
me=new Me();
mehuanum=0;
mehua();
me.wudiflag=1;
}
}
}
public void addasteroids(){
if (addasteroidsflag == 0) {
asteroidsArray = Arrays.copyOf(asteroidsArray, addasteroidsnum);
for (int i = 0; i < asteroidsArray.length; i++) {
asteroidsArray[i] = new asteroids();
}
addasteroidsflag = 1;
addasteroidsnum += 1;
} else {
asteroidstime++;
if (asteroidstime % 1500 == 0) {
UFOArray = Arrays.copyOf(UFOArray, UFOArray.length + 1);
UFOArray[UFOArray.length - 1] = new UFO();
//System.out.println(asteroidsArray.length);
// for(int i=0;i<asteroidsArray.length;i++){
//System.out.print(asteroidsArray[i].asteroidsflag+" ");
//}System.out.println("");
}
}
if (asteroidsArray.length == 0 && UFOArray.length == 0) {
addasteroidsflag = 0;
}
}
public void addlife(){
if(scoretemp>=10000){
life++;
scoretemp-=10000;
}
}
public void shanxian(){
int shanxianflag=0;
double mecx=0;
double mecy=0;
while(true){
shanxianflag=0;
mecx=Math.random()*1400;
mecy=Math.random()*750;
for(int i=0;i<asteroidsArray.length;i++){
if(!asteroidsArray[i].hit((new Polygon(new int[]{(int)mecx,(int)mecx-15,(int)mecx+15},new int[]{(int)mecy-25,(int)mecy+15,(int)mecy+15},3)))){
shanxianflag=1;
}
}
for(int i=0;i<UFOArray.length;i++){
if(!UFOArray[i].hit((new Polygon(new int[]{(int)mecx,(int)mecx-15,(int)mecx+15},new int[]{(int)mecy-25,(int)mecy+15,(int)mecy+15},3)))){
shanxianflag=1;
}
}
for(int i=0;i<UFOBulletArray.length;i++){
if(!UFOBulletArray[i].hit((new Polygon(new int[]{(int)mecx,(int)mecx-15,(int)mecx+15},new int[]{(int)mecy-25,(int)mecy+15,(int)mecy+15},3)))){
shanxianflag=1;
}
}
if(shanxianflag==0)break;
}
me=new Me();
me.cx=mecx;
me.cy=mecy;
me.x1[0]=me.cx;me.x1[1]=me.cx-15;me.x1[2]=me.cx+15;
me.y1[0]=me.cy-25;me.y1[1]=me.cy+15;me.y1[2]=me.cy+15;
}
public void action() {//执行画布的操作
Timer timer = new Timer();
TimerTask task = new TimerTask() {
public void run() {//每次需要执行的代码放到这里面
if (startflag == 1) {
if (menuflag == 1) {
repaint();
} else {
if (me.wudiflag == 1) {
wudinum++;
addasteroids();
for (int i = 0; i < asteroidsArray.length; i++) asteroidsArray[i].fly();
for (int i = 0; i < UFOArray.length; i++) UFOArray[i].fly();
for (int i = 0; i < UFOBulletArray.length; i++) UFOBulletArray[i].fly();
for (int i = 0; i < BulletArray.length; i++) BulletArray[i].fly();
for (int i = 0; i < ballArray.length; i++) ballArray[i].fly();
repaint();
if (wudinum >= 120 && life > 0) {
me.wudiflag = 0;
wudinum = 0;
}
} else {
addlife();
addasteroids();
me.fly();//更新飞机的状态
BulletFly();//更新飞机射出去的子弹
ufobulletfly();//更新ufo射出去的子弹
UFOfly();//更新ufo的状态
ballfly();
asteroidsfly();
repaint();//实时更新
}
}
}else{
repaint();
}
}
};
timer.schedule(task,0,10);
}
}
飞机
Me类实现了飞机的各种参数以及加速、减速、左转、右转、射击、重置等功能。
MeListener类实现了对键鼠的监听。
在监测到玩家按下开始键之后会执行画布的一系列初始化操作(这里的逻辑也有点奇怪,把画布的初始化操作写在了监听器里面,应该写在窗口里面的)。
hit函数用来判断飞机是否被击毁。
当时老师要求只能用线条来画出飞机,但其实用图片的话有给好的函数进行旋转等操作(还更丝滑)。结果后来发现好像大家都用的图片来表示飞机。。用线条画飞机的话更麻烦,旋转等操作需要考虑围绕中心重新定位的问题,当时和学长讨论了两三个小时才确定旋转的函数怎么写(数学没整明白)。
package Asteroids;
import java.awt.*;
import java.awt.geom.Area;
public class Me {
double []x1={750,735,765};
double []y1={710,750,750};
double cx=750;double cy=585;
int flag=0;
double angle=0,angle1=45,angle2=45,L=25,L1=21.21;
double deltaAngle=30;
double speedx=0;
double speedy=0;
int wudiflag=0;
int Height=Windows.HEIGHT.getValue();
int Width=Windows.WIDTH.getValue();
//private int life=0;
public Me(){
}
//public int getLife(){
// return life;
// }
// public void addLife(){
// life++;
// }
// public void minusLife(){
// life--;
// }
public void draw(Graphics g){
g.setColor(Color.GREEN);
g.fillPolygon (new int[]{(int)x1[0],(int)x1[1],(int)x1[2]},new int[]{(int)y1[0],(int)y1[1],(int)y1[2]},3);
//bulletlist创建子弹list;
//在这里把bulletlist里的每个Node都遍历一遍把位置paint
}
public void drawwudi(Graphics g){
g.setColor(Color.BLUE);
int []x={(int)x1[0],(int)x1[1],(int)x1[2]};
int []y={(int)y1[0],(int)y1[1],(int)y1[2]};
g.drawPolygon(x,y,3);
//bulletlist创建子弹list;
//在这里把bulletlist里的每个Node都遍历一遍把位置paint
}
public void addspeed(){
if(flag==0)speedy-=0.2;
else if(flag==1){speedy-=0.173;speedx+=0.1;}
else if(flag==2){speedy-=0.1;speedx+=0.173;}
else if(flag==3)speedx+=0.2;
else if(flag==4){speedy+=0.1;speedx+=0.173;}
else if(flag==5){speedy+=0.173;speedx+=0.1;}
else if(flag==6)speedy+=0.2;
else if(flag==7){speedy+=0.173;speedx-=0.1;}
else if(flag==8){speedy+=0.1;speedx-=0.173;}
else if(flag==9)speedx-=0.2;
else if(flag==10){speedy-=0.1;speedx-=0.173;}
else if(flag==11){speedy-=0.173;speedx-=0.1;}
}
public void minusspeed(){
if(flag==0)speedy+=0.2;
else if(flag==1){speedy+=0.173;speedx-=0.1;}
else if(flag==2){speedy+=0.1;speedx-=0.173;}
else if(flag==3)speedx-=0.2;
else if(flag==4){speedy-=0.1;speedx-=0.173;}
else if(flag==5){speedy-=0.173;speedx-=0.1;}
else if(flag==6)speedy-=0.2;
else if(flag==7){speedy-=0.173;speedx+=0.1;}
else if(flag==8){speedy-=0.1;speedx+=0.173;}
else if(flag==9)speedx+=0.2;
else if(flag==10){speedy+=0.1;speedx+=0.173;}
else if(flag==11){speedy+=0.173;speedx+=0.1;}
}
public void fly(){
cx+=speedx;
cy+=speedy;
for(int i=0;i<3;i++){
y1[i]+=speedy;
x1[i]+=speedx;
//System.out.println("sb");
}
if(speedx<=-10)speedx=-10;
if(speedx>=10)speedx=10;
if(speedy<=-10)speedy=-10;
if(speedy>=10)speedy=10;
chongzhi();
}
public void rotateLeft(){
flag=(flag-1)%12;
if(flag<0)flag+=12;
angle = (deltaAngle + angle)%360;
x1[0] = cx-Math.sin(angle*Math.PI/180) * L;
y1[0] = cy-Math.cos(angle*Math.PI/180) * L;
angle2=(angle2-deltaAngle)%360;
angle1=(angle1+deltaAngle)%360;
x1[1] = cx-Math.cos(angle1*Math.PI/180) * L1;//75
y1[1] = cy+Math.sin(angle1*Math.PI/180) * L1;//75
x1[2] = cx+Math.cos(angle2*Math.PI/180) * L1;//15
y1[2] = cy+Math.sin(angle2*Math.PI/180) * L1;//15
}
public void rotateRight(){
flag=(flag+1)%12;
angle = (-deltaAngle + angle)%360;
x1[0] = cx-Math.sin(angle*Math.PI/180) * L;
y1[0] = cy-Math.cos(angle*Math.PI/180) * L;
angle2=(angle2+deltaAngle)%360;
angle1=(angle1-deltaAngle)%360;
x1[1] = cx-Math.cos(angle1*Math.PI/180) * L1;//75
y1[1] = cy+Math.sin(angle1*Math.PI/180) * L1;//75
x1[2] = cx+Math.cos(angle2*Math.PI/180) * L1;//15
y1[2] = cy+Math.sin(angle2*Math.PI/180) * L1;//15
}
public boolean hit(Shape a){
Polygon p=new Polygon(new int[]{(int)x1[0],(int)x1[1],(int)x1[2]},new int[]{(int)y1[0],(int)y1[1],(int)y1[2]},3);
Area area=new Area(p);
area.intersect(new Area(a));
return area.isEmpty();
}
public void meback(){
this.x1[0]=150;this.x1[1]=135;this.x1[2]=165;
this.y1[0]=110;this.y1[1]=150;this.y1[2]=150;
this.cx=150;this.cy=135;
}
public void chongzhi(){
if(y1[0]<0&&y1[1]<0&&y1[2]<0){
y1[0]+=Height;
y1[1]+=Height;
y1[2]+=Height;
}else if(y1[0]>Height&&y1[1]>Height&&y1[2]>Height){
y1[0]-=Height;
y1[1]-=Height;
y1[2]-=Height;
}
if(x1[0]<0&&x1[1]<0&&x1[2]<0){
x1[0]+=Width;
x1[1]+=Width;
x1[2]+=Width;
}else if(x1[0]>Width&&x1[1]>Width&x1[2]>Width){
x1[0]-=Width;
x1[1]-=Width;
x1[2]-=Width;
}
}
}
package Asteroids;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.util.Arrays;
public class MeListener implements KeyListener,MouseListener {
private Picture picture;
public MeListener(Picture p) {
picture = p;
}
public void mouseClicked(MouseEvent e){
}
public void mousePressed(MouseEvent e) {
//if(e.getButton() == MouseEvent.BUTTON1) {
//if(e.getX()<300&&e.getY()>10&&e.getX()>200&&e.getY()<40)
//System.out.println("s");
// }
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void keyTyped(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_S){
picture.startflag=1;
}
if(picture.startflag==1){
if(e.getKeyCode() == KeyEvent.VK_ESCAPE){
picture.menuflag=(picture.menuflag+1)%2;
}
}
if(picture.startflag==1&&picture.mehuanum>150) {
if (picture.me.wudiflag != 1&&picture.menuflag==0) {
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
picture.me.rotateLeft();
} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
picture.me.rotateRight();
} else if (e.getKeyCode() == KeyEvent.VK_UP) {
picture.me.addspeed();
} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
picture.me.minusspeed();
} else if (e.getKeyCode() == KeyEvent.VK_SPACE) {
picture.BulletArray = Arrays.copyOf(picture.BulletArray, picture.BulletArray.length + 1);
picture.BulletArray[picture.BulletArray.length - 1] = new Bullet(picture.me.x1[0] - 2, picture.me.y1[0] - 2, picture.me.flag);
//在bulletlist添加一个Node
} else if (e.getKeyCode() == KeyEvent.VK_SHIFT) {
picture.shanxian();
}
picture.repaint();
}
if (picture.life <= 0) {
picture.life=0;
if (e.getKeyCode() == KeyEvent.VK_B) {
if (picture.score > picture.highest) picture.highest = picture.score;
picture.BulletArray = new Bullet[0];//创建一个子弹数组
picture.UFOArray = new UFO[0];//创建一个ufo数组
picture.UFOBulletArray = new Bullet[0];//创建一个ufo子弹数组
picture.asteroidsArray = new asteroids[0];//创建一个陨石数组
picture.ballArray = new Balldisappear[0];
picture.me = new Me();
picture.score = 0;
picture.ufobullettime = 0;
picture.asteroidstime = 0;
picture.ufoflag = 1;
picture.wudinum = 0;
picture.life = 3;
picture.scoretemp = 0;
picture.addasteroidsflag=0;
picture.addasteroidsnum=1;
picture.yy=-1000;
picture.mehuanum=0;
}
}
}
//实时更新
}
}
陨石
asteroids类实现了小陨石的各种操作,asteroidsl实现了中陨石的操作,asteroidsm实现了大陨石的操作。
package Asteroids;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;
import java.awt.Shape;
import java.awt.geom.Area;
public class asteroids {
double MIN_SPEED=0.5;
double MAX_SPEED=1.5;
double cx=Math.random()*1600,cy=Math.random()*1000;
double deltax=0;
double deltay=0;
double []x={-90,80,-10,10,30,-50};
double []y={-85,-45,-5,15,35,80};
int asteroidsflag=3;
int Height=Windows.HEIGHT.getValue();
int Width=Windows.WIDTH.getValue();
asteroids(){
double a=Math.random();
deltax=MIN_SPEED+Math.random()*(MAX_SPEED-MIN_SPEED);
deltay=MIN_SPEED+Math.random()*(MAX_SPEED-MIN_SPEED);
if(a<0.25){
cx=0;
}else if(a>=0.25&&a<0.5){
cy=0;
}else if(a>=0.5&&a<0.75){
cx=0;
cy=-cy;
}else if(a>=0.75){
cy=0;
cx=-cx;
}
if(Math.random()<=0.5){
deltax=-deltax;
}
if(Math.random()<=0.5){
deltay=-deltay;
}
for(int i=0;i<x.length;i++){
x[i]+=cx;
y[i]+=cy;
}
}
public void draw(Graphics g) {
int[] x1 = {(int) x[0], (int) x[1], (int) x[2], (int) x[3], (int) x[4], (int) x[5]};
int[] y1 = {(int) y[0], (int) y[1], (int) y[2], (int) y[3], (int) y[4], (int) y[5]};
g.setColor(Color.ORANGE);
g.drawPolygon(x1, y1, 6);
}
public boolean hit(Shape a){
Polygon p=new Polygon(new int[] {(int) x[0], (int) x[1], (int) x[2], (int) x[3], (int) x[4], (int) x[5]},
new int[] {(int) y[0], (int) y[1], (int) y[2], (int) y[3], (int) y[4], (int) y[5]},6);
Area area=new Area(p);
area.intersect(new Area(a));
return area.isEmpty();
}
public void fly(){
for(int i=0;i<x.length;i++){
x[i]+=deltax;
y[i]+=deltay;
}
cx+=deltax;
cy+=deltay;
chongzhiasteroids();
}
private void chongzhiasteroids(){
if(y[0]<0&&y[1]<0&&y[2]<0&&y[3]<0&&y[4]<0&&y[5]<0){
for(int i=0;i<x.length;i++){
y[i]+=Height;
}
cy+=Height;
}
else if(y[0]>Height&&y[1]>Height&&y[2]>Height&&y[3]>Height&&y[4]>Height&&y[5]>Height){
for(int i=0;i<x.length;i++){
y[i]-=Height;
}
cy-=Height;
}
if(x[0]<0&&x[1]<0&&x[2]<0&&x[3]<0&&x[4]<0&&x[5]<0){
for(int i=0;i<x.length;i++){
x[i]+=Width;
}
cx+=Width;
}else if(x[0]>Width&&x[1]>Width&x[2]>Width&&x[3]>Width&x[4]>Width&&x[5]>Width){
for(int i=0;i<x.length;i++){
x[i]-=Width;
}
cx-=Width;
}
}
}
package Asteroids;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Shape;
import java.awt.Polygon;
import java.awt.geom.Area;
public class asteroidsl extends asteroids {
double MIN_SPEEDM=1;
double MAX_SPEEDM=3;
double []xl={10,20,30,35,25};
double []yl={30,20,15,35,40};
int Height=Windows.HEIGHT.getValue();
int Width=Windows.WIDTH.getValue();
asteroidsl(double cx,double cy){
asteroidsflag=1;
deltax=MIN_SPEEDM+Math.random()*(MAX_SPEEDM-MIN_SPEEDM);
deltay=MIN_SPEEDM+Math.random()*(MAX_SPEEDM-MIN_SPEEDM);
this.cx=cx;
this.cy=cy;
if(Math.random()<=0.5){
deltax=-deltax;
}
if(Math.random()<=0.5){
deltay=-deltay;
}
for(int i=0;i<xl.length;i++){
xl[i]+=cx;
yl[i]+=cy;
}
}
public void draw(Graphics g) {
int[] x1 = {(int) xl[0], (int) xl[1], (int) xl[2], (int) xl[3], (int) xl[4]};
int[] y1 = {(int) yl[0], (int) yl[1], (int) yl[2], (int) yl[3], (int) yl[4]};
g.setColor(Color.ORANGE);
g.drawPolygon(x1, y1, 5);
}
public void fly(){
for(int i=0;i<xl.length;i++){
xl[i]+=deltax;
yl[i]+=deltay;
}
cx+=deltax;
cy+=deltay;
chongzhiasteroidsl();
}
public boolean hit(Shape a){
Polygon p=new Polygon(new int[] {(int) xl[0], (int) xl[1], (int) xl[2], (int) xl[3], (int) xl[4]},
new int[] {(int) yl[0], (int) yl[1], (int) yl[2], (int) yl[3], (int) yl[4]},5);
Area area=new Area(p);
area.intersect(new Area(a));
return area.isEmpty();
}
public void chongzhiasteroidsl(){
if(yl[0]<0&&yl[1]<0&&yl[2]<0&&yl[3]<0&&yl[4]<0){
for(int i=0;i<xl.length;i++){
yl[i]+=Height;
}
cy+=Height;
}else if(yl[0]>Height&&yl[1]>Height&&yl[2]>Height&&yl[3]>Height&&yl[4]>Height){
for(int i=0;i<xl.length;i++){
yl[i]-=Height;
}
cy-=Height;
}
if(xl[0]<0&&xl[1]<0&&xl[2]<0&&xl[3]<0&&xl[4]<0){
for(int i=0;i<xl.length;i++){
xl[i]+=Width;
}
cx+=Width;
}else if(xl[0]>Width&&xl[1]>Width&xl[2]>Width&&xl[3]>Width&xl[4]>Width){
for(int i=0;i<xl.length;i++){
xl[i]-=Width;
}
cy-=Width;
}
}
}
package Asteroids;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Shape;
import java.awt.Polygon;
import java.awt.geom.Area;
public class asteroidsm extends asteroids {
double MIN_SPEEDM=0.75;
double MAX_SPEEDM=2;;
double []xm={0,80,40,20,0,-20};
double []ym={20,80,100,60,80,60};
int Height=Windows.HEIGHT.getValue();
int Width=Windows.WIDTH.getValue();
asteroidsm(double cxm,double cym){
asteroidsflag=2;
deltax=MIN_SPEEDM+Math.random()*(MAX_SPEEDM-MIN_SPEEDM);
deltay=MIN_SPEEDM+Math.random()*(MAX_SPEEDM-MIN_SPEEDM);
this.cx=cxm;
this.cy=cym;
if(Math.random()<=0.5){
deltax=-deltax;
}
if(Math.random()<=0.5){
deltay=-deltay;
}
for(int i=0;i<xm.length;i++){
xm[i]+=cx;
ym[i]+=cy;
}
}
public void draw(Graphics g) {
int[] x1 = {(int) xm[0], (int) xm[1], (int) xm[2], (int) xm[3], (int) xm[4], (int) xm[5]};
int[] y1 = {(int) ym[0], (int) ym[1], (int) ym[2], (int) ym[3], (int) ym[4], (int) ym[5]};
g.setColor(Color.ORANGE);
g.drawPolygon(x1, y1, 6);
}
public void fly(){
for(int i=0;i<xm.length;i++){
xm[i]+=deltax;
ym[i]+=deltay;
}
cx+=deltax;
cy+=deltay;
chongzhiasteroidsm();
}
public boolean hit(Shape a){
Polygon p=new Polygon(new int[] {(int) xm[0], (int) xm[1], (int) xm[2], (int) xm[3], (int) xm[4], (int) xm[5]},
new int[] {(int) ym[0], (int) ym[1], (int) ym[2], (int) ym[3], (int) ym[4], (int) ym[5],},6);
Area area=new Area(p);
area.intersect(new Area(a));
return area.isEmpty();
}
public void chongzhiasteroidsm(){
if(ym[0]<0&&ym[1]<0&&ym[2]<0&&ym[3]<0&&ym[4]<0&&ym[5]<0){
for(int i=0;i<xm.length;i++){
ym[i]+=Height;
}
cy+=Height;
}else if(ym[0]>Height&&ym[1]>Height&&ym[2]>Height&&ym[3]>Height&&ym[4]>Height&&ym[5]>Height){
for(int i=0;i<xm.length;i++){
ym[i]-=Height;
}
cy-=Height;
}
if(xm[0]<0&&xm[1]<0&&xm[2]<0&&xm[3]<0&&xm[4]<0&&xm[5]<0){
for(int i=0;i<xm.length;i++){
xm[i]+=Width;
}
cx+=Width;
}else if(xm[0]>Width&&xm[1]>Width&xm[2]>Width&&xm[3]>Width&xm[4]>Width&&xm[5]>Width){
for(int i=0;i<xm.length;i++){
xm[i]-=Width;
}
cx-=Width;
}
}
}
UFO
与飞机、陨石的实现类似。
package Asteroids;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.geom.Area;
import java.awt.Polygon;
import java.awt.Shape;
public class UFO {
static double MAX_SPEED=3.5;
static double MIN_SPEED=1;
double deltax=0;
double deltay=0;
int Height=Windows.HEIGHT.getValue();
int Width=Windows.WIDTH.getValue();
double cx=Math.random()*Width,cy=Math.random()*Height;
double []x={-25,-20,-15,-15,15,15,20,25,20,-20};
double []y={0,-15,-15,-25,-25,-15,-15,0,15,15};
UFO(){
double a=Math.random();
deltax=MIN_SPEED+Math.random()*(MAX_SPEED-MIN_SPEED);
deltay=MIN_SPEED+Math.random()*(MAX_SPEED-MIN_SPEED);
if(a<0.25){
cx=0;
}else if(a>=0.25&&a<0.5){
cy=0;
}else if(a>=0.5&&a<0.75){
cx=0;
cy=-cy;
}else if(a>=0.75){
cy=0;
cx=-cx;
}
if(Math.random()<=0.5){
deltax=-deltax;
}
if(Math.random()<=0.5){
deltay=-deltay;
}
for(int i=0;i<10;i++){
x[i]+=cx;
y[i]+=cy;
}
}
public void draw(Graphics g) {
int[] x1 = {(int) x[0], (int) x[1], (int) x[2], (int) x[3], (int) x[4], (int) x[5], (int) x[6], (int) x[7], (int) x[8], (int) x[9]};
int[] y1 = {(int) y[0], (int) y[1], (int) y[2], (int) y[3], (int) y[4], (int) y[5], (int) y[6], (int) y[7], (int) y[8], (int) y[9]};
g.setColor(Color.CYAN);
g.drawPolygon(x1, y1, 10);
}
public void fly(){
for(int i=0;i<10;i++){
x[i]+=deltax;
y[i]+=deltay;
}
cx+=deltax;
cy+=deltay;
if(cx<0)cx+=Width;
else if(cx>Width)cx-=Width;
if(cy<0)cy+=Height;
else if(cy>Height)cy-=Height;
chongzhiUFO();
}
public boolean hit(Shape a){
Polygon p=new Polygon(new int[] {(int) x[0], (int) x[1], (int) x[2], (int) x[3], (int) x[4], (int) x[5], (int) x[6], (int) x[7], (int) x[8], (int) x[9]},
new int[] {(int) y[0], (int) y[1], (int) y[2], (int) y[3], (int) y[4], (int) y[5], (int) y[6], (int) y[7], (int) y[8], (int) y[9]},10);
Area area=new Area(p);
area.intersect(new Area(a));
return area.isEmpty();
}
public void chongzhiUFO(){
if(y[0]<0&&y[1]<0&&y[2]<0&&y[3]<0&&y[4]<0&&y[5]<0&&y[6]<0&&y[7]<0&&y[8]<0&&y[9]<0){
for(int i=0;i<10;i++){
y[i]+=Height;
}
}else if(y[0]>Height&&y[1]>Height&&y[2]>Height&&y[3]>Height&&y[4]>Height&&y[5]>Height&&y[6]>Height&&y[7]>Height&&y[8]>Height&&y[9]>Height){
for(int i=0;i<10;i++){
y[i]-=Height;
}
}
if(x[0]<0&&x[1]<0&&x[2]<0&&x[3]<0&&x[4]<0&&x[5]<0&&x[6]<0&&x[7]<0&&x[8]<0&&x[9]<0){
for(int i=0;i<10;i++){
x[i]+=Width;
}
}else if(x[0]>Width&&x[1]>Width&x[2]>Width&&x[3]>Width&x[4]>Width&&x[5]>Width&x[6]>Width&&x[7]>Width&x[8]>Width&&x[9]>Width){
for(int i=0;i<10;i++){
x[i]-=Width;
}
}
}
}
子弹
需要考虑子弹的类型、子弹的重置等操作。
package Asteroids;
import java.awt.*;
import java.awt.geom.Area;
public class Bullet {
double x=0,y=0;
int speed=9 ;
int count=0;
int flagbullet=0;
double speedx=0;
double speedy=0;
int Height=Windows.HEIGHT.getValue();
int Width=Windows.WIDTH.getValue();
// public Bullet(double xc,double yc,double mexc,double meyc){
// this.x=xc;
// this.y=yc;
// this.mex=mexc;
// this.mey=meyc;
// }
public Bullet(double x,double y,int flag){
this.x=x;
this.y=y;
this.flagbullet=flag;
if(flagbullet==0)speedy-=speed;
else if(flagbullet==1){speedy-=0.866*speed;speedx+=0.5*speed;}
else if(flagbullet==2){speedy-=0.5*speed;speedx+=0.866*speed;}
else if(flagbullet==3)speedx+=speed;
// k=(mey-y)/(mex-x);
else if(flagbullet==4){speedy+=0.5*speed;speedx+=0.866*speed;}
else if(flagbullet==5){speedy+=0.866*speed;speedx+=0.5*speed;}
else if(flagbullet==6)speedy+=speed;
else if(flagbullet==7){speedy+=0.866*speed;speedx-=0.5*speed;}
else if(flagbullet==8){speedy+=0.5*speed;speedx-=0.866*speed;}
else if(flagbullet==9)speedx-=speed;
else if(flagbullet==10){speedy-=0.5*speed;speedx-=0.866*speed;}
else if(flagbullet==11){speedy-=0.866*speed;speedx-=0.5*speed;}
}
public void draw(Graphics g) {
g.setColor(Color.WHITE);
g.fillOval((int)x, (int)y, 4, 4);
}
public void drawred(Graphics g) {
g.setColor(Color.RED);
g.fillOval((int)x, (int)y, 10, 10);
}
public void fly(){
y+=speedy;
x+=speedx;
count+=speed;
chongzhibullet();
}
public void setterx(int x){
this.x=x;
}
public void settery(int y){
this.y=y;
}
public boolean hit(Shape p) {
Rectangle a = new Rectangle((int)x, (int)y, 1, 1);
Area area=new Area(p);;
area.intersect(new Area(a));
return area.isEmpty();
}
private void chongzhibullet(){
if(x<0){
x+=Width;
}else if(x>Width){
x-=Width;
}
if(y<0){
y+=Height;
}else if(y>Height){
y-=Height;
}
}
}
碎片
碎片是飞机、陨石、UFO被击毁之后产生的,一段时间便会消失。
package Asteroids;
import java.awt.*;
import java.awt.Graphics;
public class Balldisappear {
double MIN_SPEED=1;
double MAX_SPEED=2;
double x=0,y=0;
int speed=3 ;
int count=0;
double speedy=0;
double speedx=0;
int flag=0;
double []xl={20,50};
double []yl={20,50};
Balldisappear(double x,double y){
this.speedx=MIN_SPEED+Math.random()*(MAX_SPEED-MIN_SPEED);
this.speedy=MIN_SPEED+Math.random()*(MAX_SPEED-MIN_SPEED);
this.x=x;
this.y=y;
if(Math.random()<=0.5){
speedx=-speedx;
}
if(Math.random()<=0.5){
speedy=-speedy;
}
}
public void draw(Graphics g){
g.setColor(Color.ORANGE);
g.fillOval((int)x, (int)y, 5, 5);
}
public void linepoint(){
for(int i=0;i<xl.length;i++){
xl[i]+=x;
yl[i]+=y;
}
}
public void drawline(Graphics g){
g.setColor(Color.GREEN);
g.drawPolyline(new int[]{(int)xl[0],(int)xl[1]}, new int[]{(int)yl[0],(int)yl[1]},2);
}
public void fly(){
y+=speedy;
x+=speedx;
count+=speed;
for(int i=0;i<xl.length;i++){
xl[i]+=speedx;
yl[i]+=speedy;
}
}
}
总结
一些代码的逻辑很不成熟,看个乐呵就行,但是这是我自己完成的第一个项目,挺有纪念意义的。
如果对飞机操作久的话飞机会闪烁(不知道为什么),可以用shift闪现重置飞机(因为是重新new了个飞机)。
对象都是用线条画出来的,不是很好看,下面是游戏界面:
需要把名为background1.jpg的背景图放在代码目录下(需要做背景图的扩展),下面是我用的背景图。