溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么實現(xiàn)升級版布谷鳥闖關游戲

發(fā)布時間:2022-02-28 10:10:01 來源:億速云 閱讀:151 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Java怎么實現(xiàn)升級版布谷鳥闖關游戲”,在日常操作中,相信很多人在Java怎么實現(xiàn)升級版布谷鳥闖關游戲問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java怎么實現(xiàn)升級版布谷鳥闖關游戲”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

前言

《布谷鳥闖關-升級版》是一個基于java的布谷鳥闖關游戲,鼠標左鍵點擊控制鳥的位置穿過管道間的縫隙,需要做碰撞檢測,監(jiān)聽鍵盤事件,背景圖片的切換,障礙物管道產(chǎn)生時y軸上需要隨機位置。

主要設計

1.設計游戲界面,用swing實現(xiàn)

2.設計背景

3.設計移動墻

4.設計布谷鳥

5.設計障礙物

6.設計背景音樂和音效

7.新增用戶賬號注冊登錄功能

8.引用mysql數(shù)據(jù)庫,管理用戶賬號密碼和儲存排行榜等信息

  • 需要提前創(chuàng)建好數(shù)據(jù)庫"game",字符集選“utf8mb4”

  • 然后執(zhí)行mysql表結(jié)構(gòu)和初始化數(shù)據(jù)腳本

  • 修改代碼里的DBUtils的參數(shù)值

9.新增游戲商城模塊

10.新增排行榜模塊

功能截圖

用戶注冊:

Java怎么實現(xiàn)升級版布谷鳥闖關游戲

游戲歡迎界面:

Java怎么實現(xiàn)升級版布谷鳥闖關游戲

游戲開始界面:

Java怎么實現(xiàn)升級版布谷鳥闖關游戲

鼠標左鍵點擊控制鳥的位置穿過管道間的縫隙

Java怎么實現(xiàn)升級版布谷鳥闖關游戲

代碼實現(xiàn)

游戲啟動類

//開始界面
public class frame extends JFrame {
	private JPanel pane;
	public static frame frame;
	public frame(){
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(240,150);
		 ImageIcon backGround = new ImageIcon("images/frame.png");
	     JLabel bkgImage = new JLabel(backGround);
	     bkgImage.setSize(240,150);
	     bkgImage.setLocation(0,0);
	     JPanel bkgPanel = (JPanel) this.getContentPane();
	     bkgPanel.setOpaque(false);
	
	     //注冊按鈕
		JButton button_regist =new JButton("注冊");
		button_regist.setBounds(30,40, 60,30);
		bkgPanel.add(button_regist);
		
		button_regist.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				new frame_regist().setVisible(true);
			}
		});
		
		//登錄按鈕
		JButton button_log=new JButton("登錄");
		button_log.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				new frame_log(frame).setVisible(true);
			}
		});
		button_log.setBounds(130,40, 60, 30);
		bkgPanel.add(button_log);
		this.getContentPane().add(bkgImage);
		
	}
	
	//彈出顯示傳入String的提示框
	public static void frame_warning(String warning) {
		JFrame frame=new JFrame();
		JPanel pane=new JPanel();
		frame.setBounds(540, 360, 300, 150);
		frame.setContentPane(pane);
	    pane.setBorder(new EmptyBorder(5, 5, 5, 5));
		pane.setLayout(null);
		JLabel label_warning=new JLabel(warning);
		label_warning.setBounds(50,20,150,50);
		pane.add(label_warning);
		
		JButton button_yes = new JButton("確定");
		button_yes.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				frame.setVisible(false);
			}
		});
		button_yes.setBounds(80, 80, 93, 23);
		pane.add(button_yes);
		
		frame.setVisible(true);
	}


	public static void main(String[] args){
		
		frame =new frame();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
	/**
	 * 
	 */
}

核心類

