首页 > 代码库 > 是男人就坚持20秒java的swing弹弹球小游戏代码

是男人就坚持20秒java的swing弹弹球小游戏代码

package com.day09.am01;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/*
 * 1--窗口+面板+固定
 * 2--在面板上画出一个小球(中央处)
 * 3--让小球动起来
 * 4--对小球的运动方向和方向值进行判断,并进行处理方向的修正,实现小球的反弹
 * 5--添加挡板并实现鼠标控制挡板移动
 * 6--小球碰到挡板和没有碰到挡板的情况处理
 * 
 * 
 */
public class TTQGame extends JFrame implements MouseMotionListener{
	private static final long serialVersionUID = 1L;
	private int fw = 800 ; //窗口的尺寸
	private int fh = 600 ;
	private TTQP ttqp = null ;
	private int bx = 200 ; //球的初始位置
	private int by = 200 ;
	private int b2r = 50 ; //球的尺寸
	private String direction = "right_down" ; //初始方向 右下
	private Timer timer = new Timer();
	private int block_x = 350 ;
	private int block_y = 580 ;
	private int block_w = 100 ;
	private int block_h = 20 ;
	
	private int speed = 1 ;
	private int score = 0 ;
	
	public TTQGame() {
		this.setAlwaysOnTop(true);
		this.setUndecorated(true);
		this.getContentPane().setBackground(Color.BLACK);
		this.setSize(fw, fh);
		this.setLocationRelativeTo(null);
		this.setResizable(false);
		ttqp = new TTQP();
		this.add(ttqp);
		this.setVisible(true);
		this.addMouseMotionListener(this);
		this.addKeyListener(new KeyListener() {
			@Override
			public void keyTyped(KeyEvent e) {}
			@Override
			public void keyReleased(KeyEvent e) {}
			@Override
			public void keyPressed(KeyEvent e) {if(e.getKeyCode()==32){System.exit(0);}}});
	}
	class TTQP extends JPanel{
		private static final long serialVersionUID = 1L;
		public TTQP() {
			this.setOpaque(false);
			timer.schedule(new TimerTask() {
				@Override
				public void run() {  //实现小球的移动
					/*
					 * 定义好每一个方向的坐标处理
					 */
					if("right_down".equalsIgnoreCase(direction)){ //右下方向的位置处理
						bx += speed ;  by += speed  ;
					}
					if("right_up".equalsIgnoreCase(direction)){ //右上方向的位置处理
						bx += speed ;  by -= speed ;
					}
					if("left_up".equalsIgnoreCase(direction)){//左上方向的位置处理
						bx -= speed ;  by -= speed ;
					}
					if("left_down".equalsIgnoreCase(direction)){//左下方向的位置处理
						bx -= speed ;  by += speed ;
					}
					/*
					 * 定义好发生什么情况时,如何修正小球的方向
					 */
//					如果小球底部y坐标值》=挡板上边的y坐标	by + b2r >= block_y 	
//					并且小球底部x坐标值》=挡板上边的x坐标	bx + b2r/2 >= block_x 
//					并且《=挡板上边的x坐标值+挡板的宽度       bx + b2r/2 <= block_x + block_w 		
//					那么 正常改变方向		
//					否则 程序停止 GAME OVER		
//					if(by+b2r>=fh){ //底边的判断
//						if("right_down".equalsIgnoreCase(direction)){ //小球来自右下
//							direction = "right_up" ;
//						}else{ //小球来自左下
//							direction = "left_up" ;
//						}
//					}
					if(by + b2r >= block_y && bx + b2r/2 >= block_x && bx + b2r/2 <= block_x + block_w){
						if("right_down".equalsIgnoreCase(direction)){ //小球来自右下
							direction = "right_up" ;
							speed ++ ;
							score ++ ;
						}else{ //小球来自左下
							direction = "left_up" ;
							speed ++ ;
							score ++ ;
						}
					}
					if(by + b2r >= fh){
						JOptionPane.showMessageDialog(ttqp, "GAME OVER !", "玩家提示信息",JOptionPane.DEFAULT_OPTION);
						Runtime.getRuntime().exit(0);
					}
					
					if(bx+b2r>=fw){ //右边的判断
						if("right_up".equalsIgnoreCase(direction)){ //小球来自 右上
							direction = "left_up" ;
						}else{  //小球来自右下
							direction = "left_down" ;
						}
					}
					if(by<=0){ //顶边的判断
						if("left_up".equalsIgnoreCase(direction)){ //小球来自 左上
							direction = "left_down" ;
						}else{  //小球来自右上
							direction = "right_down" ;
						}
					}
					if(bx<=0){ //左边的判断
						if("left_up".equalsIgnoreCase(direction)){ //小球来自 左上
							direction = "right_up" ;
						}else{  //小球来自左下
							direction = "right_down" ;
						}
					}
					TTQP.this.repaint() ;
				}
			}, 0 , 10) ;
		}
		@Override
		public void paint(Graphics g) {
			g.setColor(Color.WHITE);
			g.fillOval(bx, by, b2r, b2r);
			
			g.setColor(Color.PINK);
			g.fillRect(block_x, block_y, block_w, block_h);
			
			g.setColor(Color.RED) ;
			g.drawString("SCORE : " + score, 20, 20) ;
		}
	}
	public static void main(String[] args) {
		new TTQGame();
	}
	@Override
	public void mouseDragged(MouseEvent e) { //拖拽方法 实现控制挡板的移动
		block_x = e.getX() ;
		if(block_x <=0){
			block_x = 0 ;
		}
		if(block_x+block_w >=fw){
			block_x = fw-block_w ;
		}
		this.repaint() ;
	}
	@Override
	public void mouseMoved(MouseEvent e) {}
}






















是男人就坚持20秒java的swing弹弹球小游戏代码