国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Java的指法練習(xí)小游戲的設(shè)計(jì)與實(shí)現(xiàn)

2017-12-15 17:09:13張會
電腦知識與技術(shù) 2017年32期
關(guān)鍵詞:多線程游戲

張會

摘要:該文利用 Java Swing,多線程,事件處理等技術(shù)實(shí)現(xiàn)了一個指法練習(xí)小游戲。游戲具有設(shè)置游戲難度等級,統(tǒng)計(jì)游戲成績等功能。該游戲是一個集Java Swing、多線程、事件處理等知識綜合應(yīng)用實(shí)例程序,對《Java程序設(shè)計(jì)》課程教學(xué)有一定的指導(dǎo)作用。

關(guān)鍵詞:多線程;事件處理;游戲;Java Swing

中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2017)32-0085-02

Design and Implementation of Fingering Practice Game Based on Java

ZHANG Hui

(School of Mathematics and Computer Science, Panzhihua University, Panzhihua 617000, China)

Abstract: This paper uses Java Swing, multi-thread, event processing and other techniques to complete a fingering practice game. The game has difficulty level settings, statistical game scores and other functions. This game is a comprehensive program, including Java Swing, multi-threaded, event processing and other knowledge. It has some guiding function to the course teaching of Java programming.

Key words: multi-thread; event processing; game; Java Swing

指法練習(xí)小游戲是用戶在鍵盤指法練習(xí)時經(jīng)常選擇的一款小游戲。在程序設(shè)計(jì)語言教學(xué)中,結(jié)合學(xué)生熟悉的游戲并利用案例式教學(xué)有助于提高學(xué)生學(xué)習(xí)興趣,促進(jìn)學(xué)生對所學(xué)知識掌握吸收,并較好的應(yīng)用于實(shí)際項(xiàng)目中。文中的指法練習(xí)小游戲采用Java Swing,線程,事件處理等相關(guān)技術(shù)進(jìn)行設(shè)計(jì)及開發(fā),使學(xué)生快速掌握及使用Java中的Java Swing、線程、事件處理等相關(guān)技術(shù)進(jìn)行Java程序開發(fā)有較大幫助,并對《Java程序設(shè)計(jì)》課程相關(guān)知識點(diǎn)的綜合實(shí)踐教學(xué)具有一定指導(dǎo)作用。

1 指法練習(xí)小游戲設(shè)計(jì)

1.1 功能設(shè)計(jì)

小游戲能夠?qū)崿F(xiàn)以下功能:

1) 字母小球生成:字母小球從窗口頂端的任意位置隨機(jī)生成并按一定速度向窗口下方滾動。

2) 游戲等級設(shè)置:按照游戲設(shè)置菜單下的高,中,低,自定義設(shè)置界面中字母小球的個數(shù),并在窗口頂部開始隨機(jī)產(chǎn)生相應(yīng)個數(shù)的滾動字母小球。

3) 計(jì)分統(tǒng)計(jì):窗口中字母小球滾動入窗口下方且未敲擊中鍵盤上相應(yīng)字母按鍵,score成績減1分,字母小球未滾動入窗口下方且敲擊中鍵盤上相應(yīng)字母按鍵,則score成績加1分,同時顯示score的當(dāng)前值。

4) 能夠通過菜單中的退出功能退出游戲。

1.2 界面設(shè)計(jì)

Swing是Java的GUI(圖形用戶界面)工具包,包括了GUI組件,如:菜單欄、菜單項(xiàng)、按鈕、面板、文本框等組件。本設(shè)計(jì)利用了Swing中的相關(guān)組件實(shí)現(xiàn)了如圖1所示的游戲界面。其中JFrame做為頂層窗體容器,在其上添加了JMenuBar(菜單欄),JMenu(游戲設(shè)置菜單)及菜單下的JMenuItem(菜單項(xiàng))組件,另外在JFrame容器中添加了一個JPanel面板,用于在其上顯示向下滾動的字母小球及得分情況。

2 指法練習(xí)游戲功能實(shí)現(xiàn)

2.1 游戲難度設(shè)置功能實(shí)現(xiàn)

本游戲通過選擇“游戲設(shè)置”菜單中的高,中,低及自定義選項(xiàng)控制游戲難易度,游戲難易度由游戲中滾動字母小球的個數(shù)確定,難度越高則字母小球個數(shù)越多,“自定義”選項(xiàng)采用Dialoag方式直接輸入滾動字母小球的個數(shù)。

