Major Softwares

  INDEX PAGE

  1. 簡介
  2. Java, Android和LibGDX好書推介
  3. Java, Android和LibGDX要學的知識
  4. 用Windows寫Java程式
  5. 用Eclipse寫Java程式
  6. 用Eclipse寫Android程式
  7. 用Eclipse寫LibGDX程式
  8. Standard Java Naming Conventions
  9. System.out.println()的用法和意思
  10. Where is main() method in Android?

LibGDX - Splash & Menu Screen

  1. LibGDX: World, Texture, Background, Camera, Viewport, Screen & OpenGL
  2. LibGDX: Texture, TextureRegion, SpriteBatch & Sprite
  3. UML(Unified Modeling Language): Class Diagram
  4. Type Casting, Upcasting & Downcasting
  5. @Override的用法和意思
  6. LibGDX: Scene2d & Graphical User Interface(GUI)
  7. LibGDX: Splash Screen
  8. LibGDX: Texture Packer
  9. LibGDX: BitmapFonts, JSON & Skin
  10. Android: R.java File
  11. Android: onClick事件的5種實現方式
  12. LibGDX: Game Menu Screen
  13. LibGDX: Advanced Game Menu Screen (using Abstract Screen)
  14. LibGDX: Disposable Interface
  15. Java & LibGDX: super keyword
  16. LibGDX: Advanced Game Menu Screen (using AssetManager)
  17. Java: Array, Arrays, List, ArrayList & LibGDX: Array
  18. LibGDX: File I/O (Preferences)
  19. LibGDX: Game Level Selection Screen
  20. LibGDX: Advanced Game Level Selection Screen (using AssetManager)

LibGDX - Tiled 2D Platform Game

  1. LibGDX: Lifecylce (Render() Method)
  2. LibGDX: Delta Time
  3. LibGDX: Animation & Spritesheet
  4. LibGDX: Keyboard, Mouse & Touch Screen Control
  5. Input Control (Polling VS Event Driven Input)
  6. LibGDX: Tiled (Background and Foreground)
  7. LibGDX: Jumping Action
  8. LibGDX: Tiled (Collision Detection)
  9. LibGDX: Tiled (Bullet Class)
  10. LibGDX: Audio (Sound & Music)
  11. LibGDX: Tiled (Scrollable Background with Camera & HUD)
  12. LibGDX: WorldController & WorldRenderer Class

LibGDX/Java - Card Game No.1 - Blackjack

  1. LibGDX: Install & Setup Android Studio IDE
  2. LibGDX: Use Android Studio to Run Java Hello World
  3. LibGDX: Use Android Studio to Run LibGDX Hello World
  4. Adobe Illustrator: Basic Components Part 1
  5. Adobe Illustrator: Basic Components Part 2
  6. Adobe Illustrator: BlackJack Table & Cards
  7. LibGDX: Blackjack Animation
  8. LibGDX: Interpolation
  9. Java: toString() Method
  10. Java: Blackjack Shuffle Methods
  11. LibGDX: Blackjack Shuffle Method
  12. Java: Blackjack Card Game

LibGDX - Others

  1. Making and Displaying App Icon
  2. LibGDX: Displaying Traditional and Simplified Chinese Characters
  3. LibGDX: Handling Different Screen Resolutions

Unity Game Engine & C#

  1. Visual Studio: C# Hello World
  2. Unity: C# Hello World
  3. Unity: Handling Different Screen Resolutions
  4. Unity: Life Cycle
  5. Unity: StartCoroutine, StopCoroutine, IEnumerator & Yield
  6. Unity: Splash Screen
  7. Unity: Fonts, Traditional and Simplified Chinese Characters
  8. Unity: GameObject, Class Object, new & Instantiate
  9. Unity: Start Screen with Glowing Animated Button
  10. Unity: C# Get & Set Modifier
  11. Unity: Delegates & Events
  12. Unity: File I/O, Read & Write Text File & PlayerPrefs
  13. Unity: Game Level Selection Screen
  14. Unity: Game Menu Screen & ScreenManager
  15. Unity: Encrypt and Decrypt Text File
  16. Unity: Options Menu Screen
  17. Unity: Convert Numbers Image to Custom Font

Unity - Card Game No.1 - Blackjack

  1. Unity: Blackjack Card Game - Part 1 (Full Game)
  2. Unity: Blackjack Card Game - Part 2
  3. Unity: Blackjack Card Game - Part 3
  4. Unity: Blackjack Card Game - Part 4
  5. Unity: Blackjack Card Game - Part 5
  6. Unity: Blackjack Card Game - Part 6
  7. Unity: Blackjack Card Game - Part 7

以下是預告-Coming soon!


