標籤: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端打字遊戲——遊戲進行