游戲等級設(shè)置通過java中的事件處理技術(shù)實(shí)現(xiàn)。當(dāng)單擊菜單中某菜單選項(xiàng)時,會產(chǎn)生一個ActionEvent事件(或者在進(jìn)行游戲過程中,按鍵盤上的某個按鍵時,會產(chǎn)生一個KeyEven事件),然后Java虛擬機(jī)檢查是否有與該菜單項(xiàng)或按鍵相關(guān)聯(lián)的事件處理器,事件處理器實(shí)質(zhì)是一個方法,如actionPerformed()方法,keyPressed()方法,如果沒有,不做任何處理;若有則將事件對象傳遞給與之關(guān)聯(lián)的事件處理器方法作為事件處理方法參數(shù),并自動調(diào)用事件處理方法。Java虛擬機(jī)通過傳遞過來的ActionEvent,keyEvent對象,獲得事件發(fā)生時與該事件及事件源相關(guān)聯(lián)的信息。Java組件通過形如addXxxListener()的方法添加事件監(jiān)聽器。一個事件源可以添加多個監(jiān)聽器。

游戲高、中、低及自定義級別的菜單項(xiàng)的事件處理代碼如下:

JMenuItem item = (JMenuItem) e.getSource();

if (item == this.lowI) {

init(lowBallCount);

} else if (item == this.midI) {

init(midBallCount);

} else if (item == this.highI) {

init(highBallCount);

} else if (item == this.selfDefineI) {endprint

String str = JOptionPane.showInputDialog("輸入字母小球個數(shù):");

ballCount = Integer.parseInt(str);

init(ballCount);}

為各菜單項(xiàng)添加事件監(jiān)聽器代碼如下:

lowI.addActionListener(myPanle);

midI.addActionListener(myPanle);

highI.addActionListener(myPanle);

selfDefineI.addActionListener(myPanle);

為面板添加按鍵事件監(jiān)聽器代碼如下:myPanel.addKeyListener(myPanel);

2.2 游戲中字母小球的產(chǎn)生及位置定位

本游戲中向下滾動的字母小球在游戲加載運(yùn)行時,其生成的位置在JPanel中是隨機(jī)的,通過為每個字母小球定義(x,y)座標(biāo)值,使用Math.random()在JPanel中產(chǎn)生隨機(jī)座標(biāo)值。同時把小球上的字母通過隨機(jī)函數(shù)產(chǎn)生。由于程序中生成的字母小球是ballCount個,所以程序中字母小球的座標(biāo)x,y及小球上的字母ch在存儲時均采用數(shù)組進(jìn)行存放,且數(shù)組元素個數(shù)均是ballCount個。代碼如下:

public void init(int ballCount) {

x = new int[ballCount];

y = new int[ballCount];

ch = new char[ballCount];

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

x[i] = (int) (Math.random() * width);

y[i] = (int) (Math.random() * height);

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

界面中的字母下面小球是一張背景圖片,是通過讀取ball.png圖片數(shù)據(jù),再通過drawImage()將小球圖片繪制在(x[i],y[i])座標(biāo)位置,由于小球圖片大于顯示的字母,所以在繪制ball.png圖片時,(x[i],y[i])座標(biāo)值同時向左向上做了些微偏移,因此最終在(x[i]-20,y[i]-30)座標(biāo)處繪制出ball.png,最后再在(x[i],y[i])座標(biāo)位置使用drawString()繪制出大寫字母ch[i]的值。代碼如下:

image = ImageIO.read(new File("ball.png"));

g.drawImage(image, x[i] - 20, y[i] - 30, imWidth, imHeight, this);

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

2.3 線程實(shí)現(xiàn)字母小球在屏幕上向下滾動

類 JComponent中的paint()方法通常用于在容器中繪制所需組件,程序中不能直接調(diào)用 paint()方法,均是采用自動調(diào)用方式調(diào)用paint()方法。調(diào)用子類重寫父類pain()方法通常有兩種方式:一是在頂層容器中顯示子類組件時會自動調(diào)用paint()方法,如果子類組件沒有被顯示,是不會調(diào)用paint();二是調(diào)用組件的repaint(),其實(shí)質(zhì)是自動調(diào)用Java組件子類中重寫的paint()方法以實(shí)現(xiàn)刷新重繪。

本游戲在運(yùn)行過程時需要在JFrame中的JPanel中繪制出向下移動的字母小球,及得分情況,因此本程序通過自定義一個MyPanel類繼承于JPanel類,并重寫Jpanel類中的paint()方法,以便程序在繪制不斷向下滾動的小球時,MyPanel線程調(diào)用repaint()方法時能自動調(diào)用paint()方法實(shí)現(xiàn)小球滾動的效果。代碼如下:

public void paint(Graphics g) {

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

Image image;

try {

image = ImageIO.read(new File("ball.png"));

g.drawImage(image, x[i] - 20, y[i] - 30, 50, 50, this);

} catch (IOException e) {

e.printStackTrace();}

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

y[i] += 3;}}

程序通過Thread.sleep(100)控制線程每隔100毫秒,調(diào)用repaint()去自動調(diào)用paint()方法一次,使字母小球的縱向坐標(biāo)值y[i]+=3;從而使小球動起來。代碼如下:

