项目完整代码已放到码云上 自行下载: https://gitee.com/tutu_57893_7590/planets

学完javaee基础,编的一个小游戏—太阳系的八大行星

要使太阳系的八大行星,围绕着太阳运转,这中间要运用到Java基础课本中的许多知识点,包括:继承,封装,多态,有参/无参构造器,图片加载,窗口定义,多线程,算法等。

现在为大家一步步讲解如何编写这个小游戏,

1) 首先,编写代码之前,你们要用到这个软件eclipse ,专门用来编译并运行这些程序 打开下面网址进行下载:http://www.eclipse.org/downloads/

2)下载安装并打开会看到这个界面

3)要想行星围绕太阳运转,则必须加载出一个窗口,让其能展现出来

1)创建一个加载窗口的类,代码如下:

package cn.liyaozhou.util;

import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MyFrame extends Frame {
// 加载窗口
public void launchFrame() {
// 定义窗口大小
setSize(Constant.GAME_HIGH, Constant.GAME_WIDTH);
// 定义窗口位置
setLocation(100,10);
// 定义窗口是可看见的
setVisible(true);

new PaintThread().start();// 启动重画线程
// 增加个窗口监听
addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}

/**
* 定义一个重画窗口的线程类,是一个内部类

* @param liyaozhou
*/
class PaintThread extends Thread {

public void run() {
while (true) {
repaint();
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}

2) 窗口出来之后,然后要加载图片,定义一个加载图片的类,代码如下:

package cn.liyaozhou.util;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;

/**
 * 游戏开发中常用的工具类(比如:加载图片等方法)
 * 
 * @author liyaozhou
 * 
 */
public class Picture {

public static Image getImage(String path) {
URL u = Picture.class.getClassLoader().getResource(path);
BufferedImage img = null;
try {
img = ImageIO.read(u);
} catch (IOException e) {
e.printStackTrace();
}
return img;
}
}

3) 窗口,图片都定义好之后,然后编写代码让其8大行星围绕太阳运转,代码如下:

package cn.liyaozhou.salor;

import java.awt.Graphics;
import java.awt.Image;

import cn.liyaozhou.util.Constant;
import cn.liyaozhou.util.MyFrame;
import cn.liyaozhou.util.Picture;

/**
 * 太阳系的主窗口
 * 
 * @author dell
 * 
 */

public class SolarFrame extends MyFrame {

Image img = Picture.getImage("imager/bg.jpg");
Star sun = new Star("imager/sun.jpg", Constant.GAME_HIGH / 2,
Constant.GAME_WIDTH / 2);

Planet mercury = new Planet(sun, "imager/Mercury.jpg", 50, 30, 0.6);// 水星
Planet venus = new Planet(sun, "imager/Venus.jpg", 80, 50, 0.4); // 金星
Planet earth = new Planet(sun, "imager/Earth.jpg", 120, 75, 0.25); // 地球
Planet mars = new Planet(sun, "imager/Mars.jpg", 170, 120, 0.18); // 火星
Planet jupiter = new Planet(sun, "imager/Jupiter.jpg", 210, 150, 0.15); // 木星
Planet saturn = new Planet(sun, "imager/Saturn.jpg", 240, 180, 0.1);// 土星
Planet uranus = new Planet(sun, "imager/Uranus.jpg", 320, 220, 0.07); // 天王星
Planet neptune = new Planet(sun, "imager/Neptune.jpg", 370, 280,0.04 ); // 海王星

public void paint(Graphics g) {
g.drawImage(img, 0, 0, null);
sun.draw(g);
mercury.draw(g);
venus.draw(g);
earth.draw(g);
mars.draw(g);
jupiter.draw(g);
saturn.draw(g);
uranus.draw(g);
neptune.draw(g);

}

public static void main(String[] args) {
new SolarFrame().launchFrame();
}

}

4) 最后出来的运行结果如下:

最后将总的代码上传进来:

需要在eclipse软件中创建两个包( package),和一个文件夹(folder)。

创建包和文件夹的时候在界面的左半边点击鼠标右键,然后再new中选中package 和folder

