目录
一.游戏视频
黄金矿工小游戏
二.游戏代码
1.Bg
package com.sxt;
import java.awt.*;
public class Bg {
//关卡数
static int level = 1;
//目标得分
int goal = level*15;
//总分
static int count=0;
//药水数量
static int waterNum = 3;
//药水状态,默认F,T 正在使用 F 无法使用
static boolean waterFlag = false;
//开始时间
long startTime;
//结束时间
long endTime;
//药水价格
int price = (int) (Math.random()*10);
//是否进入商店 f 不购买
boolean shop = false;
//载入图片
Image bg = Toolkit.getDefaultToolkit().getImage("imgs/bg.jpg");
Image bg1 = Toolkit.getDefaultToolkit().getImage("imgs/bg1.jpg");
Image peo = Toolkit.getDefaultToolkit().getImage("imgs/peo.png");
Image water = Toolkit.getDefaultToolkit().getImage("imgs/water.png");
//绘制
void paintSelf(Graphics g){
g.drawImage(bg1,0,0,null);
g.drawImage(bg,0,200,null);
switch (GameWin.state){
case 0:
drawWord(g,80,Color.green,"准备开始",200,400);
break;
case 1:
g.drawImage(peo,310,50,null);
drawWord(g,30,Color.black,"积分:"+count,30,150);
//药水组件
g.drawImage(water,450,40,null);
drawWord(g,30,Color.black,"*"+waterNum,510,70);
//关卡数
drawWord(g,20,Color.black,"第"+level+"关",30,60);
//目标积分
drawWord(g,30,Color.black,"目标"+goal,30,110);
//时间组件
endTime = System.currentTimeMillis();
long tim = 20-(endTime-startTime)/1000;
drawWord(g,30,Color.black,"时间:"+(tim>0?tim:0),520,150);
break;
case 2:
g.drawImage(water,300,400,null);
drawWord(g,30,Color.black,"价格:"+price,300,500);
drawWord(g,30,Color.black,"是否购买?",300,550);
if(shop){
count = count-price;
waterNum++;
shop=false;
GameWin.state=1;
startTime=System.currentTimeMillis();
}
break;
case 3:
drawWord(g,80,Color.cyan,"失败",250,350);
drawWord(g,80,Color.cyan,"积分:"+count,200,450);
break;
case 4:
drawWord(g,80,Color.red,"成功",250,350);
drawWord(g,80,Color.red,"积分:"+count,200,450);
break;
default:
}
}
//t倒计时完成 f正在倒计时
boolean gameTime(){
long tim = (endTime-startTime)/1000;
if(tim>20){return true;}
return false;
}
//重置元素
void reGame(){
//关卡数
level = 1;
//目标得分
goal = level*15;
//总分
count=0;
//药水数量
waterNum = 3;
//药水状态,默认F,T 正在使用 F 无法使用
waterFlag = 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);
}
}
2.GameWin
package com.sxt;
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 {
//0未开始 1 运行中 2 商店 3 失败 4 胜利
static int state;
//存储金块,石块
List<Object> objectList = new ArrayList<>();
Bg bg = new Bg();
Line line = new Line(this);
{
//是否可以放置
boolean isPlace = true;
for (int i = 0; i < 11; i++) {
double random =Math.random();
Gold gold;//存放当前生成的金块
if(random<0.3){gold = new GoldMini();}
else if(random<0.7){ gold = new Gold();}
else { gold = new GoldPlus();}
for(Object obj:objectList){
if(gold.getRec().intersects(obj.getRec())){
//不可放置,需要重新生成
isPlace=false;
}
}
if(isPlace){objectList.add(gold);}
else {isPlace=true;i--;}
}
for (int i = 0; i < 5; i++) {
Rock rock=new Rock();
for(Object obj:objectList){
if(rock.getRec().intersects (obj.getRec()))
{ isPlace=false; }
}
if(isPlace){ objectList.add(rock); }
else{isPlace=true;i--;}
}
}
//缓存画布
Image offScreenImage;
//窗口设置
void launch(){
this.setVisible(true);
this.setSize(768,1000);
this.setLocationRelativeTo(null);
this.setTitle("尚学堂黄金矿工");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
switch (state){
case 0:
if(e.getButton()==3){
state=1;
bg.startTime = System.currentTimeMillis();
}
break;
case 1:
//左右摇摆,点击左键
if(e.getButton()==1&&line.state==0)
{line.state=1;}
//抓取返回,点击右键
if(e.getButton()==3&&line.state==3&&Bg.waterNum>0){
Bg.waterFlag=true;
Bg.waterNum--;
}
break;
case 2:
if(e.getButton()==1){
bg.shop=true;
}
if (e.getButton()==3){
state=1;
bg.startTime = System.currentTimeMillis();
}
break;
case 3:
case 4:
if(e.getButton()==1){
state=0;
bg.reGame();
line.reGame();
}
break;
default:
}
}
});
while (true){
repaint();
nextLevel();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//下一关
public void nextLevel(){
if(bg.gameTime() && state==1){
if(Bg.count >= bg.goal)
{
if(Bg.level==5) {
state=4;
}
else {
state = 2;
Bg.level++;
}
}else {state=3;}
dispose();
GameWin gameWin1 = new GameWin();
gameWin1.launch();
}
}
@Override
public void paint(Graphics g) {
offScreenImage = this.createImage(768,1000);
Graphics gImage = offScreenImage.getGraphics();
bg.paintSelf(gImage);
if(state==1){
//绘制物体
for(Object obj:objectList)
{
obj.paintSelf(gImage);
}
line.paintSelf(gImage);
}
g.drawImage(offScreenImage,0,0,null);
}
public static void main(String[] args) {
GameWin gameWin=new GameWin();
gameWin.launch();
}
}
3.Gold.java
Gold
GoldMini
GoldPlus
package com.sxt;
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 {
//0未开始 1 运行中 2 商店 3 失败 4 胜利
static int state;
//存储金块,石块
List<Object> objectList = new ArrayList<>();
Bg bg = new Bg();
Line line = new Line(this);
{
//是否可以放置
boolean isPlace = true;
for (int i = 0; i < 11; i++) {
double random =Math.random();
Gold gold;//存放当前生成的金块
if(random<0.3){gold = new GoldMini();}
else if(random<0.7){ gold = new Gold();}
else { gold = new GoldPlus();}
for(Object obj:objectList){
if(gold.getRec().intersects(obj.getRec())){
//不可放置,需要重新生成
isPlace=false;
}
}
if(isPlace){objectList.add(gold);}
else {isPlace=true;i--;}
}
for (int i = 0; i < 5; i++) {
Rock rock=new Rock();
for(Object obj:objectList){
if(rock.getRec().intersects (obj.getRec()))
{ isPlace=false; }
}
if(isPlace){ objectList.add(rock); }
else{isPlace=true;i--;}
}
}
//缓存画布
Image offScreenImage;
//窗口设置
void launch(){
this.setVisible(true);
this.setSize(768,1000);
this.setLocationRelativeTo(null);
this.setTitle("尚学堂黄金矿工");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
switch (state){
case 0:
if(e.getButton()==3){
state=1;
bg.startTime = System.currentTimeMillis();
}
break;
case 1:
//左右摇摆,点击左键
if(e.getButton()==1&&line.state==0)
{line.state=1;}
//抓取返回,点击右键
if(e.getButton()==3&&line.state==3&&Bg.waterNum>0){
Bg.waterFlag=true;
Bg.waterNum--;
}
break;
case 2:
if(e.getButton()==1){
bg.shop=true;
}
if (e.getButton()==3){
state=1;
bg.startTime = System.currentTimeMillis();
}
break;
case 3:
case 4:
if(e.getButton()==1){
state=0;
bg.reGame();
line.reGame();
}
break;
default:
}
}
});
while (true){
repaint();
nextLevel();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//下一关
public void nextLevel(){
if(bg.gameTime() && state==1){
if(Bg.count >= bg.goal)
{
if(Bg.level==5) {
state=4;
}
else {
state = 2;
Bg.level++;
}
}else {state=3;}
dispose();
GameWin gameWin1 = new GameWin();
gameWin1.launch();
}
}
@Override
public void paint(Graphics g) {
offScreenImage = this.createImage(768,1000);
Graphics gImage = offScreenImage.getGraphics();
bg.paintSelf(gImage);
if(state==1){
//绘制物体
for(Object obj:objectList)
{
obj.paintSelf(gImage);
}
line.paintSelf(gImage);
}
g.drawImage(offScreenImage,0,0,null);
}
public static void main(String[] args) {
GameWin gameWin=new GameWin();
gameWin.launch();
}
}
4.Line
package com.sxt;
import java.awt.*;
public class Line {
//起点坐标
int x=380;
int y=180;
//终点坐标
int endx=500;
int endy=500;
//线长
double length = 100;
//线长最小值
double MIN_length = 100;
//线长最大值
double MAX_length = 750;
//角度百分比
double n = 0;
//方向
int dir = 1;
//状态 0 摇摆 1 抓取 2 收回 3 抓取返回
int state;
//钩爪图片
Image hook = Toolkit.getDefaultToolkit().getImage("imgs/hook.png");
GameWin frame;
Line(GameWin frame){this.frame=frame;}
//碰撞检测,检测物体是否被抓取
void logic(){
for(Object obj:this.frame.objectList){
if(endx>obj.x && endx<obj.x+obj.width
&& endy>obj.y && endy< obj.y+obj.height){
state=3;
obj.flag=true;
}
}
}
//绘制方法
void lines(Graphics g){
endx = (int) (x +length*Math.cos(n* Math.PI));
endy = (int) (y +length*Math.sin(n*Math.PI));
g.setColor(Color.red);
g.drawLine(x-1,y,endx-1,endy);
g.drawLine(x,y,endx,endy);
g.drawLine(x+1,y,endx+1,endy);
g.drawImage(hook,endx-36,endy-2,null);
}
void paintSelf(Graphics g){
logic();
switch (state){
case 0:
if(n<0.1){ dir = 1;}
else if (n>0.9){dir = -1;}
n=n+0.005*dir;
lines(g);
break;
case 1:
if(length<=MAX_length){
length=length+5;
lines(g);
}else {state=2;}
break;
case 2:
if(length>=MIN_length){
length=length-5;
lines(g);
}else {
state=0;
}
break;
case 3://抓取返回
int m=1;
if(length>=MIN_length){
length=length-5;
lines(g);
for(Object obj:this.frame.objectList){
if(obj.flag){
m=obj.m;
obj.x=endx-obj.getWidth()/2;
obj.y=endy;
if(length<=MIN_length){
obj.x=-150;
obj.y=-150;
obj.flag=false;
//加分
Bg.count+=obj.count;
Bg.waterFlag=false;
state=0;
}
if(Bg.waterFlag){
if(obj.type==1){
//金块
m=1;
}else if(obj.type==2){
//石块
obj.x=-150;
obj.y=-150;
obj.flag=false;
Bg.waterFlag=false;
state=2;
}
}
}
}
}
try {
Thread.sleep(m);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
default:
}
}
//重置线
void reGame(){
n=0;
length=100;
}
}
5.Object
package com.sxt;
import java.awt.*;
public class Object {
//坐标
int x;
int y;
//宽高
int width;
int height;
//图片
Image img;
//标记,是否能移动
boolean flag;
//质量
int m;
//积分
int count;
//标记 1为金块,2为石块
int type;
void paintSelf(Graphics g){
g.drawImage(img,x,y,null);
}
public int getWidth() {
return width;
}
//获取矩形
public Rectangle getRec(){
return new Rectangle(x,y,width,height);
}
}
6.Rock
package com.sxt;
import java.awt.*;
public class Rock extends Object {
Rock(){
this.x=(int)(Math.random()*700);
this.y=(int)(Math.random()*550+300);
this.width=71;
this.height=71;
this.flag=false;
this.m=50;
this.count=1;
this.type=2;
this.img = Toolkit.getDefaultToolkit().getImage("imgs/rock1.png");
}
}