亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        張會(huì)

        摘要:該文利用 Java Swing,多線程,事件處理等技術(shù)實(shí)現(xiàn)了一個(gè)指法練習(xí)小游戲。游戲具有設(shè)置游戲難度等級,統(tǒng)計(jì)游戲成績等功能。該游戲是一個(gè)集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í)時(shí)經(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ī)生成并按一定速度向窗口下方滾動(dòng)。

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

        3) 計(jì)分統(tǒng)計(jì):窗口中字母小球滾動(dòng)入窗口下方且未敲擊中鍵盤上相應(yīng)字母按鍵,score成績減1分,字母小球未滾動(dòng)入窗口下方且敲擊中鍵盤上相應(yīng)字母按鍵,則score成績加1分,同時(shí)顯示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容器中添加了一個(gè)JPanel面板,用于在其上顯示向下滾動(dòng)的字母小球及得分情況。

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

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

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

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

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

        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圖片時(shí),(x[i],y[i])座標(biāo)值同時(shí)向左向上做了些微偏移,因此最終在(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)字母小球在屏幕上向下滾動(dòng)

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

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

        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()去自動(dòng)調(diào)用paint()方法一次,使字母小球的縱向坐標(biāo)值y[i]+=3;從而使小球動(dòng)起來。代碼如下:

        public void run() {

        while (true) {

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

        Thread.sleep(100);}}

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

        在字母小球向下滾動(dòng)的過程中,用戶通過敲擊鍵盤上相應(yīng)的字母鍵,觸發(fā)MyPanel事件源,生成KeyEvent按鍵事件對象,并將該對象傳遞給按鍵處理器的keyPressed()方法做為參數(shù),并執(zhí)行該方法。當(dāng)按鍵字母與小球上的字母相等時(shí),字母小球消失,再給該字母小球的座標(biāo)值重新置值,其中將該小球的y值置為0,x值在窗口寬度范圍內(nèi)產(chǎn)生一個(gè)隨機(jī)值,并重新在小球上生成一個(gè)隨機(jī)字母,以保證窗口中的字母小球的個(gè)數(shù)始終為ballCount個(gè),同時(shí)使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)生一個(gè)字母小球的座標(biāo),并通過調(diào)用repaint()方法在下一個(gè)100毫秒時(shí)進(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)字母小球在窗口中向下滾動(dòng)動(dòng)畫及字母小球移出窗口減分功能,采用事件處理技術(shù)實(shí)現(xiàn)游戲等級設(shè)置及在敲擊鍵盤上字母鍵等同于字母小球上字母時(shí)的得分功能,另外通過重寫JPanel類的paint()方法來實(shí)現(xiàn)重繪等功能。雖然本指法練習(xí)小游戲的功能與金山打字類軟件的指法練習(xí)在功能上相比有所欠缺,但本程序便于初學(xué)者理解,為Java初學(xué)者掌握事件處理,多線程技術(shù),Java Swing等知識提供了一個(gè)綜合而有趣的實(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ù)研究探索
        一種基于多線程的高速磁盤鏡像算法
        第八章直接逃出游戲
        亚洲av无码片在线观看| 99精品国产综合久久麻豆| 丁香花五月六月综合激情| 男女猛烈拍拍拍无挡视频| 久久精品免视看国产成人| 亚洲另类欧美综合久久图片区| 精品亚洲人伦一区二区三区| 国产女人精品一区二区三区| 亚洲欧美中文日韩在线v日本| 久久久久亚洲av成人网人人网站| 日韩av无码成人无码免费| 久久亚洲AV无码一区二区综合 | 热re99久久精品国产99热| 无码人妻精品一区二区三区下载 | 国产成人九九精品二区三区| 中文字幕日本一区二区在线观看| 久久午夜av一区二区| 国产一区二区精品久久岳| 三级特黄60分钟在线观看| 久久久久久久一线毛片| 性色av一区二区三区密臀av| 午夜少妇高潮在线观看| 野花社区视频在线观看| 国产99久久无码精品| 中文字幕日韩人妻在线| 一区二区三区国产色综合| 国产片精品av在线观看夜色| 亚洲精品久久久久久动漫| 无码精品国产午夜| 中文文精品字幕一区二区| 国产精品久久久爽爽爽麻豆色哟哟 | 久久精品国产亚洲av一般男女| 欧美日韩精品乱国产| 少妇人妻200篇白洁| 香蕉亚洲欧洲在线一区| 久久精品国产亚洲av网站 | 美女视频在线观看一区二区三区| 成人免费播放视频777777| 丰满熟妇乱子伦| 精品国产高清a毛片| 熟女免费观看一区二区|