概述

利用java实现打砖块小游戏,游戏界面包括以下元素

  • 顶部的各色砖块
  • 底部的挡板
  • 小球
  • 游戏信息展示面板
  • 玩法包括

使用鼠标或者键盘移动挡板

  • 打掉砖块,得分
  • 每一局有3次机会,挡板没有接到小球,机会减1
  • 打掉黑色小球,会掉落道具,挡板接到道具,挡板会变长
  • 可以选择游戏难度等级

功能实现

首先,整个Class继承自 GraphicsProgram, 程序启动后,先执行init() 方法,然后执行 run() 方法

public class Arkanoid extends GraphicsProgram
{public void init(){// 进行初始化}public void run(){// 具体执行}
}

然后,在 init() 中,进行游戏界面的创建。

创建砖块

创建砖块前,先准备一个存储颜色和颜色对应的分值的容器,这里用Map来实现,键保存Color对象,值保存分值

Map<Color,Integer> brickColors;colors=new Color[]{Color.BLACK,Color.BLUE,Color.CYAN,Color.DARK_GRAY,Color.GRAY,Color.GREEN,Color.LIGHT_GRAY,Color.MAGENTA,Color.ORANGE,Color.PINK,Color.RED,Color.YELLOW
};
brickColors=new HashMap<>();
for(int i=0;i<colors.length;i++)
{Color color=colors[i];// 黑色砖块是特殊砖块,打掉不得分,但是可以掉落胶囊if(color.getRGB() == Color.BLACK.getRGB()){brickColors.put(color,0);}else{brickColors.put(color,colors.length%(i+1)+1);}
}

有了砖块颜色,接下来的就是创建指定行,列的砖块了,这里用 GRect 表示砖块。

需要注意的一点是,GRect 默认有1像素的边框,如果不去掉它,在计算砖块的宽度时,要考虑到这1像素。

final int ROWS=6;
final int COLUMNS=12;// 砖块实心部分的宽,高
brickW=GAME_PANE_WIDTH/COLUMNS;
brickH=brickW/2;for(int i=0;i<ROWS;i++)
{for(int j=0;j<COLUMNS;j++){GRect brick=new GRect(brickW,brickH);brick.setFilled(true);brick.setColor(colors[randomGenerator.nextInt(0,brickColors.size()-1)]);brick.setLineWidth(0);double x=j*brickW;double y=i*brickH;add(brick,x,y);}
}

创建挡板和小球

创建挡板和小球,分别使用 GRect和GOval,然后将其添加到适合的位置即可。

创建游戏信息展示面板

在游戏信息展示面板中,可以根据游戏要实现的功能,添加一些面板来展示信息。

这里创建了包括【游戏机会】【得分】【游戏难度】【再来一局】等面板。

最外部使用JPanel创建,布局方式为GirdLayout,然后将每一项添加到其中即可。

使用鼠标或键盘操纵挡板移动

要想实现让挡板跟随鼠标移动的功能,需要为添加鼠标监听器,直接添加到游戏界面最外层组件上即可.

调用方法 addMouseListeners() 然后重写 mouseMoved(MouseEvent) 方法,在其中根据鼠标位置,设置挡板的位置即可。注意限制挡板的移动范围,不让其超出游戏界面。

addMouseListeners();public void mouseMoved(MouseEvent e)
{if(gameover) // 游戏结束,恢复挡板在底部正中央{paddle.setLocation(GAME_PANE_WIDTH/2.-paddle.getWidth()/2,GAME_PANE_HEIGHT-paddle.getHeight()-30);}else // 游戏运行中,动态改变挡板水平方向的位置{//paddle.setLocation(e.getX()-PADDLE_W/2,e.getY()-PADDLE_H/2);// 限制挡板左侧和右侧不能超出游戏界面的范围double x=e.getX()-paddle.getWidth()/2;if(x<0){x=0;}if(x>GAME_PANE_WIDTH-paddle.getWidth()){x=GAME_PANE_WIDTH-paddle.getWidth();}paddle.setLocation(x,paddle.getY());}
}

与使用鼠标类似,使用键盘操作挡板的移动,也需要监听按键事件监听器。

addKeyListeners();@Override
public void keyTyped(KeyEvent e)
{double x=paddle.getX();char keyChar=e.getKeyChar();if(keyChar == '1') // 左移{x-=paddle.getWidth()*1.5;if(x<=0){x=0;}}else if(keyChar == '2') // 右移{x+=paddle.getWidth()*1.5;if(x>GAME_PANE_WIDTH-paddle.getWidth()){x=GAME_PANE_WIDTH-paddle.getWidth();}}paddle.setLocation(x,paddle.getY());
}

移动小球

移动小球,只需要在一个循环中,只要游戏还未结束,就一直调用 move() 即可。

需要在游戏开始前,给小球一个初始移动速度,并且每次游戏的速度不同。

VELOCITY_X=3;
VELOCITY_Y=5;
boolean gameover=false;public void init()
{int offset=randomGenerator.nextInt(0,3);vx=VELOCITY_X+offset;        // 水平速度vy=-(VELOCITY_Y+offset);        // 竖直速度
}public void run()
{while(!gameover){ball.move(vx,vy);pause(DELAY);}
}

检测小球是否撞到墙面

根据游戏界面的宽高和小球当前的坐标,判断小球是否接触到游戏界面的边框,以此来决定小球是否撞到了墙面。

如果小球撞到的上或下墙面,就取反y方向的速度,如果撞到左或右墙面,就取反x方向的速度

代码类似以下

if(hitBottomWall() || hitTopWall())
{vy=-vy;
}
if(hitLeftWall() || hitRightWall())
{vx=-vx;
}

小球撞到砖块反弹,砖块消失

首先,获取到小球撞到的砖块。

需要检测4个顶点,这里只给出示例代码

GObject getCollidingObject()
{GObject element=getElementAt(x,y);if(element!=null)return element;return null;
}

然后,根据撞到砖块的位置,改变小球的移动轨迹

1块砖块根据4条边延伸出去的线,可以将其周围分为8个区域:

