久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

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

 為你放縱一生 2016-04-22
實(shí)現(xiàn)打字母的游戲 這次這個(gè)案例可以說是頭幾次所講的內(nèi)容的一個(gè)技術(shù)匯總,主要是 運(yùn)用了幾大塊的知識(shí),。我們先來定義一下案例的背景:在一個(gè)300*400的窗體上,,有10個(gè)隨機(jī)產(chǎn)生的字母下落,在鍵盤上敲擊字母,,若是敲對(duì)了就消掉,,初始化的成績?yōu)?000分,每次敲對(duì)一個(gè)字母就加上10分,,如果在字母落到了屏幕的下方還沒有敲對(duì)的話則判定為失敗,,就扣除100分。 我們還是老樣子,,先來進(jìn)行步驟的劃分 1.做滿天星 2.把星星改成隨機(jī)的10個(gè)字母 3.讓字母落下,,如果字母落出了屏幕就生成新的字母,并從屏幕的上方重新出現(xiàn) 4.接收鍵盤輸入并消除匹配的字母 5.實(shí)現(xiàn)積分程序 6.暫時(shí)先不說吧,,先把第六步完成了,,自然而然就能看到這一步需要什么了 ## **1.做滿天星** ## 現(xiàn)在做的星星,有些條件有所改變,,需要一個(gè)300*400的窗體,,需要10顆星星,現(xiàn)在大家先自己寫一遍代碼,,隨后再看看我的代碼 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è)問題肯定很多人都會(huì)想到,,這里我來告訴各位,,你想想我們的最終目的是讓字母下落,等著用戶看到鍵盤上對(duì)應(yīng)的鍵,,如果乘上400,,就有可能有些字母一出來就在屏幕的最下方,這貌似并不符合我們?cè)O(shè)計(jì)的游戲的邏輯。事實(shí)上,,我們前面的經(jīng)驗(yàn)表明,如果乘上400,,有些字母一出現(xiàn)可能會(huì)因?yàn)閿?shù)值太大而看不見,。 2.把星星改成隨機(jī)的10個(gè)字母第二步是生成10個(gè)隨機(jī)字母,我們索性將這些在這一步將坐標(biāo)放到數(shù)組變量里,,以便準(zhǔn)備給下落動(dòng)作使用,。 問題是,隨機(jī)的字母如何產(chǎn)生,?我們從未講過數(shù)據(jù)類型,,我認(rèn)為一上來就介紹8中基本數(shù)據(jù)類型毫無意義,如果沒有用到就會(huì)很快的忘記,,回顧一下我們已經(jīng)使用的數(shù)據(jù)類型都有什么,。毫無疑問,第一個(gè)想到的就是int,,整數(shù)類型(簡(jiǎn)稱整型),這是目前為止我們使用最多的數(shù)據(jù)類型,,既然有整型那么就一定有小數(shù)型,在很多語言里都有兩張表達(dá)小護(hù)士的數(shù)據(jù)類型,,一個(gè)float,,另一個(gè)是double??吹絾卧~我們就能知道個(gè)大概,,double是兩個(gè)的意思,這是由計(jì)算機(jī)的特點(diǎn)決定的,,double用的兩倍的空間來存儲(chǔ)數(shù)據(jù),,所以可以想象的到double可以表示更多的數(shù)字,具體到小數(shù)來看,,結(jié)果就是更加的精確,,但是也就更加的浪費(fèi)資源。事實(shí)上,,整型也有short和long之分,這個(gè)也很好理解,,從字面上去解釋,short就是短的意思,,對(duì)應(yīng)的就是短整型,,long是長的意思,對(duì)應(yīng)的就是長整型,,兩者的區(qū)別就是表示的整型數(shù)據(jù)的長度不同,short int所表示的數(shù)據(jù)范圍是 —32768to+32767,。long int 表示的是-2,147,483,648 to 2,147,483,647 這樣一來就很直觀了嘛,long所表示的范圍比short大的多得多 言歸正傳,另外,,我們還用到了boolean類型,,你說我沒講到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è)組來存放稍大一點(diǎn)的數(shù),,8個(gè)二進(jìn)制數(shù)組合起來就是一個(gè)byte,這成為編程中最常用的基本數(shù)值單位,。 介紹到我們關(guān)注的一個(gè)數(shù)據(jù)類型,即char,。char是字符類型,,就是放字符的,字符用單引號(hào)引起來,,比如'a',,這個(gè)我們沒有用過,之前用雙引號(hào)'*'不算,,因?yàn)檫@是字符串String,,這個(gè)String不放在數(shù)據(jù)類型里討論。String是對(duì)象不是基本數(shù)據(jù)類型,,這句話意味著這里討論的數(shù)據(jù)類型不是對(duì)象,,你可能覺得不是就不是唄,可是從學(xué)術(shù)的角度或者一直面向?qū)ο蟮某绦騿T看來,,就難以適應(yīng)了,,有人抨擊Java不是純粹的面向?qū)ο笳Z言,指的就是8中基本數(shù)據(jù)類型不是對(duì)象,,從程序員的角度來看,,不是對(duì)象意味著點(diǎn)點(diǎn)不會(huì)出現(xiàn)方法。有的時(shí)候這是個(gè)問題,,為什么Java的設(shè)計(jì)者不能再純粹一點(diǎn)呢,?這是有原因的,設(shè)計(jì)者們看的很深很遠(yuǎn),,從效率的角度考慮,,基本數(shù)據(jù)類型的操作比對(duì)象更有效率,不過為了照顧面向?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ī)則又是不同的,,我們來看下面兩個(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)換的問題,,其實(shí)我們之前已經(jīng)使用過這樣的轉(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é)果問題,,既然類型不同,,轉(zhuǎn)換之后會(huì)成為什么呢?這里面一定會(huì)有比較合理的規(guī)則,,比如,,我們之前將小數(shù)轉(zhuǎn)換成證書會(huì)誰去掉小數(shù)部分,我不需要告訴你所有的轉(zhuǎn)換規(guī)則,,在知道了各種數(shù)據(jù)類型,,以及如何轉(zhuǎn)換的情況下,你完全可以自己試一下,,大多數(shù)情況下,,一看結(jié)果就知道規(guī)則是什么了。 后續(xù)還會(huì)在需要的時(shí)候繼續(xù)討論數(shù)據(jù)類型這個(gè)話題,,現(xiàn)在再多說想必也是吸收不進(jìn)去了,。 我們來嘗試一下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)一,后來成了國際標(biāo)準(zhǔn)也就是后來的ASCII編碼,,那么再來一段代碼

