windows端打字遊戲——遊戲進行

來源:互聯網
上載者:User

標籤:add   span   frame   匿名   時間   資料   分時   dial   panel   

GameFace類主要實現主遊戲介面。

import java.awt.*;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.util.Timer;

import java.util.TimerTask;

import javax.swing.*;

 

public class GameFace {

  public static Dimension getSize(){ //設定所需表單大小

    return new Dimension(1024,590);

  }

  public static Point getLocation(){ //計算居表單左上方座標

Toolkit toolKit=Toolkit.getDefaultToolkit(); //獲得Toolkit執行個體

Dimension screenSize=toolKit.getScreenSize(); //獲得顯示器大小

//當顯示器小於表單時報錯並結束程式

if((screenSize.width<getSize().width)||(screenSize.height<getSize().height)){

JOptionPane.showMessageDialog(null,"顯示器解析度至少為"+getSize().width+"*"+getSize().height,"",JOptionPane.WARNING_MESSAGE);

System.exit(0); //終止程式

}

int x=(screenSize.width-getSize().width)/2; //計算左上方座標

int y=(screenSize.height-getSize().height)/2;

return new Point(x,y); //返回計算好的座標

}

 

public static void run() {

JFrame frame=new JFrame("狙擊坦克(不區分大小寫版)");    //遊戲表單

frame.setLocation(getLocation()); //設定表單位置置中

frame.setSize(1024,590); //設定表單大小

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //設定關閉表單為銷毀表單

frame.setResizable(false); //設定表單大小不可變

//設定表單表徵圖

frame.setIconImage(Toolkit.getDefaultToolkit().getImage(GameFace.class.getResource("char_bg.png")));

GameJPanel pan=new GameJPanel(); //繪畫面板(自訂畫布)

pan.go(); //開始遊戲,啟動定時任務

frame.addKeyListener(pan); //綁定鍵盤事件

frame.add(pan); //向表單添加面板

frame.setVisible(true); //顯示表單

}

}

 