1)包名应该倒着命名 比如:cn.liyaozhou.solar

2)文件夹命名一般用小写英文字母。比如:imager

如下图


3)创建完2个包和一个文件夹之后,在第一个包中创建三个类名  将鼠标放入包那快,单击鼠标右键,选择class 然后为其命名Planet,SolarFrame,Star 等三个类

在第二个包中创建三个类名  将鼠标放入包那快,单击鼠标右键,选择class 然后为其命名Constant,MyFrame,Picture 等三个类

下面是六个类的代码分别如下:

1 Planet

package cn.liyaozhou.salor;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Image;

import cn.liyaozhou.util.Picture;

public class Planet extends Star {

// 除了图片,坐标。行星沿着某个椭圆运行;长轴,短轴 速度。绕着某个 Star飞。

double longAxis; // 椭圆的长轴;

double shortAxis; // 椭圆的短轴;

double speed; // 飞行的速度;

double degree;// 飞行的角度

Star center; // 太阳的中心

public void draw(Graphics g) { // Graphics 制图 (重画)

super.draw(g); // 调用父类画的太阳。

drawTrace(g); // 画出 地球绕着太阳转的轨迹

move();// 调用地球移动的轨迹

}

public void drawTrace(Graphics g) {

// 定义地球绕太阳转的轨迹

double ovalX; // 定义地球绕太阳旋转的长轴

double ovalY; // 定义地球绕太阳旋转的短轴

double ovalWidth; // 定义地球绕太阳旋转的总宽度

double ovalHeight; // 定义地球绕太阳旋转的总高度

ovalWidth = longAxis * 2;// 总宽度等于椭圆的长轴x2;

ovalHeight = shortAxis * 2;// 总高度等于椭圆的短轴x2;

ovalX = (center.x + center.width / 2) - longAxis;

ovalY = (center.y + center.height / 2) - shortAxis;

// 保存原来的颜色;

Color c = g.getColor();

// 创建一个新的颜色

g.setColor(Color.blue);

// 画出椭圆的轨迹

g.drawOval((int) ovalX, (int) ovalY, (int) ovalWidth, (int) ovalHeight);

// 恢复原先的颜色

g.setColor(c);

}

public void move() {

// 沿着椭圆轨迹飞行

x = center.x + longAxis * Math.cos(degree); // 太阳的圆心+椭圆长轴*每次旋转所转过的角度

y = center.y + shortAxis * Math.sin(degree);// 太阳的圆心+椭圆短轴*每次旋转所转过的角度

degree += speed; // 每旋转一次角度加1

}

public Planet(Star center, String imgpath, double longAxis,

double shortAxis, double speed) {

this.center = center;

this.x = center.x + longAxis; // 行星的x轴坐标等于太阳的x轴坐标加上长轴的坐标

this.y = center.y; // 行星的y轴坐标等于太阳的y轴坐标

this.img = Picture.getImage(imgpath);

this.longAxis = longAxis;

this.shortAxis = shortAxis;

this.speed = speed;

}

// 定义三个有参的行星构造器

public Planet(Image img, double x, double y) {

super(img, x, y);

}

// 定义三个有参的行星对的路径

public Planet(String imgpath, double x, double y) {

super(imgpath, x, y);

}

}

2) SolarFrame类

package cn.liyaozhou.salor;

import java.awt.Graphics;

import java.awt.Image;

import cn.liyaozhou.util.Constant;

import cn.liyaozhou.util.MyFrame;

import cn.liyaozhou.util.Picture;

/**

* 太阳系的主窗口

*

* @author dell

*

*/