public class MyTest {

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

結(jié)果很明顯吧,,一看就能猜出來是a,結(jié)果也確實(shí)是a,,還記得我們的任務(wù)是什么?這個(gè)階段的任務(wù)就是隨機(jī)生成字母,,也就是說,,生成從a到z的隨機(jī)字母,我們看到a對(duì)應(yīng)的ASCII碼是97,,那么相應(yīng)的z就是97+26.,,如果能夠生成9797+26的隨機(jī)數(shù)。我們能夠通過強(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è)問題待解決,。g.drawString方法需要三個(gè)參數(shù),,這是我們知道的,第一個(gè)參數(shù)是一個(gè)字符串(String),,第二個(gè)和第三個(gè)分別是X和Y坐標(biāo),,是整數(shù)(int),我們的問題是,,得到了隨機(jī)字符,,可是那是字符不是字符串,字符沒法滿足這個(gè)方法的需求,,我們需要將字符強(qiáng)行轉(zhuǎn)換為字符串,。根據(jù)此前的經(jīng)驗(yàn),或許有人會(huì)用這種辦法啦轉(zhuǎn)換——(string)c,,這里假設(shè)c是字符變量,,這是不行的,這種做法只是適合基于數(shù)據(jù)類型的轉(zhuǎn)換,,還有一種情況也是用這種轉(zhuǎn)換方式,,不過現(xiàn)在不講,后續(xù)會(huì)說明,,我這兒有一個(gè)省事的方法,,在需要轉(zhuǎn)換的地方寫' '+c,因?yàn)?span>' '是一個(gè)完全空的字符串,,要知道在大多數(shù)的情況下,,一個(gè)變量加到字符串上,都會(huì)被自動(dòng)轉(zhuǎn)換成字符串,,無論是基本數(shù)據(jù)類型還是對(duì)象,,唯一的問題就是這樣做的辦法好像效率太低了,,計(jì)算機(jī)需要更加長的時(shí)間去執(zhí)行這個(gè)操作,字符串想叫的做法無疑會(huì)讓這個(gè)程序的運(yùn)行效率變得很低,,所以如果是正式的編程,,不建議這樣做類型轉(zhuǎn)換。正確的做法是把c變成對(duì)象——new Character(c),,所有的對(duì)象都有to String方法,,我們用這個(gè)方法來轉(zhuǎn)換得到字符串。這樣就遺留了一個(gè)問題,,為什么所有的對(duì)象都要有to String方法呢,?不急,后面我會(huì)說道的,。 充分理解上面的討論之后,,你可以嘗試一下完成這一步的代碼,讓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)]有問題了,,我們來完成第三步,及時(shí)讓字母落下,。如果字母落出屏幕就生成新的字母,,并從屏幕的上方重新的出現(xiàn)。 落下的代碼不難,,幾乎和下雪的代碼一樣,,不同的是,下雪的代碼在超出屏幕的處理上是讓Y值回到0,。為了有更好的效果,,在這個(gè)案例上,我們還要讓X獲得一個(gè)新的隨機(jī)數(shù),,另外這個(gè)字符也要產(chǎn)生一個(gè)字符,。 同樣建議你先自己試著完成任務(wù),然后再看代碼,,如果沒有思路,,還是回頭看看前面,看看還有哪里沒有徹底的掌握,。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.接收鍵盤輸入并消除匹配的字母 ## 前三部基本都已經(jīng)完成,,現(xiàn)在做的是第4步,接收用戶鍵盤的輸入,,如果匹配上就消除這個(gè)字符,。事實(shí)上,,我們并不真正的去消除字符,而是讓這個(gè)字符重新從屏幕的上面再出來,,這將是個(gè)新生成的字符,。接收用戶輸入我想不是問題了,那么拿到用戶的輸入以后怎么知道屏幕上有沒有的這個(gè)字符呢,?字符都存在在那個(gè)數(shù)組里,,看來我們得到數(shù)組里去找有沒有,如果有就處理,。 還是自己先去嘗試一下再看一下代碼,,不過這一步我不在提供所有的代碼,只是部分,,我只是覺得大家已經(jīng)有能力看得懂了,,所以不再和之前一樣提供所有的代碼了,下面只是列出了事件處理的程序

