写一个简单地java项目——黄金矿工,首先建一个game包。
运行
package game;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
public class GameWin extends JFrame {
List<Object> objectList = new ArrayList<>();
bj bj = new bj();//背景
line line = new line(this);//抓取线
//gold gold = new gold();//金块
Image offScreenImage;
public static int state;//状态——开始:0,运行:1,成功:2,失败:3,商店:4
{
for (int i = 0; i<1; i++) {
objectList.add(new gold());
}
for (int i = 0; i<2; i++) {
objectList.add(new gold2());
}
for (int i = 0; i<3; i++) {
objectList.add(new gold3());
}
for (int i = 0; i<3; i++) {
objectList.add(new rock());
}
}//添加被抓取元素
void launch() {
this.setVisible(true);
this.setSize(666,638);
this.setLocationRelativeTo(null);
this.setTitle("抓住那个会动的!");
this.setResizable(false);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
switch(state) {
case 0:
if(e.getButton() == 3){
state = 1;
bj.start = System.currentTimeMillis();
}
break;
case 1:
if(e.getButton() == 1 && line.state == 0){
line.state = 1;
}
if(e.getButton() == 3 && line.state == 3&&bj.djNum>0){
bj.djFlag = true;
bj.djNum--;
}
break;
case 2:
if(e.getButton() == 1){
bj.shop = true;
}
if(e.getButton() == 3){
state = 1;
bj.start = System.currentTimeMillis();
}
break;
case 3:
if(e.getButton() == 1){
state = 0;
bj.reG();
line.reG();
}
break;
case 4:
if(e.getButton() == 1){
state = 0;
bj.reG();
line.reG();
}
break;
}
}
});
while(true) {
repaint();
nextL();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void nextL(){
if(bj.gTime() && state == 1) {
if (bj.count >= bj.goal) {
if(bj.level == 5){
state = 4;
}else{
state = 2;
bj.count = 0;
bj.level++;
}
}//else{
// state = 3;
//}
dispose();
GameWin gw = new GameWin();
gw.launch();
}
}
public void paint(Graphics g){
offScreenImage = this.createImage(666,638);
Graphics gImage = offScreenImage.getGraphics();
bj.begin(gImage);
if(state == 1) {
bj.paintBJOne(gImage);
bj.paintBJTwo(gImage);
bj.paintPeople(gImage);
line.paintLine(gImage);
for (Object Obj : objectList) {
Obj.paintSelf(gImage);
}
}
//gold.paintSelf(gImage);//金块
g.drawImage(offScreenImage, 0, 0, null);
}
public static void main(String[] args){
GameWin GW = new GameWin();
GW.launch();
}
}
背景类
package game;
import java.awt.*;
public class bj {
static int level = 1;
static int goal = level*5;
static int count = 0;
static int djNum = 3;
long start;
long end;
static boolean djFlag = false;
int price = 7;
boolean shop = false;
Image bbj = Toolkit.getDefaultToolkit().getImage("goldP/bbj.jpg");
Image bj = Toolkit.getDefaultToolkit().getImage("goldP/bjD.jpg");
Image bj2 = Toolkit.getDefaultToolkit().getImage("goldP/bjT.jpg");
Image peo = Toolkit.getDefaultToolkit().getImage("goldP/peo.png");
Image dj = Toolkit.getDefaultToolkit().getImage("goldP/dj.jpg");
void begin (Graphics g){
switch(GameWin.state) {
case 0:
g.drawImage(bbj, 0, 0, null);
drawWord(g, 40, Color.black, "单击右键开始游戏", 140, 330);
break;
}
}
void paintBJOne (Graphics g){
switch(GameWin.state) {
case 1:
g.drawImage(bj, 0, 138, null);
break;
}
}
void paintBJTwo (Graphics g){
switch(GameWin.state) {
case 1:
g.drawImage(bj2, 0, 0, null);
drawWord(g, 30, Color.black, "总分:" + count, 30, 90);
g.drawImage(dj, 535, 70, null);
drawWord(g, 30, Color.black, "*" + djNum, 590, 100);
drawWord(g, 20, Color.black, "第" + level + "关", 30, 60);
drawWord(g, 20, Color.black, "目标积分:" + level * 5, 100, 60);
end = System.currentTimeMillis();
long time = 20-(end-start)/1000;
drawWord(g, 30, Color.black, "时间" + (time>0?time:0)+"秒", 500, 60);
break;
case 2:
g.drawImage(dj, 300, 300, null);
drawWord(g, 30, Color.black, "价格" + price, 400, 315);
drawWord(g, 30, Color.black, "是否购买", 355, 330);
if(shop) {
count = count-price;
djNum++;
shop = false;
GameWin.state = 1;
start = System.currentTimeMillis();
}
break;
case 3:
g.drawImage(bbj, 0, 0, null);
drawWord(g, 40, Color.black, "失败", 140, 330);
drawWord(g, 30, Color.black, "总分:" + count, 30, 90);
break;
case 4:
g.drawImage(bbj, 0, 0, null);
drawWord(g, 40, Color.black, "通关", 140, 330);
break;
}
}
void paintPeople (Graphics g){
switch(GameWin.state) {
case 1:
g.drawImage(peo, 309, 82, null);
break;
}
}
boolean gTime() {//倒计时
long t = (end-start)/1000;
if(t>20){
return true;
}
return false;
}
void reG() {
level = 1;
goal = level*5;
count = 0;
djNum = 3;
djFlag = false;
}
public static void drawWord(Graphics g,int size,Color color,String str,int x,int y) {//设置字体属性
g.setColor(color);
g.setFont(new Font("隶书",Font.BOLD,size));
g.drawString(str,x,y);
}
}
抓取线及抓取类
package game;
import java.awt.*;
public class line {
int xb = 339;
int yb = 138;
int xe = 500;
int ye = 500;
double length = 50;
double minL = 50;
double maxL = 600;
double angle = 0;
int dir = 1;
int state;
Image hook = Toolkit.getDefaultToolkit().getImage("goldP/hook.jpg");
GameWin frame;
line(GameWin frame) {
this.frame = frame;
}
void logic() {
for(Object Obj:this.frame.objectList) {
if (xe > Obj.x && xe < Obj.x + Obj.width
&& ye > Obj.y && ye < Obj.y + Obj.height) {
state = 3;
Obj.flag = true;
}
}
}
void paintLine(Graphics g) {
logic();
switch (state) {
case 0:
if(angle<0) {
dir = 1;
}else if(angle>1){
dir = -1;
}
angle = angle+0.005*dir;
xe = (int) (xb+length*Math.cos(angle*Math.PI));
ye = (int) (yb+length*Math.sin(angle*Math.PI));
g.setColor(Color.black);
g.drawLine(xb, yb, xe, ye);
g.drawImage(hook,xe-36,ye,null);
break;
case 1:
if(length<maxL){
length = length+5;
xe = (int) (xb+length*Math.cos(angle*Math.PI));
ye = (int) (yb+length*Math.sin(angle*Math.PI));
g.setColor(Color.black);
g.drawLine(xb-1, yb, xe-1, ye);
g.drawLine(xb+1, yb, xe+1, ye);
g.drawLine(xb, yb, xe, ye);
g.drawImage(hook,xe-36,ye,null);
}else {
state = 2;
}
break;
case 2:
if(length>minL){
length = length-5;
xe = (int) (xb+length*Math.cos(angle*Math.PI));
ye = (int) (yb+length*Math.sin(angle*Math.PI));
g.setColor(Color.black);
g.drawLine(xb-1, yb, xe-1, ye);
g.drawLine(xb+1, yb, xe+1, ye);
g.drawLine(xb, yb, xe, ye);
g.drawImage(hook,xe-36,ye,null);
}else {
state = 0;
}
break;
case 3:
int m = 1;
if(length>50){
length = length-5;
xe = (int) (xb+length*Math.cos(angle*Math.PI));
ye = (int) (yb+length*Math.sin(angle*Math.PI));
g.setColor(Color.black);
g.drawLine(xb-1, yb, xe-1, ye);
g.drawLine(xb+1, yb, xe+1, ye);
g.drawLine(xb, yb, xe, ye);
for(Object Obj:this.frame.objectList) {
if(Obj.flag){
m = Obj.m;
Obj.x = xe - Obj.getWidth()/2;
Obj.y = ye;
if(length <= 50) {
Obj.x = -150;
Obj.y = -150;
Obj.flag = false;
bj.djFlag = false;
bj.count += Obj.count;
state = 0;
}
if(bj.djFlag){
if(Obj.type == 0){
m = 1;
}
if(Obj.type == 1){
Obj.x = -150;
Obj.y = -150;
Obj.flag = false;
bj.djFlag = false;
state = 2;
}
}
}
}
}
try {
Thread.sleep(m);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
}
}
void reG() {
length = 50;
angle = 0;
}
}
金块及石块类
package game;
import java.awt.*;
public class Object {
boolean flag;
int x;
int y;
int width;
int height;
int m;
int count;
int type; //动:0,静:1
Image img;
void paintSelf(Graphics g) {
g.drawImage(img,x,y,null);
}
public int getWidth() {
return width;
}
}
package game;
import java.awt.*;
public class gold extends Object {
boolean flag = false;
gold() {
this.x = (int)(Math.random()*660);
this.y = (int)(Math.random()*400+200);
this.width = 50;
this.height = 50;
this.m = 50;
this.flag = false;
this.count = 8;
this.type = 0;
this.img = Toolkit.getDefaultToolkit().getImage("goldP/gold3.gif");
}
}
package game;
import java.awt.*;
public class rock extends Object{
boolean flag = false;
rock() {
this.x = (int)(Math.random()*660);
this.y = (int)(Math.random()*400+200);
this.width = 52;
this.height = 52;
this.m = 100;
this.count = -10086;
this.type = 1;
this.flag = false;
this.img = Toolkit.getDefaultToolkit().getImage("goldP/rock1.png");
}
}
图片素材有一个天空背景、一个地面背景、一个人物、一个勾爪、不同大小的金块、石块及药水。