弹球小游戏(Java)

这是一个使用Java AWT库编写的简单弹球小游戏。游戏包含一个小球和一个球拍,玩家通过左右移动球拍来接住下落的小球。当小球未被接住并超出屏幕范围时,游戏结束。游戏逻辑包括小球和球拍的碰撞检测以及边界修正。程序还实现了键盘监听,允许用户通过左右箭头键控制球拍移动。
摘要由CSDN通过智能技术生成
让我们先来看一下我们所做的游戏的要求,就是普通的接球的问题,我们通过下面的木板,将求接住,接到的球将进行反弹,没有接到将将进行结束游戏。

结束状态

在这里插入图片描述

开始状态

在这里插入图片描述

写这一个简单的小游戏
1.定义小球和木板 和画布的高和宽,初始化小球的速度,定义结束的变量,和声明一个定时器
private Frame frame = new Frame("弹球小游戏");
	
	//桌面宽度
	private final int K=300;
	
	//桌面高度
	private final int G=400;
	
	//球拍的高度和宽度
	private final int QK=60;
	private final int QG=20;
	
	//球的大小
	private final int Q=16;
	
	//定义变量,纪录小球的坐标
	private int ballx=120;
	private int bally=20;
	
	//定义变量,纪录小球在X和y 方向上分别移动的速度
	private int speedy=10;
	private int speedx=5;
	
	//定义变量,纪录球拍的坐标   y坐标是固定不变的
  	private int racketx=120;
	private  final int rackety=340;

	//定义变量,标识当前游戏是否结束
	private boolean isover=false;
	//声明一个定时器
	private Timer timer;
2.定义一个类,继承canvas ,充当画布
private class mycanvas extends Canvas{
		@Override
		public void paint(Graphics g) {
			//在这里绘制内容
			if (isover) {
				//游戏结束
				g.setColor(Color.blue);
				g.setFont(new Font("Time",Font.BOLD,30));
				g.drawString("游戏结束",80,200);
			}
			else {
				//游戏中
				//绘制小球  
				g.setColor(Color.red);
				g.fillOval(ballx, bally,Q,Q);
				
				//绘制球拍
				g.setColor(Color.pink);
				g.fillRect(racketx, rackety,QK,QG);
					
			}
		}
	}
3.进行视图的组装,游戏逻辑的控制
mycanvas drawarea = new mycanvas();
	
	public void init() {
		//视图的组装,游戏逻辑的控制
		
		//完成球拍的坐标的变化
		KeyListener listener = new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				int  s = e.getKeyCode(); // 获取键盘的整数
				if (s==KeyEvent.VK_LEFT) {
					//  <- 应该向左移动
					if (racketx>0) {
						racketx-=10;
					}
					
				}
				if (s==KeyEvent.VK_RIGHT) {
					//  ->  应该向右移动
					if (racketx<K-QK) {
						racketx+=10;
					}
				}
			}
		};
		//给frame 和 drawArea 设置监听器
		frame.addKeyListener(listener);
		drawarea.addKeyListener(listener);
4.小球的控制,以及最后的调用过程
// 小球坐标的控制
		ActionListener task = new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				
				//根据边界范围来修正运动
				if (ballx<=0 || ballx>=(K-Q)) {
					speedx=-speedx;
				}
				if (bally<=0 || (bally>rackety-Q && ballx>racketx && ballx<ballx+QK)) {
					speedy=-speedy;
				}
				
				// 小球超出了球拍的范围  结束游戏
				if (bally>rackety-Q &&(ballx<racketx || ballx>racketx+QK)) {
					
					// 停止定时器
					isover=true;
					
					drawarea.repaint();
	
				}
				// 更新小球的坐标,重绘桌面
				ballx+=speedx;
				bally+=speedy;
				
				
				//重绘界面
				drawarea.repaint();
				
				
			}
		};
		timer = new Timer(100,task);
		timer.start();
		
		drawarea.setPreferredSize(new Dimension(K,G));
		frame.add(drawarea);
		
		
		frame.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);
			}
		});
		
		frame.pack();
		frame.setVisible(true);
		
	}
	public static void main(String[] args) {
		弹球小游戏 a = new 弹球小游戏();
		a.init();
	}
	

}

将上面的代码组装起来就是下面的代码

package demo38_awt_3;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
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.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.Timer;

public class 弹球小游戏 {
	private Frame frame = new Frame("弹球小游戏");
	
	//桌面宽度
	private final int K=300;
	
	//桌面高度
	private final int G=400;
	
	//球拍的高度和宽度
	private final int QK=60;
	private final int QG=20;
	
	
	//球的大小
	private final int Q=16;
	
	//定义变量,纪录小球的坐标
	private int ballx=120;
	private int bally=20;
	
