package com.sxt;
import java.awt.*;
public class Bg { //构造背景类
//设置积分
static int count=0;
//定义关卡数
static int level=1;
//定义目标得分
int goal=level*5;
//定义药水状态
static boolean waterFlag=false;
//定义药水数量
static int waterNum=3;
Image bg=Toolkit.getDefaultToolkit().getImage("imgs/bg.jpg"); //存入图片进bg
Image bg1=Toolkit.getDefaultToolkit().getImage("imgs/bg1.jpg"); //存入图片进bg1
Image peo=Toolkit.getDefaultToolkit().getImage("imgs/peo.png"); //存入图片进peo
//添加药水
Image water=Toolkit.getDefaultToolkit().getImage("imgs/water.png");
void panintSelf(Graphics g) //构造paintSelf方法来实现图片的显示,Graphics是画笔,
{
g.drawImage(bg,0,200,null); //绘画出bg
g.drawImage(bg1,0,0,null); //绘画出bg1
g.drawImage(peo,310,50,null); //绘画出peo
//绘制药水图片
g.drawImage(water,450,40,null);
//打印积分
drawWord(g,30,Color.black,"积分"+count,30,150);
drawWord(g,30,Color.black,"*"+waterNum,510,70);
//绘制关卡数和目标得分
drawWord(g,30,Color.black,"第"+level+"关",30,60);
drawWord(g,30,Color.black,"目标得分"+goal,30,110);
}
//创建打印字符串的方法
public static void drawWord(Graphics g,int size,Color color,String str,int x,int y)
{
g.setColor(Color.BLACK);
g.setFont(new Font("仿宋",Font.BOLD,30));
g.drawString(str,x,y);
}
}
package com.sxt;
import javax.swing.*; //导出Jframe类的方法,在继承Jframe类时会自己生成。
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
public class GameWin extends JFrame //创建GameWin类继承JFrame类,Jframe类本身包含鼠标事件,可以实现点击鼠标按键来不同操作。
{
//创建数组来存储金块
List<Object> objectList=new ArrayList<>();
Bg bg=new Bg();//创建Bg类的bg实例对象
Line line=new Line(this); //创建line的实例对象 //接受line中碰撞判断
Image offScreenImage; //创建画布
{
//判断重叠变量
boolean isPlace=true;
//利用for循环来存放金块
for (int i = 0; i < 10; 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;
i--;
}
}
//添加未重叠元素
if (isPlace=true)
{
objectList.add(gold);
}
else
{
isPlace=true;i--;
}
}
for (int i= 0; i < 3; i++) {
Rock 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--;
}
}
}
//新建下一关类
public void nextLevel()
{
if(Bg.count>=bg.goal)
{
//关卡数加一
Bg.level++;
//释放窗体状态
dispose();
//刷新窗体
GameWin gameWin1=new GameWin();
gameWin1.launch();
}
}
void launch(){ //定义窗口事件,无参构造方法
this.setVisible(true); //窗口可见
this.setSize(768,1000); //窗口大小
this.setLocationRelativeTo(null); //窗口位置
this.setTitle("李星沐牌黄金矿工"); //窗口名称
setDefaultCloseOperation(EXIT_ON_CLOSE); //关闭窗口操作
//在launch中添加鼠标事件
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
if (e.getButton()==1&&line.state==0) //1左键 2滑轮 3右键
{
line.state=1;
}
//设置右键事件
if (e.getButton()==3&&line.state==3&&Bg.waterNum>0)
{
Bg.waterNum--;
bg.waterFlag=true;
}
}
});
//用死循环来实现窗口的重新绘制
while (true)
{
repaint();
//调用下一关
nextLevel();
//降低刷新率,在循环里面设置
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void paint(Graphics g) //构造paint方法实现BG中的paintSelf方法
{
//创建画布窗口
offScreenImage=this.createImage(768,1000);
//传入画笔来让他可以绘制东西
Graphics gImage=offScreenImage.getGraphics();
bg.panintSelf(gImage);
//用for来遍历元素
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(); //在主函数里引用launch方法来实现窗口出现。
gameWin.launch();
}
}
package com.sxt;
import java.awt.*;
//创建Object类来存放金块和石块的相同属性
public class Gold extends Object{
Gold()
{
//坐标
this.x=(int)(Math.random()*700);
this.y=(int)(Math.random()*550+300);
//宽高
this.width=52;
this.height=52;
//设置标记
this.flag=false;
//设置质量
this.m=30;
this.count=4;
this.type=1;
//图片
this.img= Toolkit.getDefaultToolkit().getImage("imgs/gold1.gif");
}
}
//生成小金块,重置参数
class GoldMini extends Gold
{
GoldMini()
{
this.width=36;
this.height=36;
this.m=15;
this.count=2;
this.img= Toolkit.getDefaultToolkit().getImage("imgs/gold0.gif");
}
}
//生成小金块,重置参数
class GoldPlus extends Gold
{
GoldPlus()
{
//重置x
this.x=(int)(Math.random()*650);
this.width=105;
this.height=105;
this.m=15;
this.count=8;
this.img= Toolkit.getDefaultToolkit().getImage("imgs/gold2.gif");
}
}
package com.sxt;
import java.awt.*;
//创建Object类来存放金块和石块的相同属性
public class Object
{
//坐标
int x;
int y;
//宽高
int width;
int height;
//图片
Image img;
//创建标记flag用于修改BUG金块同时消失
boolean flag;
//质量
int m;
//定义绘制方法
//定义积分
int count;
//定义类型
int type;
void paintSelf(Graphics g)
{
g.drawImage(img,x,y,null);
}
//用Getter方法来获取宽度
public int getWidth() {
return width;
}
//获取矩形
public Rectangle getRec(){
return new Rectangle(x,y,width,height);
}
}
package com.sxt;
import java.awt.*;
public class Line {
//起点坐标,保证线左右摇摆时起点不变,仅是终点坐标改变
int x=380;
int y=180;
//终点坐标
int endx=500;
int endy=500;
//定义线长length,角度n,方向dir
double length=100;
//定义线最大值
double MAX_length=750;
//定义线最小值
double MIX_length=100;
double n=0;
int dir=1;
//定义状态 0摇摆 1延长 2收回 3抓取放回
int state;
//添加钩爪
Image hook=Toolkit.getDefaultToolkit().getImage("imgs/hook.png");
//用有参构造方法来接收窗口GameWin中元素
GameWin frame;
Line(GameWin frame)
{
this.frame=frame;
}
//设置碰撞判断
void logic()
{
//用for来遍历元素
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;
//碰撞后flag标记改变
obj.flag=true;
}
}
}
//定义lines来放置重复代码
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语句来判断状态
switch (state)
{
case 0:
if (n<0.1){dir=1;}
else if (n>0.9){dir=-1;}
//让n变化来实现线的移动,同时线的终点坐标也要发生变化
n=n+0.005*dir;
lines(g);
break;
case 1:
//实现线的延长
if (length<MAX_length)
{
length=length+5;
lines(g);
}
else
{
state=2; //线实现延长,返回状态2来减短
}
break;
case 2:
if (length>MIX_length)
{
length=length-5;
lines(g);
}
else
{
state=0; //线变短后要变回摇摆状态;
}
break;
//实现抓取放回,线返回,金块也要接着放回
case 3:
//创建临时变量m
int m=1;
if (length>MIX_length)
{
length=length-5;
lines(g);
for (Object obj:this.frame.objectList)
{
//加入flag为true,则返回,flase不返回
if (obj.flag)
{
//传入质量
m=obj.m;
obj.x=endx-obj.getWidth()/2; //金块要随着线返回 //获取宽度
obj.y=endy;
if (length<=MIX_length)
{
//金块返回后要消失
obj.x=-150; //金块要随着线返回
obj.y=-150;
state=0; //线变短后要变回摇摆状态;
//再改变flag标记
obj.flag=false;
Bg.waterFlag=false;
Bg.count+=obj.count;
state=0;
}
//使用药水
if (Bg.waterFlag)
{
if (obj.type==1)
{
m=1;
}
if (obj.type==2)
{
//金块返回后要消失
obj.x=-150; //金块要随着线返回
obj.y=-150;
obj.flag=false;
Bg.waterFlag=false;
state=2; //线变短后要变回摇摆状态;
//再改变flag标记
}
}
}
}
}
//用质量来判断刷新率
try {
Thread.sleep(m);
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
default:
}
//判断方向,让它一只在1,2,象限移动
}
}
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.img= Toolkit.getDefaultToolkit().getImage("imgs/rock1.png");
}
}