public class SolarFrame extends MyFrame {

Image img = Picture.getImage("imager/bg.jpg");

Star sun = new Star("imager/sun.jpg", Constant.GAME_HIGH / 2,

Constant.GAME_WIDTH / 2);

Planet mercury = new Planet(sun, "imager/Mercury.jpg", 50, 30, 0.6);// 水星

Planet venus = new Planet(sun, "imager/Venus.jpg", 80, 50, 0.4); // 金星

Planet earth = new Planet(sun, "imager/Earth.jpg", 120, 75, 0.25); // 地球

Planet mars = new Planet(sun, "imager/Mars.jpg", 170, 120, 0.18); // 火星

Planet jupiter = new Planet(sun, "imager/Jupiter.jpg", 210, 150, 0.15); // 木星

Planet saturn = new Planet(sun, "imager/Saturn.jpg", 240, 180, 0.1);// 土星

Planet uranus = new Planet(sun, "imager/Uranus.jpg", 320, 220, 0.07); // 天王星

Planet neptune = new Planet(sun, "imager/Neptune.jpg", 370, 280,0.04 ); // 海王星

public void paint(Graphics g) {

g.drawImage(img, 0, 0, null);

sun.draw(g);

mercury.draw(g);

venus.draw(g);

earth.draw(g);

mars.draw(g);

jupiter.draw(g);

saturn.draw(g);

uranus.draw(g);

neptune.draw(g);

}

public static void main(String[] args) {

new SolarFrame().launchFrame();

}

}

3)Star类

package cn.liyaozhou.salor;

import java.awt.Graphics;

import java.awt.Image;

import cn.liyaozhou.util.Picture;

public class Star {

Image img; // 定义太阳的图片

double x, y; // 定义太阳的长和宽

double width, height; // 定义太阳的高度与宽度

public void draw(Graphics g) { // Graphics 制图

// 画出太阳所在的位置

g.drawImage(img, (int) x, (int) y, null);

}

// 定义个无参的太阳构造器

public Star() {

}

// 定义个有参的太阳构造器

public Star(Image img, double x, double y) {

this.img = img;

this.x = x;

this.y = y;

}

// 定义个有参的图片路径

public Star(String imgpath, double x, double y) {

this.img = Picture.getImage(imgpath);

this.x = x;

this.y = y;

}

}

4)Constant类

package cn.liyaozhou.util;

public class Constant {

public static final int GAME_WIDTH = 850;

public static final int GAME_HIGH = 800;

}

5)Myframe 类

package cn.liyaozhou.util;

import java.awt.Frame;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

public class MyFrame extends Frame {

// 加载窗口

public void launchFrame() {

// 定义窗口大小

setSize(Constant.GAME_HIGH, Constant.GAME_WIDTH);

// 定义窗口位置

setLocation(100,10);

// 定义窗口是可看见的

setVisible(true);

new PaintThread().start();// 启动重画线程

// 增加个窗口监听

addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});

}

/**

* 定义一个重画窗口的线程类,是一个内部类

*

* @param liyaozhou

*/