Secret Weapon No.1

  1. Unity: Card Game No.2

Advanced Programming

  1. Unity: GPS Programming
  2. Unity: User Login System
  3. Unity: Augmented Reality (AR)

Secret Weapon No.2

  1. Unity: GPS & AR Application

第54節 - Java: Blackjack Card Game

這一節我會介紹Java的Blackjack(21點)程式設計,Java的Blackjack程式是一個文字版(text-based)紙牌遊戲,下一節會介紹LibGDX的Blackjack程式設計,LibGDX Blackjack程式是一個2D動畫版紙牌遊戲。

我在上幾節介紹過以下內容,這些內容會在本節用到:

  1. 第51節 - Java: toString() Method

  2. 第52節 - Java: Blackjack Shuffle Methods

執行結果:

以下是本節Java: Blackjack Card Game的執行結果:

Java Blackjack Class Diagram

以下是Java Blackjack的Class Diagram:

Java: Blackjack Card Game
  1. 首先建立一個Card Class,再建立一個Deck Class,用ArrayList類別把Card類別傳入Deck,建立cards物件;

  2. 最後建立三個Deck類別物件(mainDeck, playerDeck和dealerDeck)。

1) Card Class

以下會用圖片說明如何建立撲克牌的Card Class(類別):

Java: Blackjack Card Game

  1. 要建立一個全新的Class(類別),首先要訂立所有有關的Property(屬性)和Method(方法),Method則Action(動作)。 以撲克牌來說,它只有Property,而沒有Method,則沒有Action;

  2. 要訂立撲克牌的所有有關的Property(屬性),其實很簡單,大家只要問自己以下問題就可以:

    在這撲克牌上,我可以看見甚麼資料?

    1) 我看見"A";

    2) 我看見"Spade";

    3) 我看見"黑色";

    4) 我看見四角是""的。

  3. 但是以上四個屬性裡,只有兩個屬性是有用的,

    1) 我看見"A";

    2) 我看見"Spade";

  4. 因為Spade一定是黑色,沒有紅色,另外, 四角是圓的是一個沒有用的資料;

  5. 所以撲克牌只有兩個屬性,則Degree of Freedom (DOF) = 2

Java: Blackjack Card Game

  1. 我們的眼睛會自動把撲克牌的資料傳入大腦;

  2. 但是電腦程式就要我們主動把"A"和"Spade"傳入電腦,Java程式可以用getValue()和getSuit()方法主動把"A"和"Spade"傳入電腦;

  3. 最後用toString()方法顯示在屏幕上。

Java: Blackjack Card Game

  1. 以上是Card Class的Property(屬性)和Method(方法)。

    注意: 以上的getSuit()方法是不須要用到的,因為Blackjack紙牌遊戲是不須要考慮撲克牌的圖案,我把getSuit()方法放在Card類別內,是方便將來用在其他紙牌遊戲上,例如:鋤大D,十三張等等。

2) Deck Class

以下會用圖片說明如何建立撲克牌的Deck Class(類別):

Java: Blackjack Card Game

  1. 建立一個Deck類別物件(mainDeck);

  2. 建立一個addAllCards()方法,把52張撲克牌加入mainDeck物件內;

  3. 建立一個shuffle()方法,把52張撲克牌打亂;

  4. 建立一個Deck類別物件(playerDeck);

  5. 建立一個Deck類別物件(dealerDeck);

  6. 所有遊戲邏輯(Game Logic)部分,都會在MyDemo54.java的main()內進行,例如輸入玩家想投注的金額。

  7. 建立一個playerDeck的draw()方法,在mainDeck內抽出兩張撲克牌給playerDeck,

    在mainDeck物件內抽出(getCard())第一張撲克牌,然後刪除(removeCard())有關撲克牌,

    把剛抽出的撲克牌加入(addCard())playerDeck物件內;

  8. 建立一個dealerDeck的draw()方法,在mainDeck內抽出兩張撲克牌給dealerDeck,

    在mainDeck物件內抽出(getCard())第一張撲克牌,然後刪除(removeCard())有關撲克牌,

    把剛抽出的撲克牌加入(addCard())playerDeck物件內;

  9. 建立一個cardsTotalValue()方法,計算手上撲克牌的總和,最後用toString()方法顯示在屏幕上;

  10. 完成一局後,建立一個returnAllCards()方法,運用步驟7的getCard()和平removeCard()方法把playerDeck和dealerDeck的撲克牌抽出和刪除,最後運用addCard()方法把剛抽出的撲克牌放回mainDeck物件內。

Java: Blackjack Card Game
  1. 以上是Deck Class的Property(屬性)和Method(方法)。

程式部分

1. 建立Java Class

