java弹球游戏

欢迎访问我的个人博客 https://jialaner.cn/       

在上次的博客中谈到了面向对象的开发思想,在我的理解中面向对象编程思想,就意味着现实与程序的抽象对接,也就是很多人说的万事万物皆对象了。

       就像在今天的博客中写到的弹球游戏一样,把实际存在的具有相同属性和行为的事物抽象为一个类,此类就拥有了其中的属性和行为,在使用它时就可以通过它的对象进行操作类中的一些属性和方法。弹球游戏中我们可以将球、弹板、背景抽象为几个类。

●Ball球类:属性:坐标、半径、颜色、X轴Y轴运动的方向速度   方法:球的运动

●Boald弹板类:属性:状态、坐标、长宽、颜色 方法:弹板的移动

●GameView类:此类就是窗口的创建,执行游戏的画图,以及重画。

●GameRun类:此类为刷新界面类,就是控制重画的速度。

●GameControl类:此类是监听键盘类,此类控制着弹板的移动。

上一个效果图:

现在开始上代码;

Ball类:

public class Ball {
	
	public static boolean ballstate = true;
	private int ballRX;
	private int ballRY;
	private final int BALL_R = 10;
	private Color BALL_COLOR;
	
	private int directionX = -1;
	private int directionY = 1;
	
	
	
	private Boald boaldTop;
	private Boald boaldDown;
	
	public Ball(int ballRX, int ballRY, Color BALL_COLOR, Boald boaldTop, Boald boaldDown) {
		
		this.setBallRX(ballRX);
		this.setBallRY(ballRY);
		this.setBALL_COLOR(BALL_COLOR);
		
		this.boaldTop = boaldTop;
		this.boaldDown = boaldDown;
	}

	public int getBallRX() {
		return ballRX;
	}

	public void setBallRX(int ballRX) {
		this.ballRX = ballRX;
	}

	public int getBallRY() {
		return ballRY;
	}

	public void setBallRY(int ballRY) {
		this.ballRY = ballRY;
	}

	public Color getBALL_COLOR() {
		return BALL_COLOR;
	}

	public void setBALL_COLOR(Color bALL_COLOR) {
		BALL_COLOR = bALL_COLOR;
	}

	public int getBALL_R() {
		return BALL_R;
	}

	public void ballMove() {
		
		
		
		if(ballstate) {
			
			if(ballRX - BALL_R<= 0 || ballRX + BALL_R>= GameView.VIEW_WIDTH) {
				directionX = -directionX;
			}
			
			if(ballRY - BALL_R <= boaldTop.getBoaldY() + boaldTop.getBOALD_HEIGHT() && ballRY - BALL_R >= boaldTop.getBoaldY() &&
					ballRX + BALL_R >= boaldTop.getBoaldX() && boaldTop.getBoaldX()+ boaldTop.getBOALD_WIDTH() >= ballRX - BALL_R) {
				
				directionY = -directionY;		
			}
			
			if(ballRY + BALL_R >= boaldDown.getBoaldY() && ballRY + BALL_R <= boaldDown.getBoaldY() + boaldDown.getBOALD_HEIGHT()&&
					ballRX + BALL_R >= boaldDown.getBoaldX() && boaldDown.getBoaldX() + boaldDown.getBOALD_WIDTH() >= ballRX - BALL_R){
					
				directionY = -directionY;
			}
				
			if(ballRY - BALL_R >= GameView.VIEW_HEIGHT || ballRY + - BALL_R <= 0) {
				
				ballstate = false;
			}
			
			
			ballRX = ballRX + directionX;
			ballRY = ballRY + directionY;
		}
		
	}

}

Boald类:

public class Boald {
	
	//0静止 ,4左边  6右边
	private int boaldState = 0;
	private int boaldX;
	private int boaldY;
	private Color color = Color.blue;
	private final int BOALD_WIDTH = 130;
	private final int BOALD_HEIGHT = 20;
	
	public Boald(int boaldX, int boaldY) {
		
		this.boaldX = boaldX;
		this.boaldY = boaldY;
	}

	public int getBoaldX() {
		return boaldX;
	}

	public void setBoaldX(int boaldX) {
		this.boaldX = boaldX;
	}

	public int getBoaldY() {
		return boaldY;
	}

	public void setBoaldY(int boaldY) {
		this.boaldY = boaldY;
	}

	public Color getColor() {
		return color;
	}

	public void setColor(Color color) {
		this.color = color;
	}
	public int getBOALD_WIDTH() {
		return BOALD_WIDTH;
	}

	public int getBOALD_HEIGHT() {
		return BOALD_HEIGHT;
	}
	

	public void setBoaldState(int boaldState) {
		this.boaldState = boaldState;
	}
	public void boaldMove() {
		
		switch(GameControl.state) {
		
		case 4:
			boaldX = boaldX - 5;
			break;
		case 5:
			
			break;
		case 6:
			boaldX = boaldX + 5;
			break;
			
		}
	}

	
}