import static java.lang.Thread.sleep;
 public class GameplayingFrame extends JFrame{

	private static final long serialVersionUID = 1L;
	user_inf user;
	MainFrame mainframe;
	List<rank_information> rfs;
	Graphics g=this.getGraphics();
	GameplayingFrame(user_inf user,List<rank_information> rfs,MainFrame mainframe)
	{
		this.mainframe=mainframe;
		this.rfs=rfs;
		this.user=user;
		this.setTitle("Fly Bird");
        this.setSize(Constant.Frame_Width,Constant.Frame_Height);
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
        Scene stage = new Scene(user);
        Graphics g = this.getGraphics(); 
        ImageIcon backGround = new ImageIcon("images/bg_day.png");
        JLabel bkgImage = new JLabel(backGround);
        bkgImage.setSize(288,512);
        bkgImage.setLocation(0,0);
        JPanel bkgPanel = (JPanel) this.getContentPane();
        bkgPanel.setOpaque(false);
        this.getContentPane().add(bkgImage);
        //為界面加入鼠標的響應事件
        this.addMouseListener(new MouseListener(){
			@Override
			public void mouseReleased(MouseEvent e) {}
			@Override
			public void mousePressed(MouseEvent e) {	
			}
			@Override
			public void mouseExited(MouseEvent e) {	
			}
			
			@Override
			public void mouseEntered(MouseEvent e) {	
			}
			@Override
			public void mouseClicked(MouseEvent e) {
			    stage.speed_y=-175;
			}
		});
        JLabel scoreText = new JLabel();
        Font font = new Font(Font.SERIF, Font.ITALIC, 30);
        scoreText.setFont(font);
        scoreText.setText(String.valueOf(0));
        this.setLayout(null);
        scoreText.setBounds(129,0,30,30);
        this.add(scoreText);
        //添加一個線程對象,用于重復繪圖,來節(jié)約主線程的資源,使游戲運行更加流暢
        new Thread(new playingThread(stage,g,this,user,rfs,mainframe)).start(); 
    }		

	}
	
 /*
  * 場景類,包含了游戲界面的物品以及游戲?qū)崿F(xiàn)的算法
  */
class  Scene{
    //后綴_x/_y表示橫/縱坐標,窗口左上角為原點
    public final int bird_x = 88;
    //重力加速度
    public final int G = 300;
    public double bird_y;
    public double birdRadius;
    //速度——正值為向下,負值為向上
    public int speed_x;
    public int speed_y;
    private  Ground land= new Ground(GameUtil.toBufferedImage(GameUtil.getImage("ioo/land.png")));
    BufferedImage back=  GameUtil.toBufferedImage(GameUtil.getImage("ioo/bg_day.png")) ;   
    Barrier barrier;
    Barrier barrier1;
    Ground ground;
    FlyingBird bird=null;
    Scene(user_inf user){
    	bird_y = 200;
        bird=new FlyingBird(bird_x,bird_y,user);
        birdRadius = 22;
        speed_x = 3;
        speed_y = 0;
        ground = new Ground(GameUtil.toBufferedImage(GameUtil.getImage("ioo/land.png")));
        barrier= new Barrier(GameUtil.toBufferedImage(GameUtil.getImage("ioo/pipe_down1.png")));
        barrier1= new Barrier(GameUtil.toBufferedImage(GameUtil.getImage("ioo/pipe_down.png")));      
    } 
    