class GameJPanel extends JPanel implements KeyListener{

private static final long serialVersionUID = 1L;

private Image background=Toolkit.getDefaultToolkit().getImage(GameJPanel.class.getResource("background.jpg")); //背景圖片

private Image bong0=Toolkit.getDefaultToolkit().getImage(GameJPanel.class.getResource("bong0.png")); //爆炸圖片

private Image bong1=Toolkit.getDefaultToolkit().getImage(GameJPanel.class.getResource("bong1.png"));

private Image bong2=Toolkit.getDefaultToolkit().getImage(GameJPanel.class.getResource("bong2.png"));

private Image bong3=Toolkit.getDefaultToolkit().getImage(GameJPanel.class.getResource("bong3.png"));

private Image bong4=Toolkit.getDefaultToolkit().getImage(GameJPanel.class.getResource("bong4.png"));

private Image bong5=Toolkit.getDefaultToolkit().getImage(GameJPanel.class.getResource("bong5.png"));

private Image bong6=Toolkit.getDefaultToolkit().getImage(GameJPanel.class.getResource("bong6.png"));

private Image char_bg=Toolkit.getDefaultToolkit().getImage(GameJPanel.class.getResource("char_bg.png")); //字母背景圖片

SqlLink sql=new SqlLink(); //連結資料庫

boolean  firstStart =true; //遊戲啟動標記

int num=4; //遊戲啟動倒計時

private static long start=0; //用於存放遊戲開始時間

private static long end =0; //用於存放遊戲結束時間

private static int score=1000; //初始分數1000分

private static int highscore=1000; //用於存放本局最高分數

private static int level=1; //用於存放等級

private static int number=1; //用於存放螢幕出現字數

private static int count=0; //用於存放打對字數

private static int upcount=5; //用於存放升級所需打字數

private static int speed=100; //用於存放遊戲速度

private static int bonus=10; //用於存放加分

private static int minus=120; //用於存放扣分

private static int[] changeLevel=new int[2];

private static int[] changeGame=new int[4];

private static char[] c=new char[106]; //用於存放螢幕中字母以及所對應的座標

private static int[] x=new int [106];

private static int[] y=new int[106];

private static Timer timer=null; //定義定時任務對象

private static int xx=0; //被打掉字母座標,被打掉標記

private static int yy=0;

boolean playflag=true;

public GameJPanel(){ //構造時初始化

firstStart=true; //畫板執行個體時,將第一次啟動標誌改變

for(int i=0;i<c.length;i++){ //初始化字元數組

c[i]=‘0‘;

}

}

public void init(){ //產生一組隨機字母

for(int i=0;i<number;i++){

setChar(i);

}

}

public void setChar(int i){ //獲得隨機26個字母之一及其位置

c[i]=(char)(Math.random()*26+65);

x[i]=(int)(Math.random()*600+200);

y[i]=-20;

}

public void paint(Graphics g){ //繪圖

super.paint(g);   //獲得父類的繪圖功能

g.drawImage(background,0, 0, this); //繪製背景圖片

if(firstStart){ //啟動遊戲時,倒計時3秒

g.setColor(Color.red);

g.setFont(new Font("方正舒體",Font.BOLD,50));

switch(num){

case 3:

g.drawString("坦克來襲!", 390, 275);

break;

case 2:

g.drawString("請做好準備!", 365, 275);

break;

case 1:

g.drawString("迎戰!", 440, 275);

break;

default:

break;

}

num--;

try {

Thread.sleep(1000); //畫1次休息1秒

} catch (InterruptedException e) {

e.printStackTrace();

}

if(num<0){ //倒計時結束,初始化,獲得遊戲開始時間

firstStart=false;

init();

start=System.currentTimeMillis();

}

}

if(playflag){   //如果有打掉字母,則顯示爆炸效果

g.drawImage(bong0,xx-33, yy-60, this);

g.drawImage(bong1,xx-33, yy-60, this);

g.drawImage(bong2,xx-33, yy-60, this);

g.drawImage(bong3,xx-33, yy-60, this);

g.drawImage(bong4,xx-33, yy-60, this);

g.drawImage(bong5,xx-33, yy-60, this);

g.drawImage(bong6,xx-33, yy-60, this);

playflag=false;

}

if(score<0){ //分數已負,遊戲結束

end=System.currentTimeMillis(); //獲得結束時間

//遊戲結束時,列印本局最高分,列印累計打字數,列印等級,列印存活時間

Image list_bg=Toolkit.getDefaultToolkit().getImage(GameJPanel.class.getResource("list_bg.jpg")); //背景圖片

g.drawImage(list_bg,310,0,this);

g.setColor(Color.black);

g.setFont(new Font("Beurk",Font.BOLD,60));

g.drawString("Game Over",344,152);

g.setFont(new Font("華文行楷",Font.PLAIN,30));

g.drawString("您共存活了:"+(end-start)/1000+"秒", 330, 280);

g.drawString("您的最高分為:"+highscore+"分", 330, 330);

g.drawString("您共打對了"+count+"個字母", 330, 380);

g.drawString("您的等級為:"+level, 330, 430);

g.setColor(Color.red);

g.setFont(new Font("Beurk",Font.BOLD,60));

g.drawString("Game Over",340,150);

sql.setHistory(LoginFace.username, highscore, count, (end-start)/1000);

timer.cancel(); //關閉定時任務

return ; //停止此次繪圖

}

//設定螢幕字母基本屬性

g.setFont(new Font("Vivian",Font.BOLD,22));

for(int i=0;i<c.length;i++){ //繪製字母及其背景圖片

if(c[i]!=‘0‘){

g.drawImage(char_bg,x[i]-31, y[i]-21, this);

g.setColor(new Color(255,255,255,80));

g.fillOval(x[i]-14, y[i]-22, 45, 30);

g.setColor(Color.yellow);

g.drawString(c[i]+"",x[i]+2,y[i]+1);

g.setColor(Color.red);

g.drawString(c[i]+"",x[i],y[i]);

}

}

//繪製遊戲資料(等級、分數、打對字母數、升級條件)

g.setColor(Color.black);

g.setFont(new Font("楷體",Font.BOLD,25));

g.drawString("等級:"+level,22,32);

g.drawString("分數:"+score,22,67);

g.setFont(new Font("楷體",Font.BOLD,35));

g.drawString("戰",937,347);

g.drawString("績",922,382);

g.setFont(new Font("楷體",Font.BOLD,20));

g.drawString("已經消滅坦克"+count+"輛",822,422);

g.drawString("升級還需消滅",854,452);

g.drawString(upcount+"輛坦克",907,482);

g.setColor(Color.green);

g.setFont(new Font("楷體",Font.BOLD,25));

g.drawString("等級:"+level,20,30);

g.drawString("分數:"+score,20,65);

g.setFont(new Font("楷體",Font.BOLD,35));

g.drawString("戰",935,345);

g.drawString("績",920,380);

g.setFont(new Font("楷體",Font.BOLD,20));

g.drawString("已經消滅坦克"+count+"輛",820,420);

g.drawString("升級還需消滅",852,450);

g.drawString(upcount+"輛坦克",905,480);

}

 

public void go(){ //定義一個方法,啟動遊戲

timer=new Timer(); //制定定時任務

timer.schedule(new TimerTask(){

//new TimerTask(){}匿名內部類,重寫run方法

public void run() {

try{

Thread.sleep(speed); //每執行一次休息speed毫秒

}catch(Exception ex){

ex.printStackTrace();

}

for(int i=0;i<c.length;i++){ //字母下落

y[i]++;

if(y[i]>590&&c[i]!=‘0‘){ //如果已經掉落到底邊界,則扣分,並重建字母

score-=minus;

setChar(i);

}

}

repaint(); //重畫

}

},0,5) ; //現在就啟動,以後每5毫秒執行一次上述代碼

 

}

//鍵盤監聽

public void keyPressed(KeyEvent key) { //按下鍵盤某個鍵時,監聽鍵盤輸入的字元

 

char ckey=key.getKeyChar(); //獲得鍵盤錄入字母

if(ckey!=65535){

if (97<=ckey&&ckey<123){ //將小寫字母轉換成大寫字母

ckey=Character.toUpperCase(ckey);

}

int index=-1;

for(int i=0;i<c.length;i++){ //遍曆螢幕字母,是否有相同的

if(ckey==c[i]&&y[i]>10&&ckey!=‘0‘){

index=i;

break;

}

}

if(index!=-1){ //如果有相同的,則加分,並消除掉此字母,產生一個新的字母

score+=bonus;

xx=x[index]; //儲存被打掉的字母座標,並將playflag 置 true

yy=y[index];

playflag=true;

count++; //打字數加一,升級條件減一

upcount--;

setChar(index);

if(upcount==0){ //升級,並重新計算下次升級需要的打字數

changeLevel=sql.getLevel(count);

level=changeLevel[0];

upcount=changeLevel[1];

changeGame=sql.getGame(level);

number=changeGame[0];

speed=changeGame[1];

bonus=changeGame[2];

minus=changeGame[3];

setChar(level-1); //升級時,字母多產生一個

}

if(score>highscore){ //噹噹前分數大於本局最高分時,重新整理最高分

highscore=score;

}

}else{

score-=minus; //否則錄入的字母並不存在,扣分

}

}

}

//以下兩個監聽事件,並未用到,置空

public void keyReleased(KeyEvent arg0) {}

public void keyTyped(KeyEvent arg0) {}

}

 

windows端打字遊戲——遊戲進行

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.