黄金矿工

  • 项目结构
  • 前期准备
  • Stone类
  • Gold类(包含Gold类,GoldMini类,GoldPlus类)
  • GameWin类
  • Line类
  • Parent类
  • Sky类

项目结构

  • 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() {@Overridepublic 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();}}@Overridepublic 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,null);//让钩子在中间}public void paint(Graphics g) {logic();if (state==0) {if (n < 0.1) {fangxiang = 1;} else if (n > 0.9) {fangxiang = -1;}n = n + 0.005 * fangxiang;lines(g);}else  if (state==1){if (length<maxLength) {length = length + 10;lines(g);}else{ state=2;}}else if (state==2) {if (length>minLength) {length = length - 10;lines(g);}else{ state=0;}}else if (state==3) {int m=1;if (length>minLength) {length = length - 10;lines(g);for (Parent object : this.gameWin.parentList) {if (object.flag){m=object.m;object.x=endx-object.getW()/2;//把金块放钩子中间object.y=endy;if (length<=minLength){object.x=-150;object.y=-150;object.flag=false;Sky.yaoState=false;Sky.total+=object.money;state=0;}if (Sky.yaoState){if (object.type==1){m=1;}if (object.type==2){object.x=-150;object.y=-150;object.flag=false;Sky.yaoState=false;state=2;}}}}try {Thread.sleep(m);} catch (InterruptedException e) {e.printStackTrace();}}}}//重置元素void reGame(){n=0;//线的角度百分比length=50;//线的长度}
}

Parent类

定义一下多次用到的变量


public class Parent {//坐标int x,y;//宽高int w,h;//图片Image img;//标记boolean flag;//重量int m;//钱int money;//类型 1是金块,2是石头int type;//绘制方法void  parin(Graphics g){g.drawImage(img,x,y,null);}public int getW() {return w;}//获取矩形public Rectangle getRec(){return new Rectangle(x,y,w,h);}

Sky类

  • 类中变量

    • level 关卡数
    • goal 目标金额
    • total 总金额
    • yaoBasic 初始药水值
    • yaoState 药水状态 使用或未使用
    • price 药水价格
    • shop 是否购买药水
    • 加一堆的图片
  • 类中方法
    • paint 绘制不同状态的窗口样式
    • draw 提取公共的代码
    • reGame 重置元素
public class Sky {//定义static int level=1;//目标金额int goal=level*200+100;//总金额static  int total=0;static  int  yaoBasic=3;//初始药水值//药水状态static  boolean yaoState=false;int price=(int) Math.random()*100+10;//是否购买药水boolean shop=false;//开始和结束Image yao= Toolkit.getDefaultToolkit().getImage("img/yao.png");Image bg= Toolkit.getDefaultToolkit().getImage("img/sky.jpg");Image bg1= Toolkit.getDefaultToolkit().getImage("img/bg1.jpg");//抓矿背景Image bg2= Toolkit.getDefaultToolkit().getImage("img/bg2.jpg");//商店背景Image miner= Toolkit.getDefaultToolkit().getImage("img/miner.png");public void paint(Graphics g) {g.drawImage(bg,0,0,null);g.drawImage(bg1,0,200,null);switch (GameWin.state){case 0:g.drawImage(bg2,0,200,null);draw(g,50,"准备开始,点击右键",150,400,Color.BLACK);break;case 1:g.drawImage(miner,310,50,null);draw(g,30,"目标得分"+goal,30,110,Color.black);draw(g,30,"总金额:"+total,30,150,Color.BLACK);//药水绘制g.drawImage(yao,480,90,null);draw(g,30,"x"+yaoBasic,550,150,Color.BLACK);//计算时间draw(g,30,"剩余时间:"+GameWin.gameTime,520,90,Color.BLACK);//rapaintbreak;case 2:g.drawImage(bg2,0,200,null);draw(g,60,"楠楠的商店",220,280,Color.black);System.out.println("...........");g.drawImage(yao,340,500,null);//药水价格draw(g,30,"价格"+price,337,650,Color.black);
//                //是否购买
//                draw(g,30,"是否购买",300,450,Color.black);if (shop&&total>=price){total-=price;yaoBasic++;shop=false;System.currentTimeMillis();}break;case 3:g.drawImage(bg2,0,200,null);draw(g,50,"你失败啦!",250,350,Color.RED);//rapaintdraw(g,50,"总金额!"+total,200,450,Color.BLACK);break;case 4:g.drawImage(bg2,0,200,null);draw(g,50,"您通关啦!",250,350,Color.RED);//rapaintdraw(g,50,"总金额!"+total,200,450,Color.BLACK);break;default:}}public static  void  draw(Graphics g,int size,String str,int x,int y,Color color){g.setColor(color);g.setFont(new Font("楷体",Font.BOLD,size));g.drawString(str,x,y);}//重置元素void reGame(){//定义关卡数int level=1;//目标金额int goal=level*200+100;//总金额int total=0;int  yaoBasic=3;//初始药水值//药水状态boolean yaoState=false;}
}

运行效果




不是纯自己想的,是看尚学堂的!!但是我没有链接无法发转载,里面根据自己的理解我改了一些代码
原视频地址:https://www.bilibili.com/video/BV1zL411G7cd?p=1

用Java写个小游戏--黄金矿工代码实现相关推荐

