用Java写个小游戏--黄金矿工代码实现
Posted 一只楠喃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Java写个小游戏--黄金矿工代码实现相关的知识,希望对你有一定的参考价值。
黄金矿工
项目结构
- GameWin类,游戏的主类
- Gold类,金块类
- Line类,线类
- Parent类,提取出的父类
- Sky类,背景类
- Stone类,石块类
前期准备
需要获取相关的图片,我的图片是获取至爱给网,里面有挺多的素材而且…免费
搭建一个IDEA项目(会Java的都会吧…eclipse也行,反正我用的IDEA)
两个背景图和天空
不同大小的金块和石块
矿工和钩子
Stone类
关于石头的相关参数
public class Stone extends Parent
Stone()
this.x=(int)(Math.random()*700);
this.y=(int)(Math.random()*550+300);
this.w=53;
this.h=53;
this.flag=false;
this.m=150;
this.money=50;
this.type=2;
this.img= Toolkit.getDefaultToolkit().getImage("img/black3.png");
Gold类(包含Gold类,GoldMini类,GoldPlus类)
这个类继承我们书写的Parent方法,类中定义金块的相关属性
public class Gold extends Parent
Gold()
this.x=(int)(Math.random()*500);//生成金块的纵坐标
this.y=(int)(Math.random()*550+300);
this.w=105;//金块的宽
this.h=105;//金块的高
this.flag=false;//是否背勾中了
this.m=180;//金块的重量
this.money=200;//金块的价钱
this.type=1;
this.img= Toolkit.getDefaultToolkit().getImage("img/gold1.gif");
class GoldMini extends Gold
GoldMini()
this.w=72;//金块的宽
this.h=72;//金块的高
this.m=70;//金块的重量
this.money=100;//金块的价钱
this.img= Toolkit.getDefaultToolkit().getImage("img/gold2.gif");
class Goldplus extends Gold
Goldplus()
this.w=175;//金块的宽
this.x=(int)(Math.random()*550);
this.h=175;//金块的高
this.m=230;//金块的重量
this.money=500;//金块的价钱
this.img= Toolkit.getDefaultToolkit().getImage("img/gold11.gif");
GameWin类
- 类中变量
- state 整个游戏的状态 0未开始 1 运行 2商店 3失败 4胜利
- image 展示的图片
- gameTime 倒计时初始时间
- start 是否开始的判断条件
- 类中方法
- launch 窗口事件
- nextLevel 下一关卡
- paint 绘制方法(重写方法)
- main 主方法
代码实现:
public class GameWin extends JFrame
static int state;//整个游戏的状态 0未开始 1 运行 2商店 3失败 4胜利
Sky sky=new Sky();//背景类
Line line=new Line(this);//钩子的线类
Image image;//图片
public static long gameTime = 30;//倒计时初始时间
public Thread start;//是否开始
List<Parent> parentList = new ArrayList<>();//存放父类
boolean isPlace=true;//是否可以放置
for (int i = 0; i < 7; i++)
//生成不同金块
Double random=Math.random();
//先存放金块
Gold gold;
if (random<0.3)//概率30%以下生成小金块
gold=new GoldMini();
else if (random<0.7)//概率70%以下30%以上生成普通金块
gold=new Gold();
else//其他以下生成大金块
gold=new Goldplus();
//判断是否重叠
for (Parent parent:parentList)
if (gold.getRec().intersects(parent.getRec()))
isPlace = false;
//添加未重叠元素
if (isPlace)
parentList.add(gold);
else
isPlace=true;i--;
//利用for循环来存放石块
for (int i= 0; i < 3; i++)
Stone stone=new Stone();
for (Parent parent:parentList)
if (stone.getRec().intersects (parent.getRec()))
isPlace=false;
if (isPlace)
parentList.add(stone);//存储多个石块
else
isPlace=true;
i--;
void launch() //定义窗口事件,无参构造方法
this.setVisible(true); //窗口可见
this.setSize(768, 1000); //窗口大小
this.setResizable(false);
this.setLocationRelativeTo(null); //窗口位置
this.setTitle("黄金矿工"); //窗口名称
setDefaultCloseOperation(EXIT_ON_CLOSE); //关闭窗口操作
//在launch中添加鼠标事件
addMouseListener(new MouseAdapter()
@Override
public void mouseClicked(MouseEvent e)
super.mouseClicked(e);
switch (state)
case 0:
if (e.getButton()==3)
if (start == null)
start = new Thread(()->
try
while (true)
gameTime -= 1;
Thread.sleep(1000);
catch (Exception ex)
ex.printStackTrace();
);
start.start();
state=1;
break;
case 1:
if (e.getButton() == 1 && line.state == 0) //1左键 2滑轮 3右键
line.state = 1;
//设置右键事件
if (e.getButton() == 3 && line.state == 3 )
if (Sky.yaoBasic > 0)
Sky.yaoBasic--;
Sky.yaoState = true;
;
case 2:
if (e.getButton()==1)//是否选择购买药水
System.out.println("购买");
state=1;
sky.shop=true;//调整状态
if (e.getButton()==3)//不购买,进入下一个关
System.out.println("不购买");
state=1;
System.currentTimeMillis();
break;
case 3:
//设置重开
if (e.getButton()==1)
state=0;
sky.reGame();
line.reGame();
break;
case 4:
//当点击左键时可以重新开始
if (e.getButton()==1)
state=0;
sky.reGame();
line.reGame();
break;
default:
);
//用死循环来实现窗口的重新绘制
while (true)
repaint();
//调用下一关
nextLevel();
//降低刷新率,在循环里面设置
try
Thread.sleep(10);
catch (InterruptedException e)
e.printStackTrace();
public void nextLevel()
if (GameWin.gameTime <= 0)
System.out.println(sky.total);
System.out.println(sky.goal);
if(sky.total>=sky.goal)
if (sky.level == 5)
state = 4;
System.out.println("通关");
else
sky.level++;
GameWin.state=2;
System.out.println("商店:"+state);
else
//失败,状态调为失败,展示失败页面
GameWin.state = 3;
dispose();
System.out.println(state);
//刷新窗体
GameWin.gameTime = 60;
GameWin gameWin1=new GameWin();
gameWin1.launch();
@Override
public void paint(Graphics g)
image=this.createImage(768,1000);
//为了放置金块和石块的闪动,先绘制一个窗口
Graphics grap=image.getGraphics();
sky.paint(grap);
if (state==1)
line.paint(grap);
//绘制金块
for (Parent gold : parentList)
gold.parin(grap);
g.drawImage(image,0,0,null);
public static void main(String[] args) throws InterruptedException
GameWin gameWin = new GameWin();
gameWin.launch();
Line类
- 类中变量
- x 起点的横轴
- y 起点的纵轴
- endx 终点的横轴
- endy 终点的纵轴
- length 初始绳子长度
- n 线的角度百分比
- maxLength 绳子的最长值
- minLength 绳子的最短值
- fangxiang 绳子的方向
- state 绳子的状态 0 最初摇摆状态 1 绳子向下延伸 2 绳子往回拉取 3 绳子抓取到物体
- gouzi 钩子的图片
- 类中方法
- logic 检测钩子是否碰撞物体
- lines 绘制钩子与绳子
- paint 主要是绳子状态的完成
- reGame 重置元素
public class Line
int x=380,y=180;//起点坐标
int endx=500,endy=500;//终点坐标
//线段长度
double length=50;
double n=0;
double maxLength=750;
double minLength=50;
//方向
int fangxiang=1;
//状态
int state=0;
//爪
Image gouzi=Toolkit.getDefaultToolkit().getImage("img/gouzi.png");
GameWin gameWin;
Line(GameWin gameWin)
this.gameWin=gameWin;
//
void logic()
for (Parent obj:this.gameWin.parentList)
if (endx > obj.x && endx < obj.x + obj.w
&& endy > obj.y && endx < obj.x + obj.h
)
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.BLACK);
g.drawLine(x-1, y-1, endx, endy);
g.drawLine(x+1, y+1, endx, endy);
g.drawLine(x, y, endx, endy);
g.drawImage(gouzi,endx-36,endy-2黄金矿工小游戏制作步骤