一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Java圖形界面實(shí)戰(zhàn)案例——實(shí)現(xiàn)打字母游戲...

 為你放縱一生 2016-04-22
實(shí)現(xiàn)打字母的游戲 這次這個(gè)案例可以說(shuō)是頭幾次所講的內(nèi)容的一個(gè)技術(shù)匯總,主要是 運(yùn)用了幾大塊的知識(shí)。我們先來(lái)定義一下案例的背景:在一個(gè)300*400的窗體上,有10個(gè)隨機(jī)產(chǎn)生的字母下落,在鍵盤(pán)上敲擊字母,若是敲對(duì)了就消掉,初始化的成績(jī)?yōu)?000分,每次敲對(duì)一個(gè)字母就加上10分,如果在字母落到了屏幕的下方還沒(méi)有敲對(duì)的話則判定為失敗,就扣除100分。 我們還是老樣子,先來(lái)進(jìn)行步驟的劃分 1.做滿天星 2.把星星改成隨機(jī)的10個(gè)字母 3.讓字母落下,如果字母落出了屏幕就生成新的字母,并從屏幕的上方重新出現(xiàn) 4.接收鍵盤(pán)輸入并消除匹配的字母 5.實(shí)現(xiàn)積分程序 6.暫時(shí)先不說(shuō)吧,先把第六步完成了,自然而然就能看到這一步需要什么了 ## **1.做滿天星** ## 現(xiàn)在做的星星,有些條件有所改變,需要一個(gè)300*400的窗體,需要10顆星星,現(xiàn)在大家先自己寫(xiě)一遍代碼,隨后再看看我的代碼 import java.awt.*; publicclassMyChar {publicstaticvoid main(String args) { // TODO Auto-generated method stub Frame w = new Frame; w.setSize(300, 400); MyPanel mp = new MyPanel; w.add(mp); w.show; } } classMyPanelextendsPanel {publicvoid paint(Graphics g) { for(int i=0;i<10;i++) { g.drawString('*', (int)(Math.random*300), (int)(Math.random*300)); } } } 這里有幾個(gè)地方需要注意一下,窗體的背景不再是黑色的,那么字體的顏色也不用再設(shè)置成白色的了,黑色的部分可能是個(gè)意外,為什么在縱坐標(biāo)上我們不乘上400?這個(gè)問(wèn)題肯定很多人都會(huì)想到,這里我來(lái)告訴各位,你想想我們的最終目的是讓字母下落,等著用戶看到鍵盤(pán)上對(duì)應(yīng)的鍵,如果乘上400,就有可能有些字母一出來(lái)就在屏幕的最下方,這貌似并不符合我們?cè)O(shè)計(jì)的游戲的邏輯。事實(shí)上,我們前面的經(jīng)驗(yàn)表明,如果乘上400,有些字母一出現(xiàn)可能會(huì)因?yàn)閿?shù)值太大而看不見(jiàn)。 2.把星星改成隨機(jī)的10個(gè)字母第二步是生成10個(gè)隨機(jī)字母,我們索性將這些在這一步將坐標(biāo)放到數(shù)組變量里,以便準(zhǔn)備給下落動(dòng)作使用。 問(wèn)題是,隨機(jī)的字母如何產(chǎn)生?我們從未講過(guò)數(shù)據(jù)類型,我認(rèn)為一上來(lái)就介紹8中基本數(shù)據(jù)類型毫無(wú)意義,如果沒(méi)有用到就會(huì)很快的忘記,回顧一下我們已經(jīng)使用的數(shù)據(jù)類型都有什么。毫無(wú)疑問(wèn),第一個(gè)想到的就是int,整數(shù)類型(簡(jiǎn)稱整型),這是目前為止我們使用最多的數(shù)據(jù)類型,既然有整型那么就一定有小數(shù)型,在很多語(yǔ)言里都有兩張表達(dá)小護(hù)士的數(shù)據(jù)類型,一個(gè)float,另一個(gè)是double。看到單詞我們就能知道個(gè)大概,double是兩個(gè)的意思,這是由計(jì)算機(jī)的特點(diǎn)決定的,double用的兩倍的空間來(lái)存儲(chǔ)數(shù)據(jù),所以可以想象的到double可以表示更多的數(shù)字,具體到小數(shù)來(lái)看,結(jié)果就是更加的精確,但是也就更加的浪費(fèi)資源。事實(shí)上,整型也有short和long之分,這個(gè)也很好理解,從字面上去解釋,short就是短的意思,對(duì)應(yīng)的就是短整型,long是長(zhǎng)的意思,對(duì)應(yīng)的就是長(zhǎng)整型,兩者的區(qū)別就是表示的整型數(shù)據(jù)的長(zhǎng)度不同,short int所表示的數(shù)據(jù)范圍是 —32768to+32767。long int 表示的是-2,147,483,648 to 2,147,483,647 這樣一來(lái)就很直觀了嘛,long所表示的范圍比short大的多得多 言歸正傳,另外,我們還用到了boolean類型,你說(shuō)我沒(méi)講到boolean,其實(shí)我們?cè)趇f或者循環(huán)里用做條件的表達(dá)式結(jié)果,boolean簡(jiǎn)單,里面就兩個(gè)可能的值:true or false。 還有一個(gè)是byte類型,因?yàn)橛?jì)算機(jī)是用0和1最為基本的運(yùn)算單位的,但是表達(dá)的東西太少了,所以人們將0和1組成一個(gè)組來(lái)存放稍大一點(diǎn)的數(shù),8個(gè)二進(jìn)制數(shù)組合起來(lái)就是一個(gè)byte,這成為編程中最常用的基本數(shù)值單位。 介紹到我們關(guān)注的一個(gè)數(shù)據(jù)類型,即char。char是字符類型,就是放字符的,字符用單引號(hào)引起來(lái),比如'a',這個(gè)我們沒(méi)有用過(guò),之前用雙引號(hào)'*'不算,因?yàn)檫@是字符串String,這個(gè)String不放在數(shù)據(jù)類型里討論。String是對(duì)象不是基本數(shù)據(jù)類型,這句話意味著這里討論的數(shù)據(jù)類型不是對(duì)象,你可能覺(jué)得不是就不是唄,可是從學(xué)術(shù)的角度或者一直面向?qū)ο蟮某绦騿T看來(lái),就難以適應(yīng)了,有人抨擊Java不是純粹的面向?qū)ο笳Z(yǔ)言,指的就是8中基本數(shù)據(jù)類型不是對(duì)象,從程序員的角度來(lái)看,不是對(duì)象意味著點(diǎn)點(diǎn)不會(huì)出現(xiàn)方法。有的時(shí)候這是個(gè)問(wèn)題,為什么Java的設(shè)計(jì)者不能再純粹一點(diǎn)呢?這是有原因的,設(shè)計(jì)者們看的很深很遠(yuǎn),從效率的角度考慮,基本數(shù)據(jù)類型的操作比對(duì)象更有效率,不過(guò)為了照顧面向?qū)ο蟪绦騿T,Java提供了基本數(shù)據(jù)類型的封裝類,幫助我們?cè)谛枰臅r(shí)候?qū)⑦@個(gè)數(shù)變成對(duì)象。 為什么要搞這么多的數(shù)據(jù)類型呢?一是為了更好的使用內(nèi)存,聲明變量的時(shí)候如果指定了這個(gè)變量是boolean類型的,程序就不用為這個(gè)變量準(zhǔn)備int類型那么大的空間了;而是不同數(shù)據(jù)類型之間的運(yùn)算規(guī)則又是不同的,我們來(lái)看下面兩個(gè)程序的運(yùn)算結(jié)果。 publicclass MyTest { publicstaticvoidmain(Stringargs){ char a='1'; char b='2'; System.out.println(a+b); } }運(yùn)行一下你會(huì)發(fā)現(xiàn)得到了一個(gè)意想不到的數(shù)字99,再看看下面這段相似的代碼 publicclass MyTest { publicstaticvoidmain(Stringargs){ char a=1; char b=2; System.out.println(a+b); } }這段代碼我想就算不允許也可以猜出結(jié)果是3了,為什么會(huì)有這樣的差異,留給各位以后去探索吧 既然有不同的數(shù)據(jù)類型,就會(huì)遇到不同數(shù)據(jù)類型之間轉(zhuǎn)換的問(wèn)題,其實(shí)我們之前已經(jīng)使用過(guò)這樣的轉(zhuǎn)換。我們用(int)將隨機(jī)數(shù)產(chǎn)生的小數(shù)轉(zhuǎn)換成整數(shù),這叫做強(qiáng)制類型轉(zhuǎn)換。事實(shí)上也有隱含的轉(zhuǎn)換,比如我將小數(shù)硬放到一個(gè)整形變量里,自然放不了,系統(tǒng)會(huì)自動(dòng)幫我轉(zhuǎn)換成整型再放。我們就立即遇到一結(jié)果問(wèn)題,既然類型不同,轉(zhuǎn)換之后會(huì)成為什么呢?這里面一定會(huì)有比較合理的規(guī)則,比如,我們之前將小數(shù)轉(zhuǎn)換成證書(shū)會(huì)誰(shuí)去掉小數(shù)部分,我不需要告訴你所有的轉(zhuǎn)換規(guī)則,在知道了各種數(shù)據(jù)類型,以及如何轉(zhuǎn)換的情況下,你完全可以自己試一下,大多數(shù)情況下,一看結(jié)果就知道規(guī)則是什么了。 后續(xù)還會(huì)在需要的時(shí)候繼續(xù)討論數(shù)據(jù)類型這個(gè)話題,現(xiàn)在再多說(shuō)想必也是吸收不進(jìn)去了。 我們來(lái)嘗試一下char和int的相互轉(zhuǎn)換 publicclass MyTest { publicstaticvoidmain(Stringargs){ char a='a'; System.out.println((int)a); } } ``` 運(yùn)行結(jié)果是97,這是'a'這個(gè)字符在計(jì)算機(jī)里的編碼,為了統(tǒng)一,這樣的編碼已經(jīng)成了統(tǒng)一,后來(lái)成了國(guó)際標(biāo)準(zhǔn)也就是后來(lái)的ASCII編碼,那么再來(lái)一段代碼

public class MyTest {

public static void main(Stringargs){ char a=’a’; System.out.println((char)a); } }

結(jié)果很明顯吧,一看就能猜出來(lái)是a,結(jié)果也確實(shí)是a,還記得我們的任務(wù)是什么?這個(gè)階段的任務(wù)就是隨機(jī)生成字母,也就是說(shuō),生成從a到z的隨機(jī)字母,我們看到a對(duì)應(yīng)的ASCII碼是97,那么相應(yīng)的z就是97+26.,如果能夠生成9797+26的隨機(jī)數(shù)。我們能夠通過(guò)強(qiáng)制類型轉(zhuǎn)換獲得隨機(jī)字母,如何生成9797+26之間的隨機(jī)數(shù)呢?要知道Math.random產(chǎn)生的01之間的隨機(jī)數(shù),我們需要轉(zhuǎn)換,我想有人知道怎么做了——(char)(Math.random*26+97)。 事實(shí)上,這邊還有一個(gè)問(wèn)題待解決。g.drawString方法需要三個(gè)參數(shù),這是我們知道的,第一個(gè)參數(shù)是一個(gè)字符串(String),第二個(gè)和第三個(gè)分別是X和Y坐標(biāo),是整數(shù)(int),我們的問(wèn)題是,得到了隨機(jī)字符,可是那是字符不是字符串,字符沒(méi)法滿足這個(gè)方法的需求,我們需要將字符強(qiáng)行轉(zhuǎn)換為字符串。根據(jù)此前的經(jīng)驗(yàn),或許有人會(huì)用這種辦法啦轉(zhuǎn)換——(string)c,這里假設(shè)c是字符變量,這是不行的,這種做法只是適合基于數(shù)據(jù)類型的轉(zhuǎn)換,還有一種情況也是用這種轉(zhuǎn)換方式,不過(guò)現(xiàn)在不講,后續(xù)會(huì)說(shuō)明,我這兒有一個(gè)省事的方法,在需要轉(zhuǎn)換的地方寫(xiě)' '+c,因?yàn)?span>' '是一個(gè)完全空的字符串,要知道在大多數(shù)的情況下,一個(gè)變量加到字符串上,都會(huì)被自動(dòng)轉(zhuǎn)換成字符串,無(wú)論是基本數(shù)據(jù)類型還是對(duì)象,唯一的問(wèn)題就是這樣做的辦法好像效率太低了,計(jì)算機(jī)需要更加長(zhǎng)的時(shí)間去執(zhí)行這個(gè)操作,字符串想叫的做法無(wú)疑會(huì)讓這個(gè)程序的運(yùn)行效率變得很低,所以如果是正式的編程,不建議這樣做類型轉(zhuǎn)換。正確的做法是把c變成對(duì)象——new Character(c),所有的對(duì)象都有to String方法,我們用這個(gè)方法來(lái)轉(zhuǎn)換得到字符串。這樣就遺留了一個(gè)問(wèn)題,為什么所有的對(duì)象都要有to String方法呢?不急,后面我會(huì)說(shuō)道的。 充分理解上面的討論之后,你可以嘗試一下完成這一步的代碼,讓300*400的窗體上有10個(gè)隨機(jī)的字母。