  1. Java练手小游戏---黄金矿工

    你玩过4399曾经最火的黄金矿工小游戏吗,黄金矿工小游戏是一款休闲娱乐的一个挖宝游戏,在游戏中地下会有许多的宝藏,你得想办法把它们都挖出来,作为矿工的你,对你来说是轻车熟路的,能不能挖到宝,看你抓取的 ...

  2. java小游戏-java小游戏-黄金矿工

    java小游戏-java小游戏-黄金矿工 1 窗口绘制 2 绘制图片 3 红线绘制 4 红线摇摆 5 红线抓取 6 创建金块 7 双缓存技术 8 抓取判断 9 抓取返回 10 多个金块 11 Bug金 ...

  3. 【Java基础项目】经典小游戏黄金矿工制作

    Java初学者的小伙伴们,相信大家肯定缺少很多的练手项目吧!今天就给大家推荐一款特别好上手的一个Java小游戏--黄金矿工. 大家听到这个名字的时候,童年的回忆肯定一下子,涌上心头,那如果让大家制作一 ...

  4. Java写五子棋小游戏

    Java写五子棋小游戏 最近用Java写了个五子棋小游戏,遇到了许多细节问题,在此不得不总结一下,以便有同样需求朋友参考. 1.]面板发生变化,重绘棋盘与棋局问题: 必须调用父类的paint方法,因为 ...

  5. java写的小游戏打砖块_java实现打砖块小游戏

    本文实例为大家分享了java实现打砖块小游戏的具体代码,供大家参考,具体内容如下 源码共包含两个文件 文件1:play_zhuankuai.java import java.awt.*; import ...

  6. JAVA小游戏——黄金矿工

    Day 1:窗口绘制并导入背景图片 public class mygame extends JFrame {bj b=new bj();void launch() throws Interrupted ...

  7. C/C++项目:4399小游戏黄金矿工编译教程

    <黄金矿工中文版>是一款休闲益智小游戏,游戏中你需要看准时机出钩子勾取金子或者砖石来获得金钱的累加,达到一定的金钱数才能够闯关成功,游戏十分经典,强烈推荐大家学会编写这款游戏,休闲时没网也 ...

  8. 用java写猜拳小游戏

    题目:用面向对象编程的思想,设计一个猜拳游戏,完成人机猜拳互动游戏的开发. 题目要求: 基本思想: 各部分主要代码: Npc1类代码: Player1类: content方法: checked方法: ...

  9. Java实现愤怒的小鸟小游戏【附代码】

    目录 1. FlappyBird小游戏设计与实现 1.1需求分析 1.2游戏功能设计 1.3 游戏详细设计(具体实现) 1.4部分效果图展示 1.5源代码 1. FlappyBird小游戏设计与实现 ...

最新文章

  1. 魅族员工跳槽OPPO后感慨,公司高层各种反思,不会骂员工废材
  2. curl调用WEB API
  3. 扬州ns服务器维修视频,NS连接服务器报错问题解决方法--给遇到同样问题的盆友...
  4. DISCUZ x2.5 插件实现DIY功能,让页面也可以自由设计
  5. 在matlab中xt( ),编译matlab的s函数(compiling s-functions for matlab)
  6. Node中POST请求的正确处理方式
  7. Spark学习之路 (二十三)SparkStreaming的官方文档
  8. java生成点阵图_Android从SD卡读取图片并显示为点阵图
  9. java打字小游戏源码_java实现快速打字游戏
  10. MAC安装Securecrt
  11. Android蓝牙音量调节,安卓 蓝牙音量控制 Bluetooth Volume Control v2.40 付费高级特别版...
  12. 下载:HD AUDIO For XP SP3修正补丁
  13. 【数字图像处理】-图像位数
  14. 关于offer、三方协议、福利等就业常识
  15. 快手之家(aardio.net) - 开头难
  16. zotero+坚果云实现多pc端及iPad同步管理查看文献【保姆教程】
  17. conda加速器mamba使用
  18. python取出数组大于某值_计算矩阵中大于某个值的所有值
  19. Windows系统cmd命令+实用工具
  20. office 2013 已停止工作;word excel 打开任何文件

热门文章

  1. OA工作流引擎:作为组织血脉支撑的重要性解析
  2. 老徐的博客:文章目录
  3. 22年电赛冬令营授课
  4. 微服务架构服务限流方案详解
  5. jquery三级联动模糊查询_js相关:jQuery实现三级联动效果
  6. Photoshop(5)不一样的抠图与字体
  7. html页面右侧有缝隙,HTML解决div里面img的缝隙问题
  8. 【python】locals使用
  9. 关于teamcity使用手册
  10. 史蒂夫 乔布斯经典语录