	//定义变量,纪录小球在X和y 方向上分别移动的速度
	private int speedy=10;
	private int speedx=5;
	
	
	//定义变量,纪录球拍的坐标   y坐标是固定不变的
  	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) {
			//在这里绘制内容
			if (isover) {
				//游戏结束
				g.setColor(Color.blue);
				g.setFont(new Font("Time",Font.BOLD,30));
				g.drawString("游戏结束",80,200);
			}
			else {
				//游戏中
				//绘制小球  
				g.setColor(Color.red);
				g.fillOval(ballx, bally,Q,Q);
				
				
				//绘制球拍
				g.setColor(Color.pink);
				g.fillRect(racketx, rackety,QK,QG);
				
				
			}
		}
	}
	
	//创建绘画区域
	mycanvas drawarea = new mycanvas();
	
	public void init() {
		//视图的组装,游戏逻辑的控制
		
		//完成球拍的坐标的变化
		KeyListener listener = new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				int  s = e.getKeyCode(); // 获取键盘的整数
				if (s==KeyEvent.VK_LEFT) {
					//  <- 应该向左移动
					if (racketx>0) {
						racketx-=10;
					}
					
				}
				if (s==KeyEvent.VK_RIGHT) {
					//  ->  应该向右移动
					if (racketx<K-QK) {
						racketx+=10;
					}
				}
			}
		};
		
		
		//给frame 和 drawArea 设置监听器
		frame.addKeyListener(listener);
		drawarea.addKeyListener(listener);
		
		
		// 小球坐标的控制
		ActionListener task = new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				
				//根据边界范围来修正运动
				if (ballx<=0 || ballx>=(K-Q)) {
					speedx=-speedx;
				}
				if (bally<=0 || (bally>rackety-Q && ballx>racketx && ballx<ballx+QK)) {
					speedy=-speedy;
				}
				
				// 小球超出了球拍的范围  结束游戏
				if (bally>rackety-Q &&(ballx<racketx || ballx>racketx+QK)) {
					
					// 停止定时器
					isover=true;
					
					drawarea.repaint();
	
				}
				// 更新小球的坐标,重绘桌面
				ballx+=speedx;
				bally+=speedy;
				
				
				//重绘界面
				drawarea.repaint();
				
				
			}
		};
		timer = new Timer(100,task);
		timer.start();
		
		drawarea.setPreferredSize(new Dimension(K,G));
		frame.add(drawarea);
		
		
		frame.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);
			}
		});
		
		frame.pack();
		frame.setVisible(true);
		
	}
	public static void main(String[] args) {
		弹球小游戏 a = new 弹球小游戏();
		a.init();
	}
	

}

package org.crazyit.ball; import java.awt.Image; import java.io.File; import javax.imageio.ImageIO; import java.io.IOException; /** * 小球对象 * * @author yangenxiong yangenxiong2009@gmail.com * @author Kelvin Mak kelvin.mak125@gmail.com * @version 1.0 * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> * <br>Copyright (C), 2009-2010, yangenxiong * <br>This program is protected by copyright laws. */ public class Ball extends BallComponent { // 定义球的竖向速度 private int speedY = 10; // 定义弹球的横向速度 private int speedX = 8; // 定义是否在运动 private boolean started = false; // 定义是否结束运动 private boolean stop = false; /** * m 有参数构造器 * * @param panelWidth * int 画板宽度 * @param panelHeight * int 画板高度 * @param offset * int 位移 * @param path * String 图片路径 */ public Ball(int panelWidth, int panelHeight, int offset, String path) throws IOException { // 调用父构造器 super(panelWidth, panelHeight, path); // 设置y坐标 this.setY(panelHeight - super.getImage().getHeight(null) - offset); } /** * 设置横向速度 * * @param speed * int 速度 * @return void */ public void setSpeedX(int speed) { this.speedX = speed; } /** * 设置竖向速度 * * @param speed * int 速度 * @return void */ public void setSpeedY(int speed) { this.speedY = speed; } /** * 设置是否在运动 * * @param b * boolean * @return void */ public void setStarted(boolean b) { this.started = b; } /** * 设置是否结束运动 * * @param b * boolean * @return void */ public void setStop(boolean b) { this.stop = b; } /** * 返回横向速度 * * @return int 速度 */ public int getSpeedX() { return this.speedX; } /** * 返回竖向速度 * * @return int 速度 */ public int getSpeedY() { return this.speedY; } /** * 是否在运动 * * @return boolean 是否在运动 */ public boolean isStarted() { return this.started; } /** * 是否已经结束运动 * * @return boolean 是否已经结束运动 */ public boolean isStop() { return this.stop; } }
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值