使用awt编程制作一个弹球小游戏

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class PinBall {
    //创建窗口对象
    private Frame frame=new JFrame("弹球游戏");
    //桌面宽度
    private final int TABLE_WIDTH=300;
    //桌面宽度
    private final int TABLE_HEIGHT=400;

    //球拍的高度和宽度
    private final int RACKET_WIDTH=60;
    private final int RACKET_HEIGHT=20;

    //小球的大小
    private final int BALL_SIZE=16;

    //定义变量,记录小球的坐标
    private int ballX=120;
    private int ballY=20;

    //定义变量,记录小球在x和y方向上移动的速度
    private int speedX=5;
    private int speedY=10;//这样下一次重绘的时候,就可以根据xy的坐标以及xy方向上的速度来推断下一次xy的坐标
    //以此不断修改小球的坐标,重绘它

    //定义变量,记录球拍的坐标
    private int racketX=120;
    private final int racketY=340;//球拍只能左右移动,不能上下移动

    //定义变量,标识当前游戏是否已结束
    private boolean isOver=false;

    //声明一个定时器
    private Timer timer;

    //自定义一个类继承Canvas,充当画布
    private class MyCanvas extends Canvas{
        @Override
        public void paint(Graphics g) {
            //TODO 在这里绘制内容
            if(isOver) {
                //游戏结束
                g.setColor(Color.BLUE);
                g.setFont(new Font("Times",Font.BOLD,30));
                g.drawString("游戏结束!",50,200);
            }else {
                //游戏中

                //绘制小球
                g.setColor(Color.RED);
                g.fillOval(ballX,ballY,BALL_SIZE,BALL_SIZE);

                //绘制球拍
                g.setColor(Color.PINK);
                g.fillRect(racketX,racketY,RACKET_WIDTH,RACKET_HEIGHT);

            }
        }
    }
    //创建绘画区域
    MyCanvas drawArea=new MyCanvas();


    public void init(){
        //组装视图,以及游戏逻辑的控制


        //完成球拍坐标的变化——创建一个监听器,监听按键事件或键盘事件
        KeyListener listener=new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                //区分按的是左键还是右键
                //获取当前按下的键
                int keycode=e.getKeyCode();//可以获取到当前键盘对应的整数,电脑上的每一个键都对应着一个唯一的整数
                if(keycode==KeyEvent.VK_LEFT){
                    //左键,应该向左移动,x轴坐标减小
                    //判断边界
                    if(racketX>0){
                        racketX-=10;
                    }
                }
                if(keycode==KeyEvent.VK_RIGHT){
                    //右键,向右移动
                    //判断边界
                    if(racketX<(TABLE_WIDTH-RACKET_WIDTH)){
                        racketX+=10;
                    }
                }
            }
        };
        //给frame和drawArea注册监听器
        frame.addKeyListener(listener);
        drawArea.addKeyListener(listener);

        //小球坐标的控制
        ActionListener task=new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //根据边界范围,修正速度
                if(ballX<=0 || ballX>=(TABLE_WIDTH-BALL_SIZE)){
                    speedX=-speedX;
                }
                //当前球的坐标大于球拍的坐标,反向运动
                if(ballY<=0 || (ballY>racketY-BALL_SIZE && ballX>racketX && ballX<racketX+RACKET_WIDTH)){
                    speedY=-speedY;
                }
                if(ballY>racketY-BALL_SIZE &&(ballX<racketX || ballX>racketX+RACKET_WIDTH)){
                    //当前小球超出的球拍的范围,游戏结束
                    //停止定时器
                    timer.stop();
                    //修改游戏是否结束的标记
                    isOver=true;
                    //重绘界面
                    drawArea.repaint();
                }
                //更新小球的坐标,重绘界面


                ballX+=speedX;
                ballY+=speedY;

                //重绘界面
                drawArea.repaint();
            }
        };
        timer=new Timer(100,task);
        timer.start();//启动

        drawArea.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));
        frame.add(drawArea);
        //设置frame最佳大小,并可视

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new PinBall().init();
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
主要是对何青编写的java游戏程序设计教程的综合运用,游戏主体主要有两关,本游戏需求许多相关要素,包括玩家的键盘各种按键的处理办法,包括左右移动,space跳跃,r键重新开始,ctrl发射子弹,p键暂停,esc退出到菜单,还有包括自己调试时加的’j’、’z’、’+/=’、’-’所分别代表的unattack态,跳跃初速度加10,进入下一关,回到上一关,并且设计了各种道具(包括恢复生命的红心,获得uattack状态的五角星和提升跳跃的能量球),设计了四种敌人,因为时间紧促,目前行为模式没有什么区别,但设计了简单的反应,例如在发现玩家之后会主动冲向玩家(设计了关于敌人是否发现玩家的hasFoundPlayer()方法放在npc类之中,并对其进行相关使用来实现),而不是机械性的反复运动,此外游戏本身有着计分系统,虽然没有完善通关记录的实现,但还是能时刻在屏幕中显示分数,此外在屏幕还会显示敌人数和剩余生命,本游戏设计了两个关卡并通过文件读写和将其数据转化为各种砖块背景(所写的TileMap类和gameworldmanager类中的loadTileMap方法来实现),以及通过BufferedImage来存放背景并能将背景(窗口背景)进行滚动(通过所写的Ribbon 类中的各种方法)从而达到背景在玩家走的时候也在动的感觉。同时设计了子弹的发射,能够通过子弹和‘踩’击杀敌人获得分数。当击杀玩全部敌人进入下一关卡等等。每一句都有相应的注释,附带一个上万字的java大作业报告书,适用于想在大学期间学习简单java游戏设计的同学。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值