- 實戰Java程序設計
- 北京尚學堂科技有限公司
- 2558字
- 2019-10-16 10:45:14
1.8 30分鐘完成桌球小游戲項目
我們秉承“快速入門、快速實戰”的理念開發這套教材,就是希望讀者在學習過程中能盡快進入實戰環節,盡快介入項目,使學習更有興趣,更容易產生成就感,從而帶來更大的學習動力。
如下的小項目,對于第一次接觸編程的讀者從理解上會有難度。但是這個項目不在于讓大家理解代碼本身,而是“體驗敲代碼的感覺”。
【項目】桌球游戲小項目
練習目標:
(1)找到敲代碼的感覺。
(2)收獲敲代碼的興趣。
(3)做出效果,找到自信。
(4)從一開始就學會調試錯誤。
(5)掌握Java代碼的基本結構。
項目需求:
桌球在球桌中按照一定線路和角度移動,遇到邊框會自動彈回。桌球游戲的運行結果如圖1-39所示。

圖1-39 桌球游戲的運行結果
要求:
即使看不太懂,讀者也要照著輸入游戲代碼,至少5遍。要求所有字符和示例文件一致。如果運行時報異常,請細心看所在行和示例代碼有何區別。初學者現階段不需要理解代碼的語法功能,只要按照代碼結構輸入代碼,經過調試能夠實現代碼的正常運行即可。
下面將分成四個步驟來實現桌球游戲。
第一步:創建項目和窗口。
第二步:加載兩張圖片。
第三步:實現動畫,讓小球沿著水平方向移動并做邊界檢測。
第四步:實現小球沿著任意角度飛行(本示例會用到與初中學習過的三角函數有關的知識)。
注 示例及代碼和圖片資源的下載地址為http://www.sxt.cn/Java_jQuery_in_action/Billiards_Games.html。
第一步:創建項目和窗口。
創建項目并復制圖片:在項目名MyPro01上右擊,在快捷菜單中選擇New→Folder命令,創建一個名稱是images的文件夾,并將兩張圖片復制到該目錄下。然后在src目錄下創建類BallGame.java。在Eclipse下的項目結構如圖1-40所示。

