⽤JAVA实现⼀个简易的打砖块⼩游戏
概述
利⽤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];
// ⿊⾊砖块是特殊砖块,打掉不得分,但是可以掉落胶囊
RGB()== RGB())
{
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(Int(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.-Width()/2,GAME_Height()-30);
}
else// 游戏运⾏中,动态改变挡板⽔平⽅向的位置
{
//paddle.X()-PADDLE_W/Y()-PADDLE_H/2);
// 限制挡板左侧和右侧不能超出游戏界⾯的范围
double X()-Width()/2;
if(x<0)
{
x=0;
}
if(x>GAME_Width())
{
x=GAME_Width();
}
paddle.setLocation(Y());
}
}
与使⽤⿏标类似,使⽤键盘操作挡板的移动,也需要监听按键事件。
addKeyListeners();
@Override
public void keyTyped(KeyEvent e)
{
double X();
char KeyChar();
if(keyChar =='1')// 左移
{
Width()*1.5;
if(x<=0)
{
x=0;
}
}
else if(keyChar =='2')// 右移
{
x+=Width()*1.5;
if(x>GAME_Width())
{
x=GAME_Width();
}
}
paddle.setLocation(Y());
}
移动⼩球
移动⼩球,只需要在⼀个循环中,只要游戏还未结束,就⼀直调⽤ move() 即可。
需要在游戏开始前,给⼩球⼀个初始移动速度,并且每次游戏的速度不同。
VELOCITY_X=3;
VELOCITY_Y=5;
boolean gameover=false;
public void init()
{
int Int(0,3);
vx=VELOCITY_X+offset;// ⽔平速度
vy=-(VELOCITY_Y+offset);// 竖直速度
}
public void run()
{
while(!gameover)
{
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_X();
double top_Y();
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;
else
vx-=va;
if(vy>0)
vy+=va;
else
vy-=va;
continue;
}
else
{
if(changeX)
vx=-vx;
简单的java游戏代码if(changeY)
vy=-vy;
remove(element);
}
}
得分
在打到砖块时,只需要根据砖块的颜⾊,获取到该颜⾊对应的分数,将其加到得分中即可
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论