新手上路,跌跌碰碰,看完一些视频,最终实现了斗地主模拟发牌!
记录一下 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);
}
}