您的位置:首页 > 编程语言

弹球游戏源代码

2016-05-18 00:00 225 查看




package com;

import java.awt.Canvas;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.util.Random;

import javax.swing.JFrame;

import javax.swing.Timer;

public class PinBall {

public static void main(String[] args) {

new PinBall().init();

}

class MyCanvas extends Canvas {

// 重写Canvas的paint()方法,实现绘图

@Override

public void paint(Graphics g) {

if (isLose) {// 遊戲

g.setColor(new Color(255, 0, 0));

g.setFont(new Font("Times", Font.BOLD, 30));

g.drawString("哈哈,游戏结束啦~~~~~", 0, 200);

} else {// 游戏没有结束

g.setColor(new Color(240, 240, 80));

// 绘制小球

g.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);

g.setColor(new Color(80, 80, 200));

// 绘制球拍

g.fillRect(racketX, RACKET_Y, RACKET_WIDTH, RACKET_HEIGHT);

}

}

}

// 桌面的宽度

private final int TABLE_WIDTH = 300;

// 桌面的高度

private final int TABLE_HEIGHT = 400;

// 球拍的垂直位置

private final int RACKET_Y = 340;

// 球拍的高度

private final int RACKET_HEIGHT = 20;

// 球拍的宽度

private final int RACKET_WIDTH = 60;

// 球的大小

private final int BALL_SIZE = 16;

// 窗体

private JFrame f = new JFrame("弹球游戏——润康制作");

// 随机数

Random rand = new Random();

// 小球的纵向运行速度

private int ySpeed = 10;

// 控制小球的运动方向 -0.5~0.5

private double xyRate = rand.nextDouble() - 0.5;

// 小球的横向运行速度

private int xSpeed = (int) (ySpeed * xyRate * 2);

// 小球的坐标

private int ballX = rand.nextInt(200) + 20;

private int ballY = rand.nextInt(10) + 20;

// 球拍的水平位置

private int racketX = rand.nextInt(200);

// 画布

private MyCanvas tableArea = new MyCanvas();

// 计时器

Timer timer;

// 记录游戏是否结束 isLose

private boolean isLose = false;

public void init() {

// 设置桌面区域的最佳大小

tableArea.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));// Dimension

// 尺寸

f.add(tableArea);

// 定义键盘的监听器

KeyAdapter keyProcessor = new KeyAdapter() {

3ff8
public void keyPressed(KeyEvent ke) {

// 按下左键时的动作

if (ke.getKeyCode() == KeyEvent.VK_LEFT) {

if (racketX > 0)

racketX -= 10;

}

// 按下右键时的动作

if (ke.getKeyCode() == KeyEvent.VK_RIGHT) {

if (racketX < TABLE_WIDTH - RACKET_WIDTH)

racketX += 10;

}

}

};

// 为窗口和tableArea对象分别添加键盘监听器

f.addKeyListener(keyProcessor);

tableArea.addKeyListener(keyProcessor);

// 定义事件执行的周期

ActionListener taskPerformer = new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

// 如果小球碰到左边的边框

if (ballX <= 0 || ballX > TABLE_WIDTH - BALL_SIZE) {

xSpeed = -xSpeed;

}

// 如果小球的高度超出了球拍的位置,且横向不在球拍的范围之内,游戏结束

if (ballY >= RACKET_Y - BALL_SIZE

&& (ballX < racketX || ballX > racketX + RACKET_WIDTH)) {

timer.stop();

isLose = true;

tableArea.repaint();

} else if (ballY <= 0

|| (ballY >= RACKET_Y - BALL_SIZE && racketX < ballX && ballX <= racketX

+ RACKET_WIDTH)) {// 如果小球在球拍之内,且达到球拍的位置,小球反弹

ySpeed = -ySpeed;

}

// 改变小球的坐标

ballX += xSpeed;

ballY += ySpeed;

System.out.println("小球的横坐标" + ballX + "小球的纵坐标" + ballY);

tableArea.repaint();

}

};

// 0.1秒,执行一次时间

timer = new Timer(90, taskPerformer);

timer.start();

f.pack();

f.setVisible(true);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: