JAVA实现的飞机大战小游戏-Asteroids

  • 背景
  • 要求
    • 陨石
    • 飞机
    • UFO
  • 代码逻辑
    • 窗口
    • 画布
    • 飞机
    • 陨石
    • UFO
    • 子弹
    • 碎片
  • 总结

背景

这是大二上学期面向对象编程课(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坐标增20g.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;//75y1[1] = cy+Math.sin(angle1*Math.PI/180) * L1;//75x1[2] = cx+Math.cos(angle2*Math.PI/180) * L1;//15y1[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;//75y1[1] = cy+Math.sin(angle1*Math.PI/180) * L1;//75x1[2] = cx+Math.cos(angle2*Math.PI/180) * L1;//15y1[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的背景图放在代码目录下(需要做背景图的扩展),下面是我用的背景图。

JAVA实现的飞机大战小游戏-Asteroids相关推荐

  1. 【Java代码实现飞机大战小游戏】简单理解

    飞机大战 飞机大战小游戏历经10天完成,主要用到的就是我们面向对象部分的知识:类,封装,继承,多态,静态代码块等等内容+swing部分内容.所以即使你是java小白,也不用担心欧! 游戏说明:游戏有3 ...

  2. Java基础(飞机大战小游戏)

    学校课程作品,Java简易飞机大战 涉及Java基础知识,通过编写对基础能有不错的巩固和拓展. 首先,先编写出游戏的窗口.游戏获胜条件以及main方法 package com.Mygame3.Plan ...

  3. java项目---全民飞机大战小游戏

    项目素材下载地址:https://download.csdn.net/download/m0_51152186/83604685 源码地址:https://download.csdn.net/down ...

  4. 基于Java语言在窗体上实现飞机大战小游戏

    全套资料下载地址:https://download.csdn.net/download/sheziqiong/85594271 项目介绍 飞机大战:用 Java 语言在窗体上实现飞机大战小游戏,运行程 ...

  5. 【Java】Java基础飞机大战小游戏完整代码

    Java基础飞机大战小游戏完整代码 先来展示一下代码实现结果图 主函数ShootGame 初始化游戏原始背景图片,游戏人物图片,游戏开始结束图片:构建产生敌人算法:产生英雄机算法:发射子弹算法:判断是 ...

  6. 点击list view中一行内容可以在combox中显示_java版飞机大战小游戏详细教程(零基础小白也可以分分钟学会!)...

    一:游戏展示 飞机大战小游戏我们都玩过,通过移动飞机来打敌机,这里给大家展示一下游戏成果:呜呜呜由于gif只能上传5M大小,所以就不能给大家展示操作了,如果大家有兴趣可以自己自己做出来再玩哟. 这里面 ...

  7. python 飞机大战小游戏

    飞机大战小游戏,这里需要下载pygame模块 这是需要的素材,需要的自取: 上代码: import time import pygame from pygame.locals import *#检测事 ...

  8. 飞机大战小游戏(超详细)

    偷学Python之最后的项目二:飞机大战小游戏(超详细) 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志.--苏轼 甜甜先说 这次用Python中的pygame模块来完成一个飞机大战的小游戏:基本思 ...

  9. matlab飞机大战小游戏(第二版)

    第一版链接:https://blog.csdn.net/slandarer/article/details/88025006 游戏截图: ------------------------ 游戏动图: ...

  10. 使用小程序制作一个飞机大战小游戏

    此文主要基于微信小程序制作一个飞机大战小游戏,上手即用,操作简单. 一.创建小程序 二.页面实现 三.代码块 一.创建小程序 访问微信公众平台,点击账号注册. 选择小程序,并在表单填写所需的各项信息进 ...

最新文章

  1. MySQL jfinal 生成数据_JFinal Web开发学习(四)数据库连接与自动生成model
  2. VTK:IO之GenericDataObjectReader
  3. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结(转)
  4. python 并列条形图_python – 来自两个pandas数据框的分组条形图
  5. python连接wws协议和http协议时ssl验证失败
  6. django的models常用字段、属性
  7. SQL Server 变量名称的Collcation跟Instance还是跟当前DB?
  8. JVM超神之路:年后跳槽需要的JVM知识点,周末给你整理了一份!!!
  9. php ci框架中脚手架是做什么用的
  10. android java 同步_Android 中的同步
  11. mysql命令行导入csv_MySQL命令行导入CSV文件
  12. 如何学习编程、一门编程语言怎么算入门、快速掌握一门编程语言
  13. 优动漫PAINT之绘画助手软件简介
  14. python 代码转程序_python2代码转python3
  15. HTML5菜单栏特效
  16. 网络舆情源头管理方案
  17. 下一代微服务!Service Mesh 2018年度总结
  18. days month 間隔
  19. Hadoop-HDFS学习课件
  20. 程序员面试题精选100题(51)-顺时针打印矩阵

热门文章

  1. 上海泛微面经(从Java开发到项目实施岗)
  2. Jetson nano 开机自动连接 Wifi
  3. JS代码:当前日期时分秒加30分钟
  4. c语言程序评委评分,c语言编程:歌唱比赛评委评分系统
  5. 【路径规划】基于改进差分实现三维多无人机协同航迹规划matlab源码
  6. (已解决)windows2020卸载office2013(安装程序包语言不受系统支持)
  7. 用计算机弹音乐的歌谱《奇迹再现》,奇迹再现曲谱_奇迹再现的歌谱
  8. 2018---2019 数学四班张子琪 C语言设计总结
  9. 徐耀赐:道路安全——交通安全会议整理稿(1)
  10. gb28181协议流媒体实现为rtp荷载ps流,将h264流打包成ps流。