public void keyPressed(KeyEvent arg0)

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

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]); } //顯示成績 g.setColor(Color.RED); g.drawString(“你的成績是:”+sorce, 5, 10); } }

下面的代碼是實(shí)現(xiàn)扣分功能的代碼,,你看到'-='運(yùn)算符了吧,,相似的還有'+= *= /+'之類的,這里是score = score-1000的簡(jiǎn)單寫法 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; } } } } 最后我們來看看如何實(shí)現(xiàn)敲對(duì)了加分的功能,,敲錯(cuò)了減分的功能

public void keyPressed(KeyEvent arg0)

{ //將用戶輸入的字符存入KeyC中 char keyC=arg0.getKeyChar; //掃描整個(gè)數(shù)組,,看看有沒有匹配的字符 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; } } }

你覺得這樣的代碼可以嗎?肯定不可以啊,。在我們看來,,假設(shè)數(shù)組里的10個(gè)字符中有一個(gè)'a',你卻敲'a'這個(gè)字符,,你希望的道德結(jié)果是加10分,,但是最壞的結(jié)果是循環(huán)了10次,最后一個(gè)匹配上了,。匹配上了這次雖然說是加了10分,,但是前面沒有匹配上的9次怎么辦?扣900分嗎,?這樣不符合邏輯啊,,這是一個(gè)很經(jīng)典的問題,語法上沒有錯(cuò)誤但是邏輯上存在問題,,因此我們就需要一個(gè)標(biāo)識(shí),,如果沒有匹配上,標(biāo)識(shí)的值不變,,一旦匹配上了,,標(biāo)識(shí)改變,。等到循環(huán)完了,,看一下標(biāo)識(shí),有很多情況下我們都會(huì)用到這個(gè)小算法 具體的實(shí)現(xiàn)來看,,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; } }

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