    //返回true是游戲已經(jīng)結(jié)束,返回false表示游戲繼續(xù)進行
    	 boolean ifGameOver(){
    	        //碰到地面
    	        if(bird_y + birdRadius > 512 - ground.getHeight()){
    	            System.out.println("hit ground");
    	            return true;
    	        }
    	        //碰到頂
    	        if(bird_y - birdRadius < 0){
    	            System.out.println("hit sky");
    	            return true;
    	        }
    	        //未過左邊界時
    	        if(bird_x + birdRadius <= barrier.location_x){
    	            return false;
    	        }
    	        //接近左邊界時
    	        if(bird_x + birdRadius > barrier.location_x && bird_x < barrier.location_x){
    	            if(bird_y < barrier.topHeight || bird_y + birdRadius*0.7 > 512 - barrier.bottomHeight){
    	                System.out.println("hit left edge");
    	                return true;
    	            }
    	            return false;
    	        }
    	        //通過管道時
    	        if(bird_x >= barrier.location_x && bird_x < barrier.location_x + barrier.width){

    	            boolean y1 = bird_y + birdRadius > 512 - barrier.bottomHeight;
    	            boolean y2 = bird_y  <barrier.topHeight;
    	            if(y1 || y2){
    	                System.out.println("hit inside");
    	            }
    	            return y1 || y2;
    	        }
    	        //已通過管道
    	        if(bird_x >= barrier.location_x + barrier.width){
    	            return false;
    	        }
    	        return false;
    	    }
    //ifGameOver=false時才執(zhí)行
    boolean ifGetScore(){
        return bird_x + birdRadius > barrier.location_x;
    }
    //第二次之后的繪圖
    public void drawItems(Graphics g){
        //鳥 
        bird.draw(g);
    	//下障礙物
    	g.drawImage(barrier.img, barrier.location_x, 512 - barrier.bottomHeight,33,barrier.bottomHeight, null);
        //上障礙物
    	g.drawImage(barrier1.img,barrier.location_x, 0,33,barrier.topHeight, null);
    
        //地面
        g.drawImage(ground.getBufferedImage(),0,512-30, null);
        ground.checkGround();
        barrier.checkBarrier();
    }
    //更新各個物體的位置(每秒30次)
    public void itemMove() {
        //計算鳥的速度
        speed_y += G*0.033;

        //鳥最大的向下速度為220
        if(speed_y > 220){
            speed_y = 220;
        }

        //計算鳥的縱坐標
        bird_y += speed_y*0.033;
          bird.y=bird_y;
        //計算障礙物和地面的橫坐標
        barrier.location_x -= speed_x;
        ground.setX(ground.getX()-speed_x);
    }
    
  //變速方法,根據(jù)分數(shù)調(diào)整速度
    public void shift(int score){
        if(score < 1) {
            speed_x = 3;
        }
        else if (score < 100){
            speed_x = 4;
        }
        else if (score < 200){
            speed_x = 5;
        }
        else if (score < 300){
            speed_x = 6;
        }
        else if (score < 400){
            speed_x = 7;
        }
        else if (score < 500){
            speed_x = 8;
        }
        else speed_x = 9;
    }
    
    
    
}

線程類用于重復繪圖

public class playingThread implements Runnable {
	Scene stage;
	private Image iBuffer;
    private Graphics gBuffer;
    List<rank_information> rfs;
    user_inf user;
    MainFrame mainframe;
	Graphics g ;
	GameplayingFrame playingframe ;
	public static boolean flag = true;//控制計分板的變量
	public int score = 0;//分數(shù)
	playingThread(Scene stage,Graphics g,GameplayingFrame playingframe ,user_inf user,List<rank_information> rfs,MainFrame mainframe)
	{
		this.mainframe=mainframe;
		this.rfs=rfs;
		this.user=user;
		this.stage=stage;
		this.g=g;
		this.playingframe=playingframe;
		
	}
	@Override
	public void run() {
		 while (!stage.ifGameOver()){
	             stage.drawItems(g);//繪畫
	             stage.itemMove();//物體移動
	            //33ms刷新一次
	            try {
	                sleep(33);
	            } catch (InterruptedException e) {
	                e.printStackTrace();
	            }
	            if(stage.ifGetScore()){
	                    score++;
	            }
	            stage.shift(score);
	            //playingframe.update(g);
	            //清除上一次繪畫結(jié)果
	          //雙緩沖方法清除上一次繪畫結(jié)果
	            if (iBuffer == null){
	                iBuffer = playingframe.createImage(playingframe.getSize().width,playingframe.getSize().height);
	                gBuffer = iBuffer.getGraphics();
	            }
	            playingframe.paint(gBuffer);
	            g.drawImage(iBuffer,0,0,null);
	          //  stage.drawItems(g);//再繪畫
	        }
		     user.setCoin(user.getCoin()+score);
		     new user_dao().update(user);
		     playingframe.setVisible(false);
		     rank_information rf=new rank_information();
		     rf.setScore(score);
		     rf.setName(user.getUser_name());
		     rfs.add(rf);
		      new rank_dao().update_rank(rfs);
		      new  resultFrame(score,user,rfs,mainframe);
		      System.out.println("game over");
	  
	        
		
		
		
	}

}

到此,關于“Java怎么實現(xiàn)升級版布谷鳥闖關游戲”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI