简单的控制台梭哈游戏

简单的控制台梭哈游戏,目前还没有完善,等到学完其余的知识点后继续更新!

<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>


有些功能还木有完善,后期继续更新!










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值