public void keyPressed(KeyEvent arg0)

{ //將用戶輸入的字符存入KeyC中 char keyC=arg0.getKeyChar; //掃描整個(gè)數(shù)組,,看看有沒有匹配的字符 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)的多,,我建議大家還是先停一下,把前面的代碼再自己多寫寫,,多多理解理解再繼續(xù)下去,,因?yàn)樽詈笠徊降倪壿嬘悬c(diǎn)棘手,不是很好理解 ## 6.如何消除最下面的字符 ## 現(xiàn)在開始完成第6步,,我們的目的是找到多個(gè)匹配成功的字符的最下面一個(gè),,并且清除掉,其中清除不難,,找到匹配的字符也不難,,焦點(diǎn)在最下面一個(gè)字符上,如何判斷這是最先面的自字符,?這很簡(jiǎn)單,,就是Y坐標(biāo)最大的。如果不是計(jì)算機(jī)來完成這件事情,,讓人來做,,那就是找到所以的匹配字符,擺在那里,,看看誰的Y最大,,計(jì)算機(jī)沒有一次性比較多個(gè)值的能力,每次只能比較出一個(gè)值,,我們的思路是,,先找到一個(gè)以后,然后把Y值記錄下來,,再找到一個(gè),,再判斷,如果新的Y值大于原來的,,那么就用這個(gè)Y值替換掉原來的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),也就是說每次我們還得記錄保留下來的數(shù)組下標(biāo),。 還有一個(gè)小問題,,即便有很多匹配的字符,判斷的邏輯是相同的,,我們完全可以將這個(gè)判斷放在循環(huán)里,,讓這個(gè)邏輯周而復(fù)始的去做,可是第一個(gè)字符的匹配邏輯不同,,它不需要判斷,,見到存下來就好,能不能將第一個(gè)字符的邏輯和其他邏輯統(tǒng)一呢,?如果能的話,,我們就可以節(jié)省下一段代碼了,我想到了一個(gè)辦法,,就存放在最下面Y坐標(biāo)的變量初始值設(shè)置成絕對(duì)不可能小的數(shù),,這樣第一個(gè)字符就去判斷,當(dāng)然,,由于老的值一定小,,所以第一個(gè)字符的值也會(huì)被存下來。

public void keyPressed(KeyEvent arg0)

{ //將用戶輸入的字符存入KeyC中 char keyC=arg0.getKeyChar; //掃描整個(gè)數(shù)組,,看看有沒有匹配的字符 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; } }

我們來看看上面這段代碼,nowY存放著最下面符合條件的Y坐標(biāo),,nowIndex存放著最下面符合條件的數(shù)組的下標(biāo),,boolean變量似乎也不需要了,,因?yàn)橥耆梢愿鶕?jù)nowIndex來判斷有沒有找到,,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]); } //顯示成績 g.setColor(Color.RED); g.drawString(“你的成績是:”+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ù)組,看看有沒有匹配的字符 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)該是目前博主寫博客以來寫的最多的一次,,當(dāng)然你們看的學(xué)的覺得很辛苦,,博主自己寫的也很辛苦,好好的而消化,多練幾遍,,要輕松的理解這些東西并非易事,,良好的邏輯能力需要培養(yǎng),親自寫代碼,,自己改錯(cuò),,非常鍛煉編程能力,堅(jiān)持不懈的努力,,終究會(huì)成功,,這次就到這里了,下期再見了,,下期更完圖形界面應(yīng)該是告一段落了,,要真的開始寫項(xiàng)目了。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(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)論公約

    類似文章 更多