1.新建一個普通的java專案

2.新建一個檔案夾imags是用來放圖片素材

3.在src創建一個檔案夾com.sxt是用來放物體類的
步驟
1.視窗繪制
2.繪制圖片
3.線繪制
4.線搖擺
5.線抓取
6.創建金塊
7.雙快取
8.抓取判定
9.抓取回傳
10.創建多個金塊
11.石塊創建
12.拉取速度
13.創建多種金塊
14.物體堆疊
15.線完善
16.積分設定
17.爆破
18.關卡設定
19.游戲狀態
20.游戲計時效果
21.成功效果
22.失敗效果
23.游戲重置效果
24.商店購物效果
4.在com.sxt檔案夾創建六個物體類Bg、Gametest、Gold、line、Object、Rock

原始碼
Bg類
package com.sxt;
import java.awt.*;
public class Bg {
//關卡數
static int level = 1;
//目標得分
int goal = level*5;
//總分
static int count = 0;
//藥水數量
static int waterNum = 3;
//藥水狀態,默認是F,T表示正在使用
static boolean waterFlag = false;
//開始時間
long startTime;
//結束時間
long emdTime;
//藥水價格
int price = (int) (Math.random ()*10);
//是否進入商店f不購買
boolean shop = false;
//載入圖片
Image bg = Toolkit.getDefaultToolkit ().getImage ("imags/bg.JPG"); //地面
Image bg1 = Toolkit.getDefaultToolkit ().getImage ("imags/bg1.JPG"); //天空
Image peo = Toolkit.getDefaultToolkit ().getImage ("imags/peo.PNG"); //礦工
Image water = Toolkit.getDefaultToolkit ().getImage ("imags/water.PNG");//藥水圖片
//繪制
void piantSeif(Graphics g){
g.drawImage (bg,0,200,null);
g.drawImage (bg1,0,0,null);
switch (Gametest.state){
case 0:
drawWord (g,80,Color.green,"準備開始",200,400);
break;
case 1:
g.drawImage (peo,310,50,null);
drawWord (g,30,Color.black,"積分:"+count,30,150);
//藥水組件
g.drawImage (water,450,40,null);
drawWord (g,30,Color.black,"*"+waterNum,510,70);
//關卡數
drawWord (g,20,Color.black,"第"+level+"關",30,60);
//目標積分
drawWord (g,30,Color.black,"目標"+goal,30,110);
//時間組件
emdTime = System.currentTimeMillis ();
long tim = 20-(emdTime-startTime) /1000;
drawWord (g,30,Color.black,"時間"+(tim>0?tim:0),520,150);
break;
case 2:
//藥水組件
g.drawImage (water,300,400,null);
drawWord (g,30,Color.black,"價格"+price,300,500);
drawWord (g,30,Color.black,"是否購買?",300,550);
if(shop){
count = count-price;
waterNum++;
shop=false;
Gametest.state=1;
startTime=System.currentTimeMillis ();
}
break;
case 3:
drawWord (g,80,Color.cyan,"失敗",250,350);
drawWord (g,80,Color.cyan,"積分:"+count,200,450);
break;
case 4:
drawWord (g,80,Color.red,"成功",250,350);
drawWord (g,80,Color.red,"積分:"+count,200,450);
break;
default:
}
}
//t倒計時完成,f正在倒計時
boolean gametime (){
long tim =(emdTime-startTime)/1000;
if(tim>20){
return true;
}
return false;
}
//重置元素
void reGame(){
//關卡數
level = 1;
//目標得分
goal = level*5;
//總分
count = 0;
//藥水數量
waterNum = 3;
//藥水狀態,默認是F,T表示正在使用
waterFlag = false;
}
//繪制字串
public static void drawWord(Graphics g,int size,Color color,String str,int x,int y){
//字串顏色
g.setColor (color);
//字體
g.setFont (new Font ("仿宋",Font.BOLD,size));
//列印字串
g.drawString (str,x,y);
}
}
Gametest類
package com.sxt;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
//繼承JFrame類
public class Gametest extends JFrame {
//0未開始 1運行 2商店 3失敗 4勝利
static int state;
//存盤金塊,石塊
List<Object> objectList = new ArrayList<> ();
Bg bg = new Bg ();
line line = new line (this);
//金子
//添加金塊:無參構造
{
//是否可以放置
boolean isPlace = true;
//金塊創建
for (int i = 0; i < 11; i++) {
double random = Math.random ();
Gold gold;//存放當前生產的金塊
if(random<0.3){gold = new GoldMini ();}
else if(random<0.7){ gold = new Gold ();}
else {gold = new GoldPlus ();}
for(Object obj:objectList){
if(gold.getRec ().intersects (obj.getRec ())){
//不可放置,需要重新生成
isPlace= false;
}
}
if(isPlace){ objectList.add (gold);}
else { isPlace=true;i--;}
}
//石塊創建
for (int i = 0; i < 5; i++) {
Rock rock = new Rock ();
for ( Object obj:objectList){
if(rock.getRec ().intersects (obj.getRec ())){
isPlace=false; }
}
if (isPlace){ objectList.add (rock); }
else {isPlace=true;i--;}
}
}
//閃動問題
Image offScreenImage;
void launch(){
this.setVisible (true);
this.setSize (768,1000);
this.setLocationRelativeTo (null);
this.setTitle ("bubbles礦工");
//關閉視窗
setDefaultCloseOperation (EXIT_ON_CLOSE);
addMouseListener (new MouseAdapter () {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked (e);
switch (state){
case 0:
if(e.getButton ()==3){
state=1;
bg.startTime = System.currentTimeMillis ();
}
break;
case 1:
//左右搖擺,點擊右鍵
if (e.getButton () == 1&&line.state==0) {
line.state = 1; }
//抓取回傳,點擊右鍵
if(e.getButton ()==3&&line.state==3&&Bg.waterNum>0){
Bg.waterFlag=true;
Bg.waterNum--;
}
break;
case 2:
if(e.getButton ()==1){
bg.shop=true;
}
if(e.getButton ()==3){
state=1;
bg.startTime = System.currentTimeMillis ();
}
break;
case 3:
case 4:
if(e.getButton ()==1){
state=0;
bg.reGame ();
line.reGame ();
}
break;
default:
}
}
});
while (true) {
repaint ();
nextLevel ();
//添加延時效果
try {
Thread.sleep (10);
} catch (InterruptedException e) {
e.printStackTrace ();
}
}
}
//下一關
public void nextLevel(){
if(bg.gametime () && state==1){
if(Bg.count >= bg.goal){
if(Bg.level==5){
state=4;
}
else {
state = 2;
Bg.level++;
}
}else{
state=3;
}
dispose ();
Gametest gametest1 = new Gametest ();
gametest1.launch ();
}
}
//繪制方法
@Override
public void paint(Graphics g) {
offScreenImage = this.createImage (768,1000 );
//添加畫筆
Graphics gImage = offScreenImage.getGraphics ();
bg.piantSeif (gImage);
if(state==1){
//繪制物體
for(Object obj:objectList){
obj.paintSeif (gImage);
}
line.pianSelf (gImage);
}
g.drawImage (offScreenImage,0,0,null);
}
public static void main(String[] args) {
Gametest gametest = new Gametest ();
gametest.launch ();
}
}
Gold類
package com.sxt;
import java.awt.*;
//金塊類
public class Gold extends Object{
Gold(){
//設定亂數金塊
this.x =(int)(Math.random()*700);
this.y =(int)(Math.random()*550+300);
this.width=52;
this.height=52;
this.flag = false;
//拉取速度
this.m = 30;
this.count = 4;
this.type=1;
this.img = Toolkit.getDefaultToolkit ().getImage ("imags/gold1.GIF");
}
}
class GoldMini extends Gold{
GoldMini(){
//設定金塊寬高
this.width=36;
this.height=36;
this.m= 15;
this.count = 2;
this.img = Toolkit.getDefaultToolkit ().getImage ("imags/gold0.GIF");
}
}
class GoldPlus extends Gold{
GoldPlus(){
this.x =(int)(Math.random()*650);
//設定金塊寬高
this.width=105;
this.height=105;
this.m= 60;
this.count = 8;
this.img = Toolkit.getDefaultToolkit ().getImage ("imags/gold2.GIF");
}
}
line類
package com.sxt;
import java.awt.*;
public class line {
//起點坐標
int x = 380;
int y =180;
//終點坐標
int ebdx=500;
int endy=500;
//線長
double length = 100;
//線長最小值
double MIN_length = 100;
//線長最大值
double MAX_length = 750;
double n = 0;
//方向
int dir = 1;
//狀態 0 搖擺 1 抓取 2 識訓 3.抓取回傳
int state;
//鉤爪圖片
Image hook = Toolkit.getDefaultToolkit ().getImage ("imags/hook.PNG");
Gametest frname;
line(Gametest frname){ this.frname=frname; }
//碰撞檢測,檢測物體是否被抓取
void logic(){
for (Object obj:this.frname.objectList) {
if(ebdx>obj.x && ebdx<obj.x+obj.width
&& endy>obj.y && endy<obj.y+obj.height){
state = 3;
obj.flag=true;
}
}
}
//繪制方法
void lines(Graphics g){
ebdx = (int) (x +length*Math.cos (n*Math.PI)); //強制轉換(int)()
endy = (int) (y +length*Math.sin (n*Math.PI)); //強制轉換(int)()
g.setColor (Color.red);
g.drawLine (x-1,y,ebdx-1,endy);
g.drawLine (x,y,ebdx,endy);
g.drawLine (x+1,y,ebdx+1,endy); //傳入坐標
g.drawImage (hook,ebdx-36,endy-2,null);
}
void pianSelf(Graphics g){
//繪制中的判斷 logic
logic ();
switch (state) {
case 0:
if (n < 0.1) {
dir = 1;
} else if (n > 0.9) {
dir = -1;
}
//讓線動起來
n = n + 0.005 * dir;
lines (g);
break;
case 1:
if (length < MAX_length) {
length = length + 5;
lines (g);
} else {
state = 2;
}
break;
case 2:
//識訓
if (length > MIN_length) {
length = length - 5;
lines (g);
} else {
state = 0;
}
break;
case 3:
int m = 1;
//抓取回傳
if (length > MIN_length) {
length = length - 5;
lines (g);
for (Object obj : this.frname.objectList) {
if (obj.flag) {
m = obj.m;
obj.x = ebdx - obj.getWidth () / 2;
obj.y = endy;
if (length <= MIN_length) {
obj.x = -150;
obj.y = -150;
obj.flag = false;
Bg.waterFlag=false;
//加分
Bg.count+=obj.count;
state = 0;
}
if (Bg.waterFlag){
if (obj.type==1){
m=1;
}
if(obj.type==2){
obj.x = -150;
obj.y = -150;
obj.flag = false;
Bg.waterFlag=false;
state = 2;
}
}
}
}
}
//添加延時
try{
Thread.sleep (m);
}catch (InterruptedException e){
e.printStackTrace ();
}
break;
default:
}
}
//重置線
void reGame(){
n=0;
length=100;
}
}
Objct類
package com.sxt;
import java.awt.*;
public class Object {
//坐標
int x;
int y;
//寬高
int width;
int height;
//圖片
Image img;
//標記,是否能移動
boolean flag;
//質量
int m;
//積分
int count;
//型別 1.金塊 2.石塊
int type;
void paintSeif(Graphics g){
g.drawImage (img,x,y,null);
}
public int getWidth() { return width; }
//獲取矩形
public Rectangle getRec(){
return new Rectangle (x,y,width,height);
}
}
Rock類
package com.sxt;
import java.awt.*;
//石塊類
public class Rock extends Object {
Rock(){
this.x =(int)(Math.random()*700);
this.y =(int)(Math.random()*550+300);
this.width=71;
this.height=71;
this.flag = false;
//拉取速度
this.m =50;
this.count = 1;
this.type=2;
this.img = Toolkit.getDefaultToolkit ().getImage ("imags/rock1.PNG");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/294928.html
標籤:java
上一篇:Java - 類和物件
下一篇:Java反射超詳解?