  • 正上,正下
  • 正左,正右
  • 左上,左下,右上,右下

如果小球球心处于正上或正下区域,只取反其y方向的速度即可;

如果小球球心处于正左或正右区域,只取反其x方向的速度即可;

如果小球球心处于其他区域,说明它撞到的正好是砖块的4个顶点,x,y方向的速度同时取反。

boolean changeX=false;
boolean changeY=false;private void changeXY(GObject element,double center_x,double center_y)
{double left_brick=element.getX();double top_brick=element.getY();double right_brick=left_brick+brickW;double bottom_brick=top_brick+brickH;if(center_y>top_brick && center_y<bottom_brick) // 小球在砖块的左侧,或右侧{changeX=true;}else if(center_x>left_brick && center_x<right_brick) // 小球在砖块的上侧,或xia侧{changeY=true;}else // 小球在砖块的4个顶点范围{changeX=true;changeY=true;}
}

最后,在run方法中,根据变量 changeX 和 changeY,改变vx 和 vy

GObject element=getCollidingObject();
if(element != null)
{if(element == paddle) // 如果打到挡板,反弹{vy=-vy;// 加一下速if(vx>0)vx+=va;elsevx-=va;if(vy>0)vy+=va;elsevy-=va;continue;}else{if(changeX)vx=-vx;if(changeY)vy=-vy;remove(element);}
}

得分

在打到砖块时,只需要根据砖块的颜色,获取到该颜色对应的分数,将其加到得分中即可

GObject element=getCollidingObject();
if(element != null)
{Color color=element.getColor();int point=brickColors.get(color);score+=point;scoreLabel_num.setText(""+score);
}

掉落道具,接到道具,挡板变长

打到黑色砖块,在砖块下边出现一个道具,竖直下落;如果在道具降到下边墙之前,使用挡板接到道具,挡板将变长。

首先定义一个数组列表,用于存储掉落的道具;

打到黑色砖块后,创建一个道具,将其添加到容器中;

最后,让容器中的道具“落下”;

如果挡板接到了道具,重新设置其尺寸。

ArrayList<GImage> falls;if(color.getRGB() == Color.BLACK.getRGB())// 如果是黑砖块,落下道具
{Toolkit toolkit=Toolkit.getDefaultToolkit();Image image=toolkit.createImage("fall.png");GImage fall=new GImage(image);fall.setSize(PADDLE_W,PADDLE_W);add(fall,element.getX(),element.getY());falls.add(fall);
}for(GImage fall:falls)
{if(fall != null){fall.move(0,5);// 接到了道具if(Math.abs(paddle.getY()-fall.getY()-fall.getHeight())<=0.1 && (Math.abs(fall.getX()-paddle.getX())<=paddle.getWidth()-0.1)){remove(fall);double newWidth=paddle.getWidth()*1.5;if(newWidth>=GAME_PANE_WIDTH){newWidth=GAME_PANE_WIDTH;}paddle.setSize(newWidth,paddle.getHeight());}}
}

设置游戏难度等级

这里的难度,只是简单的在小球被挡板反弹时,增加其速度。根据所加速的幅度大小,分为
【简单】【一般】【困难】3个难度等级。

创建3个单选按钮,设置其监听器,在其选中时改变加速幅度

double va=0;JRadioButton simpleBtn=new JRadioButton("简单",true);
JRadioButton middleBtn=new JRadioButton("一般");
JRadioButton diffcultyBtn=new JRadioButton("困难");simpleBtn.addActionListener(e ->
{va=0;
});
middleBtn.addActionListener(e ->
{va=1;
});
diffcultyBtn.addActionListener(e ->
{va=2;
});

然后,在run方法中,将加速加到vx,vy中

if(element == paddle) // 如果打到挡板,反弹
{vy=-vy;// 加一下速if(vx>0)vx+=va;elsevx-=va;if(vy>0)vy+=va;elsevy-=va;
}

用JAVA实现一个简易的打砖块小游戏相关推荐

  1. c语言小游戏 精简_一个简易的贪吃蛇小游戏C语言源码

    /* *程序名称:贪吃蛇v2.1 *程序描述:一个简易的贪吃蛇小游戏 *版本信息:v2.1 *v1.1版本更新:1:加入菜单选择项 *v1.2版本更新:1:修复菜单选择bug *v1.3班本更新:1: ...

  2. 无聊的时候怎么办?教你用java写一个简单挂机打金币小游戏吧!

    无聊的时候怎么办?教你用java写一个超简单挂机打金币小游戏吧! Java写一个挂机打金币程序 1.Java的面向对象 2.基础打金的分析 3. Robot介绍以及Demo演示 4.挂机打金程序如何去 ...

  3. 如何利用JAVA编写一个简单的石头剪刀布的小游戏

    楼主为了完成作业,花了一小会时间自己琢磨了一下,写出了这个石头剪刀布的小游戏. 思路很简单,就是令石头=2,剪刀=1,布=0,那么电脑随机生成一个数,分别去对应,游戏者同时也输入一个数字,也是对应着前 ...

  4. Java做一个好玩的打飞机小游戏

    文章目录 前言 1.项目整体构造 2.主类代码展示 3.飞机类代码展示 3.炮弹类代码展示 4.爆炸类代码展示 前言

  5. 用java实现一个简易自动提款机

    用java实现一个简易自动提款机,且有以下要求 如何实现呢?首先,我们定义一个用户类User,同时根据要求设计好属性(本人部分命名没有使用驼峰命名法,不够规范).因为一个人可能有多个卡,卡号又不能重复 ...

  6. 使用Java制作一个简易的远控终端

    使用Java制作一个简易的远控终端 远控终端的本质 1.服务端(攻击者)传输消息 ----> socket连接 ----> 客户端(被攻击者)接收消息 2.客户端执行消息内容(即执行服务端 ...

  7. java编写一个彩票开奖的模拟程序.游戏共有两种玩法,一种是21选5,即玩家输入5个1到21内的不重复的数。另外一种玩法是6+1玩法,即要求玩家输入7个整数,代表所购买的彩票号码,最后一个是特码。

    java编写一个彩票开奖的模拟程序.游戏共有两种玩法,一种是21选5,即玩家输入5个1到21内的不重复的数.另外一种玩法是6+1玩法,即要求玩家输入7个整数,代表所购买的彩票号码,最后一个是特码. 具 ...

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

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

  9. 如何用java编写一个简单的多人PK游戏

    如何用java编写一个简单的多人PK游戏 类与对象---PK游戏的编写 素材取用----王者荣耀和BILIBILI 创建两个对战的角色(PK游戏最少需要两名角色) 创建孙尚香和Van 设置孙尚香和Va ...

最新文章

  1. Nature:揭示人大脑类器官为何缺乏正常人脑特有的细胞亚型和复杂回路
  2. Java8初体验(二)Stream语法详解(转)
  3. linux C库编译
  4. qt关于添加模块的说明
  5. Spark 编程模型(上)
  6. LevelDB 源码剖析(六)WAL模块:LOG 结构、读写流程、崩溃恢复
  7. CART树回归、剪枝、Tkinter GUI
  8. Java多线程学习十七:读锁应该插队吗?什么是读写锁的升降级?
  9. 基于JAVA+Servlet+JSP+MYSQL的校园门户信息管理系统
  10. Flutter之Dialog使用和踩坑
  11. hdu4608 暴力+大数
  12. Can I insert a countdown timer in a Powerpoint presentation?
  13. proteus部分元件中英对照
  14. 工作模板-----MySQL示例
  15. 【冷知识】火车票座位分布知识点
  16. 租用国外服务器兴起的背景
  17. 单片机与 PC 机串口通信实验
  18. 舰船知识科普-有图有真相(附PPT)
  19. POSIX是什么,为什么需要POSIX
  20. 互联网日报 | 6月11日 星期五 | 滴滴正式提交赴美IPO申请;百度再投20亿成立造车公司;盒马集市将推出“盒字号”商品...

热门文章

  1. PKU 3311 Hie with the Pie 最短路 folyd
  2. win7下IIS的安装和配置 图文教程
  3. 用友宣布进入3.0时期,全面提供“企业互联网服务”
  4. android 沙盒存储,Android Q存储机制-沙盒机制
  5. 实验吧WP(密码学部分)【变异凯撒,传统知识+古典密码,try them all,trival】
  6. SAP BP供应商归档
  7. 2017-9-8 - A - WebServer项目
  8. 串口通讯中出现的错误(1)
  9. maven:本地仓库有依赖但是idea报错找不到依赖Could not find artifact com.*.*
  10. 三阶魔方复原简易方法笔记