简单的控制台梭哈游戏,目前还没有完善,等到学完其余的知识点后继续更新!
<span style="font-size:18px;">package com.suoha.game;
import java.util.Collections;
import java.util.LinkedList;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
import com.arrayutils.search.ArrayUtils;
import com.suoha.compare.Card;
import java.util.Scanner;
import java.io.File;
public class SHgame{
//定义该游戏最多支持的玩家
private final static int PLAY_NUM=5;
//定义扑克牌的所有花色和数值
public static String[] types={"方块","梅花","红心","黑桃"};
public static String[] values={"2","3","4","5",
"6","7","8","9",
"10","J","K","A"};
//cards是一局游戏中剩下的扑克牌
private List<Card> cards=new LinkedList<Card>();
//定义所有的玩家
private static String[] players=new String[PLAY_NUM];
//定义所有玩家手上的扑克牌
private static List<Card>[] playersCards=new List[PLAY_NUM];
private boolean add;
/*
* 初始化扑克牌,放入52张扑克牌
* 并且使用shuffle方法将他们按随机顺序排列
*/
public void initCards(){
for(int i=0;i<types.length;i++)
{
for(int j=0;j<values.length;j++)
{
cards.add(new Card(types[i],values[j]));
}
}
//随机排列
Collections.shuffle(cards);
}
/*
* 初始化玩家,为每个玩家分配用户名
*/
public void initPlayer(String...names)
{
if(names.length>PLAY_NUM||names.length<2)
{
System.out.println("玩家数量不对!");
return;
}
else
{
//初始化玩家用户名
for(int i=0;i<names.length;i++)
{
players[i]=names[i];
//playersCards[i]=new LinkedList<Card>();
}
}
}
/*
* 初始化玩家手上的扑克牌,开始游戏时每个玩家手上的扑克牌为空
* 程序用一个长度为0的LinkedList来表示
*/
public void initPlayerCards()
{
for (int i = 0; i < players.length ; i++ )
{
if (players[i] != null && !players[i].equals(""))
{
playersCards[i] = new LinkedList<Card>();
}
}
}
/*
* 派发扑克牌
* @param first最先派给谁
*/
public void deliverCard(String first)
{
//调用ArrayList工具类中的search方法
//查询出指定元素在数组中的索引
int firstPos=ArrayUtils.search(first,players);
for(int i=firstPos;i<PLAY_NUM;i++)
{
if(players[i]!=null)
{
playersCards[i].add(cards.get(0));
cards.remove(0);
}
}
//依次给位于指定玩家之前的每个玩家派发扑克牌
for(int i=0;i<firstPos;i++)
{
if(players[i]!=null)
{
playersCards[i].add(cards.get(0));
cards.remove(0);
}
}
}
/*
* 输出玩家手上的扑克牌
* 实现该方法时,应该控制每个玩家看不到别人的的第一张牌,但此处没有增加该功能
*/
public void showPlayerCards()
{
for(int i=0;i<PLAY_NUM;i++)
{
//当该玩家不为空时
if(players[i]!=null)
{
//输出玩家
System.out.print(players[i]+": ");
//如果第i个玩家的名字不是自己
//遍历输出玩家手上的扑克牌
for(int j=0;j<playersCards[i].size();j++)
{
//如果第一玩家的名字不是自己,则隐藏
if(j==0&&!players[i].equals("自己"))
{
System.out.print("▅"+"\t");
}
else
//如果是第一个玩家是自己,则输出
System.out.print(playersCards[i].get(j)+" ");
}
System.out.print("\n");
}
}
System.out.print("\n");
}
//比较参与游戏的所有玩家手上的名牌的大小,除了第一张的大小
//如果isMing为TRUE的话,意味着不比较大小
private static int compareMingCard(boolean isMing)
{
/*
* 算法描述:
所有五张牌(都是同一花色)的组合,按以下秩序,由大至小排行分为不同牌型:
四条:有四张同一点数的牌。 例: 4 4 4 4 9
满堂红:三张同一点数的牌,加一对其他点数的牌。 例: 8 8 8 K K
顺子:五张顺连的牌。 例: 6 5 4 3 2
三条:有三张同一点数的牌。 例: 7 7 7 K 2
一对:两张相同点数的牌。 例: 9 9 A J 4
无对:不能排成以上组合的牌,以点数决定大小。例: A 10 9 5 4
若牌型一样则利用数字决定胜负。
数字的顺序(大至小)为: A,K,Q,J,10,9,8。
*/
//如果玩家手上的都是散牌,需要找到每个玩家手上最大的牌
//该数组用于保存每个玩家手上最大的牌
Card[] maxcard=new Card[PLAY_NUM];
for(int i=0;i<PLAY_NUM;i++)
{
//如果第i个玩家的名字不为空,表明玩家正在参与游戏
if(players[i]!=null)
{
//如果是明牌,意味着从第二张开始判断,否则从第一张
int fromIndex=isMing?1:0;
maxcard[i]=playersCards[i].get(fromIndex);
//依次循环第i个玩家手上的j到最后一张牌
for(int j=fromIndex+1,len=playersCards[i].size();j<len;j++)
{
if(maxcard[i].compareTo(playersCards[i].get(j))<0)
maxcard[i]=playersCards[i].get(j);
}
}
}
Card max=maxcard[0];//假设第一个人手上最大牌最大
int maxIndex=0;
for(int i=1,len=maxcard.length;i<len;i++)
{
if(players[i]!=null)
{
if(max.compareTo(maxcard[i])<0)
{
max=maxcard[i];
maxIndex=i;
}
}
}
return maxIndex;
}
public void showAllcards()
{
for(Card card:cards)
System.out.print(card+" ");
}
/*
* @param args
*/
public static void main(String[] args) {
SHgame sh=new SHgame();
sh.initCards();
sh.initPlayer("自己" , "小明","小红","小青");
//sh.showPlayerCards();
sh.initPlayerCards();
sh.showAllcards();
System.out.print("\n");
sh.deliverCard("自己");
sh.deliverCard("自己");
sh.showPlayerCards();
for(int i=0;i<3;i++)
{
Scanner sc=new Scanner(System.in);
int maxIndex=sh.compareMingCard(true);
//如果我的牌面最大
if(maxIndex==0)
{
System.out.println("您的牌面最大,请下注!");
String account=sc.nextLine();
System.out.println("我的下注:"+account);
}
//否則就是別人的牌面最大
else
{
System.out.println(sh.players[maxIndex]+"下注:"+
ThreadLocalRandom.current().nextInt(100,300)+",您是否跟注?");
String flag=sc.nextLine();
if(!flag.equalsIgnoreCase("y"))
{
System.exit(0);
}
}
sh.deliverCard("自己");
sh.showPlayerCards();
}
}
}</span>
<span style="font-size:18px;">package com.arrayutils.search;
public class ArrayUtils {
/**
* 定义一个工具方法,工具方法从字符串数组中找到对应的字符串元素的位置
* @param target 搜索的字符串
* @param array 搜索的数组
* @return 目标字符串出现的位置,-1表明找不到
*/
public static int search(String target, String[] array)
{
for (int i = 0 ; i < array.length ; i++ )
{
if (array[i] != null && array[i].equals(target))
{
return i;
}
}
return -1;
}
}</span>
<span style="font-size:18px;">package com.suoha.compare;
import com.arrayutils.search.ArrayUtils;
import com.suoha.game.SHgame;
public class Card implements Comparable<Card>
{
private String type;
private String value;
public Card(String type,String value)
{
this.type=type;
this.value=value;
}
public int compareTo(Card other) {
//牌面值的大小与其在数组中的索引呈正相关
if(ArrayUtils.search(this.value,SHgame.values)
>ArrayUtils.search(other.value,SHgame.values))
{
return 1;
}
if(ArrayUtils.search(this.value,SHgame.values)
<ArrayUtils.search(other.value,SHgame.values))
{
return -1;
}
else
{//如果牌面值相等,则比较牌面的类型,同理,牌面类型也是与数组中的素引呈正相关
if(ArrayUtils.search(this.type,SHgame.types)
>ArrayUtils.search(other.type,SHgame.types))
{
return 1;
}
if(ArrayUtils.search(this.type,SHgame.types)
<ArrayUtils.search(other.type,SHgame.types))
{
return -1;
}
else
return 0;
}
}
@Override
public String toString()
{
return type+value;
}
}
</span>
有些功能还木有完善,后期继续更新!