GameView类:

public class GameView extends Frame{
	
	private static final long serialVersionUID = 1L;
	private Random random = new Random();
	
	public static final int VIEW_WIDTH = 600;
	public static final int VIEW_HEIGHT = 1000;
	//位图
	private Image ImageBuffer = null;  
	private Graphics GraImage = null; 
		
	private Boald boaldTop;
	private Boald boaldDown;
	private Ball ball;
	
	private GameRun gameRun;
	
	public GameView() {
		
		boaldTop = new Boald(0,0);
		boaldDown = new Boald(0,0);
		ball = new Ball(0, 0, Color.WHITE, boaldTop, boaldDown);
		
		boaldTop.setBoaldX(random.nextInt((int)(VIEW_WIDTH - boaldTop.getBOALD_WIDTH())));
		boaldTop.setBoaldY(boaldTop.getBOALD_HEIGHT() * 3);
		
		boaldDown.setBoaldX(boaldTop.getBoaldX());
		boaldDown.setBoaldY((int)(VIEW_HEIGHT-boaldDown.getBOALD_HEIGHT()*3));
		
		ball.setBallRX((int)(boaldTop.getBoaldX()+boaldTop.getBOALD_WIDTH()/2));
		ball.setBallRY(boaldTop.getBoaldY() + boaldTop.getBOALD_HEIGHT() + ball.getBALL_R() + 5);
		
		gameRun = new GameRun(this, boaldTop, boaldDown, ball);
		gameRun.start();
	}

	public static void main(String[] args) {
		
		new GameView().init();
	}
	
	public void init() {
		
		this.setTitle("弹球游戏");
		this.setSize(VIEW_WIDTH, VIEW_HEIGHT);
		this.setBackground(Color.BLACK);
		this.addKeyListener(new GameControl());
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent we) {
				
				System.exit(0);
			}
		});
		this.setVisible(true);
	}
	//画图
	public void paint(Graphics g) {
		g.setColor(ball.getBALL_COLOR());
		g.fillOval(ball.getBallRX() - ball.getBALL_R(), ball.getBallRY() - ball.getBALL_R(), ball.getBALL_R() * 2, ball.getBALL_R() * 2);
		g.setColor(boaldTop.getColor());
		g.fillRect(boaldTop.getBoaldX(), boaldTop.getBoaldY(), boaldTop.getBOALD_WIDTH(), boaldTop.getBOALD_HEIGHT());
		g.setColor(boaldDown.getColor());
		g.fillRect(boaldDown.getBoaldX(), boaldDown.getBoaldY(), boaldDown.getBOALD_WIDTH(), boaldDown.getBOALD_HEIGHT());
	
		if(Ball.ballstate == false) {
			g.setFont(new Font("隶书",Font.BOLD,40));
			g.drawString("游戏结束", 210, 500);
		}
		
	}
	public void update(Graphics g) {
		
		 //创建图形缓冲区  
		 ImageBuffer = createImage(this.getWidth(), this.getHeight());   
		 //获取图形缓冲区的图形上下文  
		 GraImage = ImageBuffer.getGraphics();    
		 //用paint方法中编写的绘图过程对图形缓冲区绘图  
		 paint(GraImage);     
	     //释放图形上下文资源  
		 GraImage.dispose();     
		 //将图形缓冲区绘制到屏幕上  
		 g.drawImage(ImageBuffer, 0, 0, this);  
		
	}

}

GameRun类:

public class GameRun extends Thread{
	
	private int sleepTime = 3;
	private GameView gameView;
	private Boald boaldTop;
	private Boald boaldDown;
	private Ball ball;
	
	public GameRun(GameView gameView, Boald boaldTop,Boald boaldDown, Ball ball) {
		
		this.gameView = gameView;
		this.boaldTop = boaldTop;
		this.boaldDown = boaldDown;
		this.ball = ball;
	}
	
	public void run() {
		
		while(true) {
			
			if(Ball.ballstate) {
				
				gameView.repaint();
				boaldTop.boaldMove();
				boaldDown.boaldMove();
				ball.ballMove();
				
				try {
					Thread.sleep(sleepTime);
				} catch (InterruptedException e) {
					
					e.printStackTrace();
				}
				
			}
			
			
		}
	}

}

GameControl类:

public class GameControl implements KeyListener{
	
	public static int state = 5;
	
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyPressed(KeyEvent e) {
		
		switch(e.getKeyCode()) {
		
		case KeyEvent.VK_LEFT:
			state = 4;
			break;
		case KeyEvent.VK_RIGHT:
			state = 6;
			break;
			
		default:
			
			break;
		}
		
	}

	@Override
	public void keyReleased(KeyEvent e) {
		
		state = 5;
	}
	
	

}

这个游戏还有一些边界处理的问题没有解决。勿喷!

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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; } }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值