新手上路,跌跌碰碰,看完一些視頻,最終實現了鬥地主模擬發牌!
記錄一下 Java 的學習日程
寫完這些,發現Java 真的沒python簡潔, 甚至一些簡單的功能在java中實現變得還有一點困難, 比如隨機數組 和翻轉數組, 在python中就是一句話做到的事情,。
遊戲流程圖:
在java中, 我們肯定不可能直接把每一張牌的大小和花色放入數組中吧,這樣複雜了, 54張牌, 去掉大小王中的52張牌, 剛好可以整除13 求餘13
那麼我們就利用這個方式,建立一下數組, 來判斷這張牌的花色和數值;
如下代碼:
String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"};
String[] ranks = {"Ace", "2", "3", "4", "5", "6", "7", "8"
, "9","10", "Jack", "Queen", "King"};
// Cradindex 是 這張牌的位置
suit = suits[CardIndex / 13];
rank = ranks[CardIndex % 13];
如果不小心選到了大小王, 這樣的話,用上面的代碼就會出現數組越界的問題,這樣修改:
// 優先判斷大小鬼
if (CardIndex <= 51) {
suit = suits[CardIndex / 13];
rank = ranks[CardIndex % 13];
}else if (CardIndex == 52)
{
suit = "Red";
rank = "BigGhost";
}else if (CardIndex == 53)
{
suit = "Black";
rank = "SmallGhost";
}
我們要先判斷大小王的存在, 如果存在那麼直接給值, 這樣就可以避免這樣的錯誤。
遊戲代碼:
整個遊戲 分爲 初始化, 洗牌, 發牌 三個階段, 至於出牌,以及遊戲如何勝利, 現在我還不會, 還在學習中。。
初始化:
定義了數組, 要給數組進行順序賦值, 不然默認爲 0 ,然後調用其他函數
public static void main(String[] args) {
// 初始化紙牌
int allcrad = 54;
int[] card = new int[allcrad];
for (int i = 0; i < card.length; i++) {
card[i] = i;
}
// 初始化洗牌 2次
ruffle(card, 2);
System.out.println("正在模擬鬥地主發牌-----");
// 發牌 包含地主和農民一起發牌
deal(card);
}
洗牌模塊:
洗牌 用了隨機調換 和 數組逆序 雙重洗牌 更健康。
public static void ruffle(int[] card, int number){
// 洗牌操作
// number ; 洗牌次數
int k = card.length;
for (int n =0; n <number; n++)
{
for (int i =0,j = k - 1; i< j; i++, j--){
int temp = card[i];
card[i] = card[j];
card[j] = temp;
}
// 打亂排序
for (int i = 0; i < card.length; i++)
{
// 生成一個隨機數 然後取整
int index = (int) (Math.random() * card.length);
// 隨機數 22交換
int temp;
temp = card[i];
card[i] = card[index];
card[index] = temp;
}
}
}
發牌模塊:
在這裏 用函數 把發牌 分離出來, 在deal函數就更容易識別
public static void fun(int[] card, int number, int index){
String[] mycard = new String[number];
for (int i = 0; i < number; i++) {
// 將牌的下標 傳給函數 判斷牌的花色和數值
// 然後加入mycard中
String[] k = judge(card[i + index], false);
mycard[i] = k[0] + "-" + k[1];
}
Arrays.sort(mycard);
System.out.println("紙牌如下:");
int i = 0;
for (String c : mycard) {
System.out.print(c + " ");
i++;
if (i % 6 == 0) {
System.out.println();
}
}
}
public static void deal(int[] card) {
// 模擬發牌
System.out.println("---------------------------------");
System.out.println("正在爲地主發牌------");
fun(card, 20, 0);
System.out.println();
System.out.println("---------------------------------");
System.out.println("正在爲農民甲發牌------");
// 正在爲農民甲發牌
fun(card, 17, 20);
System.out.println();
System.out.println("---------------------------------");
System.out.println("正在爲農民乙發牌------");
// 正在爲農民乙發牌
fun(card, 17, 37);
System.out.println();
System.out.println("---------------------------------");
}
判斷模塊:
在這裏, 對於java的函數返回, 很衝突, return 也就只能返回一個值, 所以我這裏只能用數組 將二個值返回, print 是一個布爾類型, true則打印不返回值。
public static String[] judge(int CardIndex, boolean print){
// 判斷這張牌的花色和數值
// 返回參數 還是直接打印
String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"};
String[] ranks = {"Ace", "2", "3", "4", "5", "6", "7", "8"
, "9","10", "Jack", "Queen", "King"};
String suit = "";
String rank = "";
// System.out.println(CardIndex);
// 優先判斷大小鬼
if (CardIndex <= 51) {
suit = suits[CardIndex / 13];
rank = ranks[CardIndex % 13];
}else if (CardIndex == 52)
{
suit = "Red";
rank = "BigGhost";
}else if (CardIndex == 53)
{
suit = "Black";
rank = "SmallGhost";
}
if (print){
System.out.println("The card number " + CardIndex +
"suit is "+ suit + "rank is " + rank);
// 定義了String[] 函數分支一定要有出口
return null;
}
else {
// System.out.println(suit + rank);
// return 不能簡單返回多個值
String[] values = {suit, rank};
return values;
}
}
後記:
Java挺燒腦子的, 有一點難搞!
全部代碼:
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
public class 模擬鬥地主發牌 {
public static void fun(int[] card, int number, int index){
String[] mycard = new String[number];
for (int i = 0; i < number; i++) {
// 將牌的下標 傳給函數 判斷牌的花色和數值
// 然後加入mycard中
String[] k = judge(card[i + index], false);
mycard[i] = k[0] + "-" + k[1];
}
Arrays.sort(mycard);
System.out.println("紙牌如下:");
int i = 0;
for (String c : mycard) {
System.out.print(c + " ");
i++;
if (i % 6 == 0) {
System.out.println();
}
}
}
public static void deal(int[] card) {
// 模擬發牌
System.out.println("---------------------------------");
System.out.println("正在爲地主發牌------");
fun(card, 20, 0);
System.out.println();
System.out.println("---------------------------------");
System.out.println("正在爲農民甲發牌------");
// 正在爲農民甲發牌
fun(card, 17, 20);
System.out.println();
System.out.println("---------------------------------");
System.out.println("正在爲農民乙發牌------");
// 正在爲農民乙發牌
fun(card, 17, 37);
System.out.println();
System.out.println("---------------------------------");
}
public static void ruffle(int[] card, int number){
// 洗牌操作
// number ; 洗牌次數
int k = card.length;
for (int n =0; n <number; n++)
{
for (int i =0,j = k - 1; i< j; i++, j--){
int temp = card[i];
card[i] = card[j];
card[j] = temp;
}
// 打亂排序
for (int i = 0; i < card.length; i++)
{
// 生成一個隨機數 然後取整
int index = (int) (Math.random() * card.length);
// 隨機數 22交換
int temp;
temp = card[i];
card[i] = card[index];
card[index] = temp;
}
}
}
public static String[] judge(int CardIndex, boolean print){
// 判斷這張牌的花色和數值
// 返回參數 還是直接打印
String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"};
String[] ranks = {"Ace", "2", "3", "4", "5", "6", "7", "8"
, "9","10", "Jack", "Queen", "King"};
String suit = "";
String rank = "";
// System.out.println(CardIndex);
// 優先判斷大小鬼
if (CardIndex <= 51) {
suit = suits[CardIndex / 13];
rank = ranks[CardIndex % 13];
}else if (CardIndex == 52)
{
suit = "Red";
rank = "BigGhost";
}else if (CardIndex == 53)
{
suit = "Black";
rank = "SmallGhost";
}
if (print){
System.out.println("The card number " + CardIndex +
"suit is "+ suit + "rank is " + rank);
// 定義了String[] 函數分支一定要有出口
return null;
}
else {
// System.out.println(suit + rank);
// return 不能簡單返回多個值
String[] values = {suit, rank};
return values;
}
}
public static void main(String[] args) {
// 初始化紙牌
int allcrad = 54;
int[] card = new int[allcrad];
for (int i = 0; i < card.length; i++) {
card[i] = i;
}
// 初始化洗牌 2次
ruffle(card, 2);
System.out.println("正在模擬鬥地主發牌-----");
// 發牌 包含地主和農民一起發牌
deal(card);
}
}