Java: Blackjack Card Game
  1. 首先建立Card、 Deck和MyDemo54 Java class。

2. 建立Card Class

Java: Blackjack Card Game

  1. 建立Card類別的兩個主要屬性(suit, value)。

  2. 建立getSuit()方法,它用來提取suit的數值。

  3. 建立getValue()方法,它用來提取value的數值。

  4. 建立toString()方法,它用來把Card提取出來的suit和value數值顯示在屏幕上。

3. 建立Deck Class

Java: Blackjack Card Game

  1. 建立一個Card類別的ArrayList物件(cards);

  2. 把Spade、Heart、Club和Diamond的Unicode傳入spade、heart、club和diamond的字串內;

  3. 建立cardSuit[]和cardValue[] Array,把撲克牌的圖案和數值傳入;

  4. 建立一個addAllCards()方法,把52張撲克牌加入mainDeck物件內;

  5. 建立一個shuffle()方法,把52張撲克牌打亂;

  6. 建立一個getCard()方法,用來提取撲克牌的屬性;

  7. 建立一個removeCard()方法,用來刪除Deck物件內的撲克牌;

  8. 建立一個addCard()方法,用來把撲克牌加入Deck物件內;

  9. 建立一個draw()方法,用來在Deck物件內抽出(getCard())一張撲克牌,然後刪除(removeCard())有關撲克牌,再把剛抽出的撲克牌加入(addCard())Deck物件內;

  10. 建立一個cardsTotalValue()方法,計算手上撲克牌的總和,最後用toString()方法顯示在屏幕上;

    注意,ACE的數值可以是"1"或"11"。

  11. 建立一個returnAllCards()方法,運用getCard()和平removeCard()方法把Deck物件內的撲克牌抽出和刪除,最後運用addCard()方法把剛抽出的撲克牌放回Deck物件內。

  12. toString()方法把撲克牌顯示在屏幕上。

    注意,我們用toString2()方法把dealerDeck的兩張撲克牌顯示在屏幕上是因為Dealer的第二張牌必須是隱藏。

4. 建立MyDemo54 Main Class

Java: Blackjack Card Game
  1. 建立一個Deck類別物件(mainDeck),再建立一個addAllCards()方法,把52張撲克牌加入mainDeck物件內;

  2. 用mainDeck.toString()方法把52張順序的撲克牌顯示在屏幕上;

  3. 建立一個shuffle()方法,把52張撲克牌打亂;

  4. 再用mainDeck.toString()方法把52張打亂的撲克牌顯示在屏幕上;

  5. 建立一個Deck類別物件(playerDeck)和(dealerDeck);

  6. 建立一個nextAction()方法,把所有遊戲邏輯(Game Logic)部分放在這裡;

  7. 所有遊戲邏輯(Game Logic)部分,都會在MyDemo54.java的main()內進行,例如輸入玩家想投注的金額 ;

    遊戲邏輯1 - 輸入玩家想投注的金額和其他用來比較的程式碼;

  8. 遊戲邏輯2 - 建立一個dealerDeck的draw()方法,在mainDeck內抽出兩張撲克牌給dealerDeck ;

    注意,我們用toString2()方法把dealerDeck的兩張撲克牌顯示在屏幕上是因為Dealer的第二張牌必須是隱藏。

  9. 遊戲邏輯3 - 建立一個playerDeck的draw()方法,在mainDeck內抽出兩張撲克牌給playerDeck ;

  10. 遊戲邏輯4 - 輸入玩家下一步,例如:Hit(要牌)、 Stand(不要牌)或Bust(爆煲);

  11. 遊戲邏輯5 - 電腦自動執行Dealer的決定,如果Dealer的撲克牌總和小過17,就Hit(要牌),如果Dealer的撲克牌總和等於或大過17,就Stand(不要牌);

  12. 遊戲邏輯6 - 比較playerDeck和dealerDeck手上撲克牌的總和,決定誰勝誰負,最後計算勝負後的金額;

  13. 遊戲邏輯7 - 顯示勝負後的金額;

  14. 遊戲邏輯8 - 問玩家是否繼續;

  15. 遊戲邏輯9 - 完成一局後,建立一個returnAllCards()方法,運用getCard()和平removeCard()方法把playerDeck和dealerDeck的撲克牌抽出和刪除,最後運用addCard()方法把剛抽出的撲克牌放回mainDeck物件內;

  16. 如果金額小過"零",遊戲完結(Game Over)。

5. 執行程式結果

Java: Blackjack Card Game
  1. 以上是程式執行的結果,首先列出順序的52張撲克牌,再列出打亂後的52張撲克牌,然後電腦就會問玩家下注。

Download above code and sample pictures here!