最终实现不同角度,小球开始落下。与墙体碰撞后反弹,落在球板上加分。落地结束。
项目结构:
Ui类
/**
* 定义界面
* 显示球板
* 球板动画
* 球板对键盘的响应
* 键盘事件响球拍的左右移动
* 球直线下落
* 实现小球上下来回运动
* 实现直线碰撞的检测
* 随机位置生成球
*游戏结束的判断
* 积分
* 角度落球
*/
package com.huizhi;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
public class Ui extends JFrame {
static int PositionA=0,PositionB=450,RecWidth=100,RecHeight=20,Width=900;//球板
static int BallWidth=25,BallHeight=25,PositionX,PositionY;//球的坐标及大小
static boolean blIsOver;
static int intSore;
//定义角度的变量
static int intDu;
public Ui(){
setTitle("弹球游戏");
setBackground(Color.WHITE);
setSize(900,600);
setLocation(300,50);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
PositionX=(int)(Math.random()*100)+300;
PositionY=(int)(Math.random()*100)+100;
intDu= (int)(Math.random()*3)+1;
// System.out.println(intDu);
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
//JOptionPane.showMessageDialog(null,e.getKeyChar(),"22",JOptionPane.INFORMATION_MESSAGE);
char aa=e.getKeyChar();
if(aa=='d'){//此处测试时注意字母输入时的大小写
PositionA+=5;
}
else if(aa=='a'){
PositionA-=5;
}
}
});
}
public void paint(Graphics g) {
if(blIsOver){
g.setFont(new Font("宋体", ALLBITS, 50));
g.setColor(Color.RED);
g.drawString(new String("游戏结束!"), 550, 250);
g.drawString(new String("你的得分:"+String.valueOf(intSore)), 250, 350);
return;
}
g.clearRect(0,0,900,600);//0,0:是相对于容器的坐标
g.setColor(Color.red);
g.fillRect(PositionA , PositionB, RecWidth, RecHeight);
g.setColor(Color.green);
g.fillOval(PositionX,PositionY,BallWidth,BallHeight);
}
}
ThreadPaddles类:
package com.huizhi;
import javax.swing.*;
public class ThreadPaddles extends Thread{
public void run(){
while(true){
if(Ui.PositionX>Ui.PositionA&&Ui.PositionX+25<=Ui.PositionA+Ui.RecWidth){
if(Ui.PositionY>=Ui.PositionB&&Ui.PositionY<=Ui.PositionB+Ui.RecHeight){
//ThreadBall.blUpOrDown=true;
Ui.intSore+=10;
System.out.println(Ui.intSore);
switch (Ui.intDu){
case 1:
Ui.intDu=3;
break;
case 2:
Ui.intDu=4;
break;
}
JOptionPane.showMessageDialog(null,Ui.PositionX,"2", JOptionPane.INFORMATION_MESSAGE);
}
}
try {
sleep(500);//参数改小时,分数会错误,因为执行的次数多。
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void setListen(){
}
}
ThreadControle类:
package com.huizhi;
public class ThreadControle extends Thread {
Ui ui=new Ui();
public void run(){
if(!Ui.blIsOver){
while(true){
ui.repaint();
}
}
}
}
ThreadBall类:
package com.huizhi;
public class ThreadBall extends Thread {
static boolean blUpOrDown;
public void run(){
while(true){
if(Ui.PositionY>=600){
// Ui.PositionY-=50;
// blUpOrDown=true;
Ui.blIsOver=true;
}
else if(Ui.PositionY<600){
blUpOrDown=false;
}
// System.out.println(blUpOrDown);
System.out.println(Ui.intDu);
//向上碰撞上墙面的情况
if(Ui.PositionY<=0){
if(Ui.intDu==3){
Ui.intDu=1;
}
else if(Ui.intDu==4){
Ui.intDu=2;
}
}
//左侧墙面碰撞
if(Ui.PositionX<=0){
if(Ui.intDu==2){
Ui.intDu=1;
}
else if(Ui.intDu==4){
Ui.intDu=3;
}
}
//右侧墙面碰撞
if(Ui.PositionX>=900){
if(Ui.intDu==1){
Ui.intDu=2;
}
else if(Ui.intDu==3){
Ui.intDu=2;
}
}
if(!blUpOrDown){
switch (Ui.intDu){
//1为右下方行进,2为左下方,3 为右上方,4为左上方
case 1:
Ui.PositionY+=6;
Ui.PositionX+=6;
System.out.println(Ui.PositionX);
System.out.println(Ui.PositionY);
System.out.println(Ui.PositionA);
System.out.println(Ui.PositionB);
break;
case 2:
Ui.PositionY+=6;
Ui.PositionX-=6;
break;
case 3:
Ui.PositionY-=6;
Ui.PositionX+=6;
// System.out.println(Ui.PositionX);
// System.out.println(Ui.PositionY);
break;
case 4:
Ui.PositionY-=6;
Ui.PositionX-=6;
break;
}
}
try {
sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Main类:
package com.huizhi;
public class Main {
public static void main(String[] args) {
ThreadBall threadBall=new ThreadBall();
ThreadPaddles threadPaddles=new ThreadPaddles();
ThreadControle threadControle=new ThreadControle();
threadPaddles.start();
threadControle.start();
threadBall.start();
try {
threadPaddles.join();
threadControle.join();
threadBall.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}