class PaintThread extends Thread {

public void run() {

while (true) {

repaint();

try {

Thread.sleep(40);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

}

6)Picture 类

package cn.liyaozhou.util;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.net.URL;

import javax.imageio.ImageIO;

/**

* 游戏开发中常用的工具类(比如:加载图片等方法)

*

* @author liyaozhou

*

*/

public class Picture {

public static Image getImage(String path) {

URL u = Picture.class.getClassLoader().getResource(path);

BufferedImage img = null;

try {

img = ImageIO.read(u);

} catch (IOException e) {

e.printStackTrace();

}

return img;

}

}

下面是文件夹(folder)存放的图片 将这些图片下载出来直接复制粘贴到那个文件夹里

添加完之后,所有程序就全部完成,点击运行 将鼠标放在SolarFrame类的代码处,单击右键,会看到Run As   然后运行就OK。

学完javaee基础,编的一个小游戏—太阳系的八大行星相关推荐

  1. c语言小游戏 精简_【原创】用非常简单的c语言自编的一个小游戏

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 修改过后: #include #include void js(int); int qian = 1000; int x = 0; int main() ...

  2. 学完java基础语法之后用来练习的不依赖框架的小项目

    刚学完一门语言基础语法之后,一般都需要写一些小项目来检验我们的学习效果,将所学的基础语法串联起来,同时也熟悉一下用这门语言做项目的大概流程.但是此时学习的项目不能太复杂,因此此时才刚学完基础语法,太复 ...

  3. 学完css,做了一个csdn导航栏(一步一步做csdn导航栏,内容满满)

    学完css,做了一个csdn导航栏,内容满满 步骤 1.导航栏框架 2.导航栏左边部分 3.导航栏中间部分 4.导航栏右边部分 5.搜索框聚焦和用户头像简介信息展示 知识点 完整代码 番外:本来打算做 ...

  4. unity做一个小游戏(适合零基础或者巩固加深unity中的工具类的用法)

    今天跟着官方unity做了一个小游戏.巩固一下之前学习的unity的知识.注意unity的版本要在2018.3以上 大概游戏是这样子的如图:人物只能控制左右移动,空格发射饼干,动物从屏幕上方随机出现在 ...

  5. 适合刚学js小白熟悉运算符的一个小页面

    ** 适合刚学js小白熟悉运算符的一个小页 ** 刚学习js的小白,对于运算符上手的没那么快的,可以着手尝试一下这种简单,对逻辑提升比较快的小页面 因为我也是一个萌新,只是感觉这个页面帮助很大,所以分 ...

  6. 转王玮文章:我编的一个小段子让公众对区块链误会了两年

    [孟岩按]王玮是我多年好友,江湖人称"玮哥". 十多年前在南天集团技术负责人的位置上,主持了当时全球最大的分布式核心银行系统的开发,开所谓"去 IOE" 之先声 ...

  7. 《教我兄弟学Android逆向03 破解第一个Android游戏 》

    上一篇 <教我兄弟学Android逆向02  破解第一个Android程序  >我带着你破解了我们自己编的一个小程序 里面我分析并讲解的一些smali语法你都记住了 给你布置的课后作业你发 ...

  8. 表白小游戏教程:制作一个小游戏送给喜欢的TA(不会编程也能学会哦)

    大家好哇~ 欢迎翻开波波和阿菌的长篇故事~ 不过捏,今天我们不讲故事,今天将由阿菌和大家分享一个小教程:教大家制作一个小游戏,可以用来送给喜欢的人.无须任何计算机专业基础,只要能操作电脑,并在初一的数 ...

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

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

最新文章

  1. Maltego更新到4.1.6
  2. mvp的全称_现役最强外援,总决赛MVP,来到CBA之后赚了多少钱?
  3. java 手势识别_java – 如何在Android中实现手势识别
  4. 2019年十大AI创业死亡名单:无人车机器人为主,B轮阵亡最多
  5. 20155313 2016-2017-2 《Java程序设计》第二周学习总结
  6. 在表示计算机内存储器容量时 1gb等于,在表示计算机内存储器容量时,1GB等于_________MB...
  7. 人大计算机在职考研好考吗,人大在职研究生好考吗?通过率高吗?
  8. Nodejs开发框架Express3.0开发手记
  9. 蓝桥杯 BASIC-3 基础练习 字母图形
  10. 安徽新华学院计算机设计大赛,第十届中国大学生计算机设计大赛在安徽新华学院开幕...
  11. Android(java)学习笔记155:中文乱码的问题处理(qq登录案例)
  12. php url重写的模式,浅析ThinkPHP中的pathinfo模式和URL重写
  13. Gurobi运筹学开发教程04:拉格朗日分解技术及其实现
  14. 苹果设备解锁工具iToolab UnlockGo Mac
  15. Windows防火墙设置
  16. 数值分析Guass分解——错误讨论
  17. redis源码阅读三-终于把主线任务执行搞明白了
  18. pac代理模式什么意思_PAC是什么意思
  19. 使用Docker制作镜像并推送到镜像仓库
  20. SpeexDsp回音消除的一些理解

热门文章

  1. 超级计算机泰坦 amd,再见推土机:搭载AMD皓龙处理器的泰坦超算退役
  2. 安全防御之防火墙篇(二)
  3. Threejs 拓展之二进制数组
  4. linux0.99网络模块-网络层(接收)
  5. 可爱粉红色情人节表白浪漫婚礼相册我们结婚啦PPT模板
  6. 费斯托FB33阀岛简介
  7. MTK/Android GPS 相关
  8. ROS重装及恢复出厂设置
  9. JavaScript:回调函数(callback)
  10. NEUQ2022第一次双周赛题解