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

第52節 - Java: Blackjack Shuffle Methods

這一節我會介紹Java的Blackjack Shuffle Methods(洗牌方法),我會介紹以下三種方法:

  1. Method 1 - Knuth Shuffle Method (a.k.a Fisher–Yates Shuffle Method)

  2. Method 2 - Fisher–Yates Modern Shuffle Method

  3. Method 3 - Java Build-in Collections Shuffle Method

為甚麼要學Java的Shuffle Methods?

因為我會在下幾節開始介紹Java的Blackjack紙牌遊戲(文字版),而這文字版就會用到shuffle方法。

注意: 當我們掌握了Java Blackjack(文字版)的程式設計技考後,我會在下幾節介紹如何把Java的Blackjack紙牌遊戲(文字版)改寫為最後的LibGDX的Blackjack紙牌遊戲(2D動畫版)。

Method 1 - Knuth Shuffle Method (a.k.a Fisher–Yates Shuffle Method)

最早提出這個Shuffle方法的是Ronald A. FisherFrank Yates,之後由Donald Knuth實作,所以叫做Knuth Shuffle Method,這個方法主要在原始數組中隨機取一個之前沒取過的數字到新的數組中:

  1. 初始化數組,按序(升序或者降序)排列;

  2. 從還沒處理的數組(假如還剩k個)中,隨機產生一個(0, k)之間的數字p(假設數組從0開始);

  3. 從剩下的k個數中把第p個數取出(還剩k-1個);

  4. 重複步驟2和3直到數字全部取完;

  5. 從步驟3取出的數字序列便是一個打亂了的數列。

Java: Blackjack Shuffle Methods
  1. 建立一個cards[] Array (陣列),大小為0 - 51,則Array index(索引)由cards[0]至cards[51]共52個;

  2. 隨機產生一個(0, 51)之間的數字p(例如:7),暫時儲存在tempCards[0]上;

  3. 把第p個數(a[7]=8)刪除,(還剩52-1=51個);

  4. 重複步驟2和3直到數字全部取完;

  5. 最後把tempCards[]陣列複製回到收cards[]陣列上,便是一個打亂了的數列。

程式部分

Java: Blackjack Shuffle Methods
  1. 建立一個shuffle1()方法;

  2. 在main()主程式內建立一個ArrayList類別的物件(cards);

    注意: 我在第27節 - Java: Array, Arrays, List, ArrayList & LibGDX: Array介紹過List和ArrayList的用法和分別,因為ArrayList類別內有不同的方法(例如:get(), add(), remove()等等),方便我們使用。

  3. 把0 - 51數值存入cards陣列內,則Array index(索引)由cards[0]至cards[51]共52個;

  4. 把cards陣列存入新增的Shuffle1類別的start()方法內,最後複製回到收cards陣列上,便是一個打亂了的數列。

執行程式結果

Java: Blackjack Shuffle Methods
  1. 把0 - 51數值存入cards陣列內,則Array index(索引)由cards[0]至cards[51]共52個;

  2. 把cards陣列存入新增的Shuffle類別的start()方法內,顯示tempCards陣列的執行結果;

  3. 最後複製回到收cards陣列上,執行結果和tempCards陣列一樣。

Method 2 - Fisher–Yates Modern Shuffle Method

Fisher–Yates Modern Shuffle Method(現代版),是專供電腦使用,是由Richard Durstenfeld於1964年提出和由Donald Knuth普及:

  1. 初始化數組,按序(升序或者降序)排列;

  2. 從還沒處理的數組(假如還剩k個)中,隨機產生一個(0, k)之間的數字p(假設數組從0開始);

  3. 把步驟2的數字p和第1個數字交換(或把步驟2的數字p和最後一個數字交換也可以);

  4. 重複步驟2,再把數字p和第2個數字交換(或把步驟2的數字p和尾二數字交換也可以);

  5. 重複步驟2和3直到數字全部交換完,便是一個打亂了的數列。

Java: Blackjack Shuffle Methods
  1. 建立一個cards[] Array (陣列),大小為0 - 51,則Array index(索引)由cards[0]至cards[51]共52個;

  2. 隨機產生一個(0, 51)之間的數字p(例如:7),把a[7]和第1個數字a[0]交換;

  3. 隨機產生一個(0, 51)之間的數字p(例如:3),把a[3]和第2個數字a[1]交換;

  4. 重複步驟2和3直到數字全部交換完,便是一個打亂了的數列;

  5. 最後把a[]陣列複製回到收cards[]陣列上,便是一個打亂了的數列。

程式部分

Java: Blackjack Shuffle Methods
  1. 建立一個shuffle2()方法;

  2. 在main()主程式內建立一個ArrayList類別的物件(cards);

    注意: 我在第27節 - Java: Array, Arrays, List, ArrayList & LibGDX: Array介紹過List和ArrayList的用法和分別,因為ArrayList類別內有不同的方法(例如:get(), add(), remove()等等),方便我們使用。

  3. 把0 - 51數值存入cards陣列內,則Array index(索引)由cards[0]至cards[51]共52個;

  4. 把cards陣列存入新增的Shuffle2類別的start()方法內,最後複製回到收cards陣列上,便是一個打亂了的數列。

執行程式結果

Java: Blackjack Shuffle Methods
  1. 把0 - 51數值存入cards陣列內,則Array index(索引)由cards[0]至cards[51]共52個;

  2. 把cards陣列存入新增的Shuffle類別的start()方法內,顯示a陣列的執行結果;

  3. 最後複製回到收cards陣列上,執行結果和a陣列一樣。

Method 3 - Java Build-in Collections Shuffle Method

方法3運用了解Java預設的Shuffle方法,只須一行程式碼,十分方便。

程式部分

Java: Blackjack Shuffle Methods
  1. 加入import java.util.Collections;

  2. 執行Collections.shuffle()方法便可。

執行程式結果

Java: Blackjack Shuffle Methods
  1. 把0 - 51數值存入cards陣列內,則Array index(索引)由cards[0]至cards[51]共52個;

  2. 把cards陣列存入shuffle()方法內,顯示cards陣列的執行結果;

Download above code here!