圖1-40 桌球游戲的項目結構
繪制窗口的代碼如示例1-3所示。
【示例1-3】桌球游戲代碼——繪制窗口
import javax.swing.JFrame; public class BallGame extends JFrame { //窗口加載 void launchFrame() { setSize(300, 300); setLocation(400, 400); setVisible(true); } //main方法是程序執行的入口 public static void main(String[ ] args) { System.out.println("我是尚學堂高淇,這個游戲項目讓大家體驗編程的快感," + "寓教于樂!"); BallGame game=new BallGame(); game.launchFrame(); } }
執行結果如圖1-41所示。

圖1-41 示例1-3運行結果
第二步:加載兩張圖片。
加載兩張圖片:在BallGame類中添加小球和桌面的路徑,并指定小球出現在窗口的初始位置。然后添加paint方法,加載小球和桌面。代碼如示例1-4所示。
【示例1-4】桌球游戲代碼——加載圖片
import java.awt.*; import javax.swing.JFrame; public class BallGame extends JFrame { //添加小球和桌面圖片的路徑 Image ball=Toolkit.getDefaultToolkit().getImage("images/ball.png"); Image desk=Toolkit.getDefaultToolkit().getImage("images/desk.jpg"); //指定小球的初始位置 double x=100; //小球的橫坐標 double y=100; //小球的縱坐標 //畫窗口的方法:加載小球與桌面 public void paint(Graphics g){ System.out.println("窗口被畫了一次!"); g.drawImage(desk, 0, 0, null); g.drawImage(ball, (int)x, (int)y, null); } //窗口加載 void launchFrame(){ setSize(856,500); setLocation(50,50); setVisible(true); } //main方法是程序執行的入口 public static void main(String[ ] args){ System.out.println(" 我是尚學堂高淇,這個游戲項目讓大家體驗編程的快感," + "寓教于樂!"); BallGame game=new BallGame(); game.launchFrame(); } }
執行結果如圖1-42所示。

圖1-42 示例1-4運行效果
注意
由于懶加載問題,有可能出現第一次加載圖片無效的情況,此時最小化窗口再重新打開即可。在完成第三步后,就完全不存在這個問題了。
第三步:實現動畫。
實現動畫,讓小球沿著水平方向移動并做邊界檢測。要實現動畫效果的關鍵是改變小球的坐標,并且要不停地重畫窗口來更新小球的坐標;邊界檢測用于判斷小球的坐標是否超出桌面的范圍,如果超出則要改變小球原來的運動方向。代碼如示例1-5所示。
【示例1-5】桌球游戲代碼——實現水平方向來回飛行
import java.awt.*; import javax.swing.JFrame; public class BallGame extends JFrame { //添加小球和桌面圖片的路徑 Image ball=Toolkit.getDefaultToolkit().getImage("images/ball.png"); Image desk=Toolkit.getDefaultToolkit().getImage("images/desk.jpg"); //指定小球的初始位置 double x=100; //小球的橫坐標 double y=100; //小球的縱坐標 boolean right=true; //判斷小球的方向 //畫窗口的方法:加載小球與桌面 public void paint(Graphics g){ System.out.println("窗口被畫了一次!"); g.drawImage(desk, 0, 0, null); g.drawImage(ball, (int)x, (int)y, null); //改變小球坐標 if(right){ x=x +10; }else{ x=x -10; } //邊界檢測 //856是窗口寬度,40是桌子邊框的寬度,30是小球的直徑 if(x>856-40-30){ right=false; } if(x<40){ right=true; } } //窗口加載 void launchFrame(){ setSize(856,500); setLocation(50,50); setVisible(true); //重畫窗口,每秒畫25次 while(true){ repaint(); //調用repaint方法,窗口即可重畫 try{ Thread.sleep(40); //40ms,1s=1000ms。大約一秒畫25次窗口 }catch(Exception e){ e.printStackTrace(); } } } //main方法是程序執行的入口 public static void main(String[ ] args){ System.out.println(" 我是尚學堂高淇,這個游戲項目讓大家體驗編程的快感," + "寓教于樂!"); BallGame game=new BallGame(); game.launchFrame(); } }
第四步:實現小球沿任意角度飛行。
實現小球沿著任意角度飛行:此時小球的運動方向不能再單純使用right來表示,需要一個表示角度的變量degree。小球坐標的改變也要依據這個角度。代碼如示例1-6所示(為了保存第三步的代碼,新創建了一個類BallGame2)。
【示例1-6】桌球游戲代碼——實現任意角度飛行
import java.awt.*; import javax.swing.JFrame; public class BallGame2 extends JFrame { //添加小球和桌面圖片的路徑 Image ball=Toolkit.getDefaultToolkit().getImage("images/ball.png"); Image desk=Toolkit.getDefaultToolkit().getImage("images/desk.jpg"); //指定小球的初始位置 double x=100; //小球的橫坐標 double y=100; //小球的縱坐標 double degree=3.14/3; //弧度:小球的運動角度,此處就是60度 //畫窗口的方法:加載小球與桌面 public void paint(Graphics g){ System.out.println("窗口被畫了一次!"); g.drawImage(desk,0,0, null); g.drawImage(ball, (int)x, (int)y, null); //根據角度degree改變小球坐標 x= x+ 10*Math.cos(degree); y= y +10*Math.sin(degree); //邊界檢測:碰到上下邊界 //500是窗口高度;40是桌子邊框,30是球直徑;最后一個40是標題欄的高度 if(y>500-40-30||y<40+40){ degree=-degree; } //邊界檢測:碰到左右邊界 //856是窗口寬度,40是桌子邊框的寬度,30是小球的直徑 if(x<40||x>856-40-30){ degree=3.14- degree; } } //窗口加載 void launchFrame(){ setSize(856,500); setLocation(50,50); setVisible(true); //重畫窗口,每秒畫25次 while(true){ repaint(); //調用repaint方法,窗口即可重畫 try{ Thread.sleep(40); //40ms,1s=1000ms。大約一秒畫25次窗口 }catch(Exception e){ e.printStackTrace(); } } } //main方法是程序執行的入口 public static void main(String[ ] args){ System.out.println(" 我是尚學堂高淇,這個游戲項目讓大家體驗編程的快感," + "寓教于樂!"); BallGame2 game=new BallGame2(); game.launchFrame(); } }
本章總結
(1)所有編程語言的最終目的都是提供一種“抽象”方法。抽象的層次越高,越接近人的思維;越接近人的思維,越容易使用。
(2)越高級的語言越容易學習。當然,這只意味著入門容易,不意味著成為高手容易,想成為高手仍然需要修煉。
(3)Java的核心優勢是跨平臺。跨平臺是靠JVM(虛擬機)實現的。
(4)Java各版本的含義:
■ Java SE(Java Standard Edition)標準版,定位于個人計算機的應用。
■ Java EE(Java Enterprise Edition)企業版,定位于服務器端的應用。
■ Java ME(Java Micro Edition)微型版,定位于消費電子產品的應用。
(5)Java程序的開發運行過程依次為:編寫代碼、編譯和解釋運行。
(6)JDK用于開發Java程序,JRE是Java運行環境;JVM是JRE的子集,JRE是JDK的子集。
(7)JDK的配置需要新建JAVA_HOME環境變量和修改Path環境變量。
(8)Java是面向對象的語言,所有代碼必須位于類里面。main方法是Java應用程序的入口方法。
(9)常見的Java集成開發環境有三個:Eclipse、IntelliJ IDE和NetBeans。
本章作業
一、選擇題
1.以下( )不是Java的特點(選擇一項)。
A.平臺無關性
B.高可靠性和安全性
C.指針運算
D.分布式應用和多線程
2.以下選項中關于Java跨平臺原理的說法正確的是( )(選擇二項)。
A.Java源程序要先編譯成與平臺無關的字節碼文件(.class),然后字節碼文件再被解釋成機器碼運行
B.Java語言只需要編譯,不需要進行解釋
C.Java虛擬機是運行Java字節碼文件的虛擬計算機。不同平臺的虛擬機是不同的
D.Java語言具有一次編譯,隨處運行的特點,可以在所有的平臺上運行
3.以下選項中,對一個Java源文件進行正確編譯的語句是( )(選擇一項)。
A.java Test
B.java Test.class
C.javacTest
D.javacTest.java
4.在Java中,源文件Test.java中包含如下代碼,則程序編譯運行的結果是( )(選擇一項)。
public class Test {
public static void main(String[ ] args) {
system.out.println("Hello! ");
}
}
A.輸出:Hello!
B.編譯出錯,提示“無法解析system”
C.運行正常,但沒有輸出任何內容
D.運行時出現異常
5.有一段Java程序,其中public類名是A1,那么保存它的源文件名可以是( )(選擇一項)。
A.A1.java
B. A1.class
C.A1
D.以上都不對
二、簡答題
1.計算機語言發展史主線。
2.Java跨平臺的實現原理。
3.JDK、JRE、JVM的區別和聯系。
4.Java語言的開發和執行過程。
5.環境變量Path的作用和配置。
三、編碼題
1.使用記事本編寫Java程序(重點練習打印語句System.out.println( )),開發學生管理系統主菜單界面。運行結果如圖1-43所示。

圖1-43 主菜單界面
2.使用Eclipse編寫Java程序,打印九九乘法表的前四行,如圖1-44所示。提示:使用System.out.println( )語句打印各行數據。

圖1-44 程序的打印結果
- 技術領導力:程序員如何才能帶團隊
- Learning AWS Lumberyard Game Development
- Visual C++串口通信技術詳解(第2版)
- Bootstrap Essentials
- Multithreading in C# 5.0 Cookbook
- Fast Data Processing with Spark(Second Edition)
- 深入實踐Kotlin元編程
- OpenMP核心技術指南
- SQL Server 2016 從入門到實戰(視頻教學版)
- 多模態數據分析:AGI時代的數據分析方法與實踐
- ActionScript 3.0從入門到精通(視頻實戰版)
- INSTANT Apache ServiceMix How-to
- Apache Solr PHP Integration
- HTML5/CSS3/JavaScript技術大全
- Visual FoxPro數據庫程序設計