import java.awt.*;

public class MyChar {

public static void main(String args) { // TODO Auto-generated method stub Frame w = new Frame; w.setSize(300, 400); MyPanel mp = new MyPanel; w.add(mp); w.show; }

}

class MyPanel extends Panel { int x=new int[10]; int y=new int[10]; char c = new char[10]; MyPanel { for(int i=0;i<10;i++) { x[i]=(int)(Math.random*300); y[i]=(int)(Math.random*300); c[i]=(char)(Math.random*26+97) } } public void paint(Graphics g) {{ g.drawString(new Character(c[i]).toString,x[i],y[i]); } } }

## 3.讓字母落下,如果字母落出了屏幕就生成新的字母,并從屏幕的上方重新出現(xiàn) ## 如果這一步?jīng)]有問(wèn)題了,我們來(lái)完成第三步,及時(shí)讓字母落下。如果字母落出屏幕就生成新的字母,并從屏幕的上方重新的出現(xiàn)。 落下的代碼不難,幾乎和下雪的代碼一樣,不同的是,下雪的代碼在超出屏幕的處理上是讓Y值回到0。為了有更好的效果,在這個(gè)案例上,我們還要讓X獲得一個(gè)新的隨機(jī)數(shù),另外這個(gè)字符也要產(chǎn)生一個(gè)字符。 同樣建議你先自己試著完成任務(wù),然后再看代碼,如果沒(méi)有思路,還是回頭看看前面,看看還有哪里沒(méi)有徹底的掌握。public static void main(String args) { // TODO Auto-generated method stub Frame w = new Frame; w.setSize(300, 400); MyPanel mp = new MyPanel; w.add(mp); Thread t = new Thread(mp); t.start; w.show; }

}