public void run() {

while (true) {

repaint(); //自動調(diào)用重寫的paint()方法

Thread.sleep(100);}}

2.4 計(jì)分功能實(shí)現(xiàn)

在字母小球向下滾動的過程中,用戶通過敲擊鍵盤上相應(yīng)的字母鍵,觸發(fā)MyPanel事件源,生成KeyEvent按鍵事件對象,并將該對象傳遞給按鍵處理器的keyPressed()方法做為參數(shù),并執(zhí)行該方法。當(dāng)按鍵字母與小球上的字母相等時,字母小球消失,再給該字母小球的座標(biāo)值重新置值,其中將該小球的y值置為0,x值在窗口寬度范圍內(nèi)產(chǎn)生一個隨機(jī)值,并重新在小球上生成一個隨機(jī)字母,以保證窗口中的字母小球的個數(shù)始終為ballCount個,同時使score值加1,以實(shí)現(xiàn)計(jì)分中的加分功能。代碼實(shí)現(xiàn)如下:endprint

public void keyPressed(KeyEvent e)

{

char c = e.getKeyChar();

for (int i = 0; i < ballCount; i++)

{

if (c == ch[i]) {

x[i] = (int) (Math.random() * width);

y[i] = 0;

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

score++;}}}

計(jì)分功能中的減分功能的實(shí)現(xiàn):當(dāng)有字母小球從窗口底部移出,并且用戶未敲擊鍵盤上相應(yīng)的字母鍵,則score的值減1。程序再在窗口頂部重新產(chǎn)生一個字母小球的座標(biāo),并通過調(diào)用repaint()方法在下一個100毫秒時進(jìn)行重繪該字母小球。代碼實(shí)現(xiàn)如下:

if (y[i] >= height) {

x[i] = (int) (Math.random() * width);y[i] = 0;

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

score—;}

3 結(jié)束語

本指法練習(xí)小游戲通過使用Java Swing呈現(xiàn)出友好的人機(jī)交互界面,采用多線程技術(shù)實(shí)現(xiàn)字母小球在窗口中向下滾動動畫及字母小球移出窗口減分功能,采用事件處理技術(shù)實(shí)現(xiàn)游戲等級設(shè)置及在敲擊鍵盤上字母鍵等同于字母小球上字母時的得分功能,另外通過重寫JPanel類的paint()方法來實(shí)現(xiàn)重繪等功能。雖然本指法練習(xí)小游戲的功能與金山打字類軟件的指法練習(xí)在功能上相比有所欠缺,但本程序便于初學(xué)者理解,為Java初學(xué)者掌握事件處理,多線程技術(shù),Java Swing等知識提供了一個綜合而有趣的實(shí)例,并且在Java程序設(shè)計(jì)課程教學(xué)中有一定的參考作用。

參考文獻(xiàn):

[1] 明日科技. Java從入門到精通 [M]. 3版.北京: 清華大學(xué)出版社, 2012.

[2] 傳智博客. Java基礎(chǔ)入門[M]. 北京: 清華大學(xué)出版社, 2014.

[3] 楊建強(qiáng), 李苗在. 基于Java Swing的計(jì)算器的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電腦與電信, 2016(10):61-63.

[4] 馬巧梅. 基于Java打磚塊游戲的設(shè)計(jì)與實(shí)現(xiàn)[J]. 信息技術(shù), 2016(7):16-19.

[5] 孫佳美. 基于Java飛機(jī)大戰(zhàn)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 無線互聯(lián)科技, 2016(1):54-55.

[6] 王改芳, 龔君芳. 基于Java的考試機(jī)設(shè)計(jì)與實(shí)現(xiàn)[J]. 實(shí)驗(yàn)技術(shù)與管理, 2016(33):147-149.endprint

猜你喜歡
多線程游戲
Java并發(fā)工具包對并發(fā)編程的優(yōu)化
數(shù)獨(dú)游戲
瘋狂的游戲
飛碟探索(2016年11期)2016-11-14 19:34:47
基于多線程文件傳輸關(guān)鍵技術(shù)研究與實(shí)現(xiàn)
爆笑游戲
網(wǎng)頁爬蟲技術(shù)的關(guān)鍵技術(shù)研究探索
一種基于多線程的高速磁盤鏡像算法
第八章直接逃出游戲
乡宁县| 屏南县| 阳江市| 雷州市| 望都县| 南丰县| 苍山县| 汪清县| 同心县| 西和县| 边坝县| 商水县| 苏尼特右旗| 巴彦县| 龙里县| 四子王旗| 庆阳市| 明光市| 修水县| 长武县| 天峻县| 特克斯县| 两当县| 保靖县| 青州市| 名山县| 南京市| 清原| 南乐县| 鄂尔多斯市| 辽阳县| 黔西| 新泰市| 大港区| 金溪县| 连州市| 建湖县| 黄浦区| 峨眉山市| 宜川县| 谢通门县|