class MyPanel extends Panel implements Runnable { int x=new int[10]; int y=new int[10]; char c = new char[10]; MyPanel { for(int i=0;i<10;i++) { x[i]=(int)(Math.random*300); y[i]=(int)(Math.random*300); c[i]=(char)(Math.random*26+97); } } public void paint(Graphics g) {{ g.drawString(new Character(c[i]).toString,x[i],y[i]); } } @Override public void run { // TODO Auto-generated method stub while(true) {{ y[i]++; if(y[i]>400) { y[i]=0;y[i]=(int)(Math.random*26+97); } } try { Thread.sleep(30); }catch(Exception e){ } repaint; } } }

## 4.接收鍵盤(pán)輸入并消除匹配的字母 ## 前三部基本都已經(jīng)完成,現(xiàn)在做的是第4步,接收用戶鍵盤(pán)的輸入,如果匹配上就消除這個(gè)字符。事實(shí)上,我們并不真正的去消除字符,而是讓這個(gè)字符重新從屏幕的上面再出來(lái),這將是個(gè)新生成的字符。接收用戶輸入我想不是問(wèn)題了,那么拿到用戶的輸入以后怎么知道屏幕上有沒(méi)有的這個(gè)字符呢?字符都存在在那個(gè)數(shù)組里,看來(lái)我們得到數(shù)組里去找有沒(méi)有,如果有就處理。 還是自己先去嘗試一下再看一下代碼,不過(guò)這一步我不在提供所有的代碼,只是部分,我只是覺(jué)得大家已經(jīng)有能力看得懂了,所以不再和之前一樣提供所有的代碼了,下面只是列出了事件處理的程序

public void keyPressed(KeyEvent arg0)

{ //將用戶輸入的字符存入KeyC中 char keyC=arg0.getKeyChar; //掃描整個(gè)數(shù)組,看看有沒(méi)有匹配的字符 for(int i=0;i<10;i++) { if(keyC==c[i]) { //找到了 y[i]=0; x[i]=(int)(Math.random*300); c[i]=(char)(Math.random*26+97); break; //防止上同時(shí)有多個(gè)相同的字符被一次性的消除掉 } } }

break這里做一個(gè)說(shuō)明,break的作用是跳出這個(gè)循環(huán),在這里加上break的目的是如果找到了那么這次就不找了。 加入了上述的代碼,別忘了要實(shí)現(xiàn)接口和注冊(cè)事件。如果成功了,那么恭喜你,打字母的游戲已經(jīng)出來(lái)了。不過(guò)你在調(diào)試的過(guò)程中也已經(jīng)意識(shí)到了這個(gè)問(wèn)題,就是如果有多個(gè)相同的字母同時(shí)出現(xiàn),那么被消除掉的那個(gè)字母就不一定是最先面的那一個(gè)了,這貌似也是不符合這個(gè)游戲的邏輯,因?yàn)橄舻捻樞蚴窃跀?shù)組里。字母在數(shù)組里是按照什么樣的順序排列的,那么消除就是按照這樣的順序去消除,這就和y坐標(biāo)沒(méi)有關(guān)系了,大家也應(yīng)該反應(yīng)過(guò)來(lái)了這也就是我在前面留下的第六個(gè)問(wèn)題,就是消除掉最下面的字母 ## 5.實(shí)現(xiàn)積分程序 ## 現(xiàn)在還是先來(lái)看第五步,計(jì)入積分。我們似乎需要一個(gè)變量來(lái)記錄得分,那么就根據(jù)案例的要求,就假設(shè)初始值就是1000,如果字母在落到最下面的時(shí)候還沒(méi)有被消除掉那么就要扣除10分,如果用戶輸入的字符屏幕上沒(méi)有那就扣除100分。自己想想寫(xiě)寫(xiě)看該怎么去完成

class MyPanel extends Panel implements Runnable

{ int x=new int[10]; int y=new int[10]; char c = new char[10]; int sorce=1000; public void paint(Graphics g) { for(int i=0;i<10;i++) { g.drawString(new Character(c[i]).toString,x[i],y[i]); } //顯示成績(jī) g.setColor(Color.RED); g.drawString(“你的成績(jī)是:”+sorce, 5, 10); } }

下面的代碼是實(shí)現(xiàn)扣分功能的代碼,你看到'-='運(yùn)算符了吧,相似的還有'+= *= /+'之類的,這里是score = score-1000的簡(jiǎn)單寫(xiě)法 public void run { // TODO Auto-generated method stub while(true) { for(int i=0;i<10;i++) { y[i]++; if(y[i]>400) { y[i]=0; x[i]=(int)(Math.random*300); y[i]=(int)(Math.random*26+97); sorce-=100; } } } } 最后我們來(lái)看看如何實(shí)現(xiàn)敲對(duì)了加分的功能,敲錯(cuò)了減分的功能

public void keyPressed(KeyEvent arg0)

{ //將用戶輸入的字符存入KeyC中 char keyC=arg0.getKeyChar; //掃描整個(gè)數(shù)組,看看有沒(méi)有匹配的字符 for(int i=0;i<10;i++) { if(keyC==c[i]) { //找到了 y[i]=0; x[i]=(int)(Math.random*300); c[i]=(char)(Math.random*26+97); break; //防止上同時(shí)有多個(gè)相同的字符被一次性的消除掉 } else { score-=100; } } }

你覺(jué)得這樣的代碼可以嗎?肯定不可以啊。在我們看來(lái),假設(shè)數(shù)組里的10個(gè)字符中有一個(gè)'a',你卻敲'a'這個(gè)字符,你希望的道德結(jié)果是加10分,但是最壞的結(jié)果是循環(huán)了10次,最后一個(gè)匹配上了。匹配上了這次雖然說(shuō)是加了10分,但是前面沒(méi)有匹配上的9次怎么辦?扣900分嗎?這樣不符合邏輯啊,這是一個(gè)很經(jīng)典的問(wèn)題,語(yǔ)法上沒(méi)有錯(cuò)誤但是邏輯上存在問(wèn)題,因此我們就需要一個(gè)標(biāo)識(shí),如果沒(méi)有匹配上,標(biāo)識(shí)的值不變,一旦匹配上了,標(biāo)識(shí)改變。等到循環(huán)完了,看一下標(biāo)識(shí),有很多情況下我們都會(huì)用到這個(gè)小算法 具體的實(shí)現(xiàn)來(lái)看,boolean變量貌似是最適合的,因?yàn)?span>boolean變量只有兩種狀態(tài),我們先設(shè)定boolean變量的初值是false(假的),如果if匹配上課了,就把他變成true。

boolean mark =false;

for(int i=0;i<10;i++) { if(keyC==c[i]) { mark=true; break; } }

我們來(lái)分析一下上面的代碼,開(kāi)始mark的值是false,然后循環(huán),如果這10次循環(huán)都沒(méi)有if成功,那么mark的值就會(huì)一直不改變,還是false,一旦if匹配成功,mark的值就變成了true,我們可以在循環(huán)結(jié)束后,更具mark的值來(lái)判斷有沒(méi)有匹配上的內(nèi)容。 具體到了案例的實(shí)現(xiàn)代碼

public void keyPressed(KeyEvent arg0)

{ //將用戶輸入的字符存入KeyC中 char keyC=arg0.getKeyChar; //掃描整個(gè)數(shù)組,看看有沒(méi)有匹配的字符 boolean mark =false; for(int i=0;i<10;i++) { if(keyC==c[i]) { //找到了 y[i]=0; x[i]=(int)(Math.random*300); c[i]=(char)(Math.random*26+97); mark=true; break; //防止上同時(shí)有多個(gè)相同的字符被一次性的消除掉 } } if(mark) { score+=100; } else { score+=10; } }

這次將的東西我也承認(rèn)確實(shí)是有那么一點(diǎn)點(diǎn)的多,我建議大家還是先停一下,把前面的代碼再自己多寫(xiě)寫(xiě),多多理解理解再繼續(xù)下去,因?yàn)樽詈笠徊降倪壿嬘悬c(diǎn)棘手,不是很好理解 ## 6.如何消除最下面的字符 ## 現(xiàn)在開(kāi)始完成第6步,我們的目的是找到多個(gè)匹配成功的字符的最下面一個(gè),并且清除掉,其中清除不難,找到匹配的字符也不難,焦點(diǎn)在最下面一個(gè)字符上,如何判斷這是最先面的自字符?這很簡(jiǎn)單,就是Y坐標(biāo)最大的。如果不是計(jì)算機(jī)來(lái)完成這件事情,讓人來(lái)做,那就是找到所以的匹配字符,擺在那里,看看誰(shuí)的Y最大,計(jì)算機(jī)沒(méi)有一次性比較多個(gè)值的能力,每次只能比較出一個(gè)值,我們的思路是,先找到一個(gè)以后,然后把Y值記錄下來(lái),再找到一個(gè),再判斷,如果新的Y值大于原來(lái)的,那么就用這個(gè)Y值替換掉原來(lái)的Y值,否則什么都不做,老的字符在下面,找一圈以后,記錄下的Y值是最大的了。我們可以理解這個(gè)邏輯,我拿到了一個(gè)字符,記住了它的Y坐標(biāo),在拿到一個(gè)看看是不是大于剛才那個(gè),如果是就將舊的Y給丟了,如果不是就把現(xiàn)在這個(gè)新的Y個(gè)妞丟了,最后我手里就一個(gè)字符,這個(gè)字符就在最下面,它對(duì)應(yīng)的數(shù)據(jù)位置就是我們要清除的字符標(biāo)號(hào),我們將數(shù)組位置叫做數(shù)組下標(biāo),也就是說(shuō)每次我們還得記錄保留下來(lái)的數(shù)組下標(biāo)。 還有一個(gè)小問(wèn)題,即便有很多匹配的字符,判斷的邏輯是相同的,我們完全可以將這個(gè)判斷放在循環(huán)里,讓這個(gè)邏輯周而復(fù)始的去做,可是第一個(gè)字符的匹配邏輯不同,它不需要判斷,見(jiàn)到存下來(lái)就好,能不能將第一個(gè)字符的邏輯和其他邏輯統(tǒng)一呢?如果能的話,我們就可以節(jié)省下一段代碼了,我想到了一個(gè)辦法,就存放在最下面Y坐標(biāo)的變量初始值設(shè)置成絕對(duì)不可能小的數(shù),這樣第一個(gè)字符就去判斷,當(dāng)然,由于老的值一定小,所以第一個(gè)字符的值也會(huì)被存下來(lái)。

public void keyPressed(KeyEvent arg0)

{ //將用戶輸入的字符存入KeyC中 char keyC=arg0.getKeyChar; //掃描整個(gè)數(shù)組,看看有沒(méi)有匹配的字符 int nowY=-1; int nowIndex=-1; for(int i=0;i<10;i++) { if(keyC==c[i]) { if(y[i]>nowY) { nowY=y[i]; nowIndex=i; } } } if(nowIndex!=-1) { y[nowIndex]=0; x[nowIndex]=(int)(Math,random*300); c[nowIndex]=(char)(Math.random*26+97); score+=10; } else { score-=10; } }

我們來(lái)看看上面這段代碼,nowY存放著最下面符合條件的Y坐標(biāo),nowIndex存放著最下面符合條件的數(shù)組的下標(biāo),boolean變量似乎也不需要了,因?yàn)橥耆梢愿鶕?jù)nowIndex來(lái)判斷有沒(méi)有找到,break也不需要了,因?yàn)槲覀冋业揭粋€(gè)匹配的字符不算完,還要繼續(xù)尋找,最后我放上所有的代碼

import java.awt.*;

import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class MyChar {

public static void main(String args) { // TODO Auto-generated method stub Frame w = new Frame; w.setSize(300, 400); MyPanel mp = new MyPanel; w.add(mp); Thread t = new Thread(mp); t.start; w.addKeyListener(mp); mp.addKeyListener(mp); w.show; }

}

class MyPanel extends Panel implements Runnable,KeyListener { int x=new int[10]; int y=new int[10]; char c = new char[10]; int score=1000; MyPanel { for(int i=0;i<10;i++) { x[i]=(int)(Math.random*300); y[i]=(int)(Math.random*300); c[i]=(char)(Math.random*26+97); } } public void paint(Graphics g) {{ g.drawString(new Character(c[i]).toString,x[i],y[i]); } //顯示成績(jī) g.setColor(Color.RED); g.drawString(“你的成績(jī)是:”+score, 5, 10); } @Override public void run { // TODO Auto-generated method stub while(true) {{ y[i]++; if(y[i]>400) { y[i]=0;y[i]=(int)(Math.random*26+97); score-=100; } } try { Thread.sleep(30); }catch(Exception e){ } repaint; } } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub

} @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub //將用戶輸入的字符存入KeyC中 char keyC=e.getKeyChar; //掃描整個(gè)數(shù)組,看看有沒(méi)有匹配的字符 int nowY=-1; int nowIndex=-1; for(int i=0;i<10;i++) { if(keyC==c[i]) { if(y[i]>nowY) { nowY=y[i]; nowIndex=i; } } } if(nowIndex!=-1) { y[nowIndex]=0; x[nowIndex]=(int)(Math.random*300); c[nowIndex]=(char)(Math.random*26+97); score+=10; } else { score-=10; } } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub }

}

“`

這應(yīng)該是目前博主寫(xiě)博客以來(lái)寫(xiě)的最多的一次,當(dāng)然你們看的學(xué)的覺(jué)得很辛苦,博主自己寫(xiě)的也很辛苦,好好的而消化,多練幾遍,要輕松的理解這些東西并非易事,良好的邏輯能力需要培養(yǎng),親自寫(xiě)代碼,自己改錯(cuò),非常鍛煉編程能力,堅(jiān)持不懈的努力,終究會(huì)成功,這次就到這里了,下期再見(jiàn)了,下期更完圖形界面應(yīng)該是告一段落了,要真的開(kāi)始寫(xiě)項(xiàng)目了。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    黑丝国产精品一区二区| 欧美国产日韩在线综合| 国产亚洲欧美另类久久久| 国产精品国产亚洲区久久| 一本色道久久综合狠狠躁| 精品人妻一区二区三区免费看| 国产又大又猛又粗又长又爽| 不卡一区二区在线视频| 中国黄色色片色哟哟哟哟哟哟| 久久精品欧美一区二区三不卡| 亚洲中文字幕熟女丝袜久久| 又色又爽又无遮挡的视频| 欧美日韩在线第一页日韩| 亚洲最新中文字幕一区| 91欧美亚洲精品在线观看| 欧美区一区二在线播放| 在线一区二区免费的视频| 日韩成人午夜福利免费视频| 久久91精品国产亚洲| 手机在线观看亚洲中文字幕| 欧美亚洲美女资源国产| 黄片在线免费观看全集| 欧美综合色婷婷欧美激情| 久久青青草原中文字幕| 中日韩美女黄色一级片| 欧美做爰猛烈叫床大尺度| 日本午夜免费啪视频在线| 亚洲欧美日本国产有色| 中文字幕五月婷婷免费| 亚洲欧美日产综合在线网| 日韩精品一区二区一牛| 久久免费精品拍拍一区二区| 国产男女激情在线视频| 国产91麻豆精品成人区| 不卡视频在线一区二区三区| 欧美日本亚欧在线观看| 欧美日韩精品视频在线| 91日韩欧美中文字幕| 亚洲中文字幕剧情在线播放| 人妻精品一区二区三区视频免精| 亚洲最新中文字幕在线视频|