无标题文档

21点游戏Java实现

这是21点四人游戏,开局没人发两张牌,一张明牌和一张暗牌,然后依次询问每个人是否要牌(输入false为要牌),当所有人输入true时,进行牌类比较,确定输赢

package point21;
import java.util.Scanner;
public class point21_escape {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		APuck temp1;
		APuck temp2;
		APuck temp3;
		APuck temp4;
		System.out.println("欢迎来到《有间竞技场之电锯求生》");
		System.out.println("竞技规则:你们四个人面前有一把电锯,由电脑操控,赢了的人才能活下去,祝你好运");
		System.out.println("游戏开始!");
		temp1=new APuck();
		temp2=new APuck();
		temp3=new APuck();
		temp4=new APuck();
		Computer computer=new Computer();//给四个人各发一张暗牌和明牌
		Puck.makePuck();
		Player p1=new Player();//将Player...,Computer,Puck实例化
		Player p2=new Player();
		Player p3=new Player(); 
		Player p4=new Player();
		System.out.println("给四个人各发一张暗牌和明牌");
		computer.initial(p1,p2,p3,p4);
		temp1=p1.gettingHiden();
		System.out.println("p1的暗牌是: "+temp1.type+temp1.content+"(仅自己可见)");
		System.out.print("p1的明牌是: ");
		for(int j=0;j<p1.n;j++)
		{
			System.out.print(p1.appear[j].type+p1.appear[j].content+" ");
		}
		System.out.println("  "+p1.countAppear+"点"+"\n");
		temp2=p2.gettingHiden();
		System.out.println("p2的暗牌是: "+temp2.type+temp2.content+"(仅自己可见)");
		System.out.print("p2的明牌是: ");
		for(int j=0;j<p2.n;j++)
		{
			System.out.print(p2.appear[j].type+p2.appear[j].content+" ");
		}
		System.out.println("  "+p2.countAppear+"点"+"\n");
		temp3=p3.gettingHiden();
		System.out.println("p3的暗牌是: "+temp3.type+temp3.content+"(仅自己可见)");
		System.out.print("p3的明牌是: ");
		for(int j=0;j<p3.n;j++)
		{
			System.out.print(p3.appear[j].type+p3.appear[j].content+" ");
		}
		System.out.println("  "+p3.countAppear+"点"+"\n");
		temp4=p4.gettingHiden();
		System.out.println("p4的暗牌是: "+temp4.type+temp4.content+"(仅自己可见)");
		System.out.print("p4的明牌是: ");
		for(int j=0;j<p4.n;j++)
		{
			System.out.print(p4.appear[j].type+p4.appear[j].content+" ");
		}
		System.out.println("  "+p4.countAppear+"点"+"\n");
		while(p1.state==false||p2.state==false||p3.state==false||p4.state==false)
		{

			System.out.println("p1要牌or停牌?(输入true为停牌)");
			p1.state=in.nextBoolean();
			if(p1.state==true)
			{
				System.out.println("pass,不要");
			}
			else 
			{
				if(p1.gettingCount()<=21)
				{
					p1.putAppear(computer.rand());
				}
				else
				{
					while(p1.gettingCountA()>0&&p1.gettingCount()>21)
					{
						p1.settingCount();
					}
					if(p1.gettingCount()>21)
					{
						System.out.println("爆牌了,不能再要牌");
						p1.state=true;
					}
					else	
					{
						p1.putAppear(computer.rand());
					}
				}
			}
			
			System.out.print("p1的明牌是: ");
			for(int j=0;j<p1.n;j++)
			{
				System.out.print(p1.appear[j].type+p1.appear[j].content+" ");
			}
			System.out.println("  "+p1.countAppear+"点");
			System.out.println("p1的暗牌是: "+temp1.type+temp1.content+"(仅自己可见)"+"\n");
			System.out.println("p2要牌or停牌?(输入true为停牌)");
			p2.state=in.nextBoolean();
			if(p2.state==true)
			{
				System.out.println("pass,不要");
			}
			else 
			{
				if(p2.gettingCount()<=21)
				{
					p2.putAppear(computer.rand());
				}
				else
				{
					while(p2.gettingCountA()>0&&p2.gettingCount()>21)
					{
						p2.settingCount();
					}
					if(p2.gettingCount()>21)
					{
						System.out.println("爆牌了,不能再要牌");
						p2.state=true;
					}
					else	
					{
						p2.putAppear(computer.rand());
					}
				}
			}
			System.out.print("p2的明牌是: ");
			for(int j=0;j<p2.n;j++)
			{
				System.out.print(p2.appear[j].type+p2.appear[j].content+" ");
			}
			System.out.println("  "+p2.countAppear+"点");
			System.out.println("p2的暗牌是: "+temp2.type+temp2.content+"(仅自己可见)"+"\n");
			System.out.println("p3要牌or停牌?(输入true为停牌)");
			p3.state=in.nextBoolean();
			if(p3.state==true)
			{
				System.out.println("pass,不要");
			}
			else 
			{
				if(p3.gettingCount()<=21)
				{
					p3.putAppear(computer.rand());
				}
				else
				{
					while(p3.gettingCountA()>0&&p3.gettingCount()>21)
					{
						p3.settingCount();
					}
					if(p3.gettingCount()>21)
					{
						System.out.println("爆牌了,不能再要牌");
						p3.state=true;
					}
					else	
					{
						p3.putAppear(computer.rand());
					}
				}
			}			
			System.out.print("p3的明牌是: ");
			for(int j=0;j<p3.n;j++)
			{
				System.out.print(p3.appear[j].type+p3.appear[j].content+" ");
			
			}
			System.out.println("  "+p3.countAppear+"点");
			System.out.println("p3的暗牌是: "+temp3.type+temp3.content+"(仅自己可见)"+"\n");
			System.out.println("p4要牌or停牌?(输入true为停牌)");
			p4.state=in.nextBoolean();
			if(p4.state==true)
			{
				System.out.println("pass,不要");
			}
			else 
			{
				if(p4.gettingCount()<=21)
				{
					p4.putAppear(computer.rand());
				}
				else
				{
					while(p4.gettingCountA()>0&&p4.gettingCount()>21)
					{
						p4.settingCount();
					}
					if(p4.gettingCount()>21)
					{
						System.out.println("爆牌了,不能再要牌");
						p4.state=true;
					}
					else	
					{
						p4.putAppear(computer.rand());
					}
				}
			}
		
			System.out.print("p4的明牌是: ");
			for(int j=0;j<p4.n;j++)
			{
				System.out.print(p4.appear[j].type+p4.appear[j].content+" ");
			}
			System.out.println("  "+p4.countAppear+"点");
			System.out.println("p4的暗牌是: "+temp4.type+temp4.content+"(仅自己可见)"+"\n");
		}
		System.out.println("公布所有人的暗牌:");
		System.out.println("player1暗牌为:"+p1.gettingHiden().type+p1.gettingHiden().content);
		System.out.println("player2暗牌为:"+p2.gettingHiden().type+p2.gettingHiden().content);
		System.out.println("player3暗牌为:"+p3.gettingHiden().type+p3.gettingHiden().content);
		System.out.println("player4暗牌为:"+p4.gettingHiden().type+p4.gettingHiden().content);
		computer.compare(p1,p2, p3,p4);
		in.close();	
	}
}

package point21;

public class Computer {
	public APuck rand() {
		int i;
		int j;
		do {
			j=(int)Math.floor(Math.random()*13);
			i=(int)Math.floor(Math.random()*4);
			
		}while(Puck.stock[i][j].judge!=false);
		Puck.stock[i][j].judge=true;
		return Puck.stock[i][j];
	}
	public void initial(Player p1,Player p2,Player p3,Player p4) {//各发两张牌,一张暗牌一张明牌
		p1.settingHiden(rand());
		p2.settingHiden(rand());
		p3.settingHiden(rand());
		p4.settingHiden(rand());
		p1.putAppear(rand());
		p2.putAppear(rand());
		p3.putAppear(rand());
		p4.putAppear(rand());
	}
	
	public void compare(Player p1,Player p2,Player p3,Player p4 ) {
		//当所有人都选择停牌时,进行牌类比较,确定输赢
		
		
		
			System.out.println("player1的总点数为:"+p1.gettingCount());
			System.out.println("player2的总点数为:"+p2.gettingCount());
			System.out.println("player3的总点数为:"+p3.gettingCount());
			System.out.println("player4的总点数为:"+p4.gettingCount());
			int[][] temp1=new int[4][2];
			int count=0;
			
			if(p1.gettingCount()<=21)//找出小于等于21的放入temp1
			{
				temp1[count][0]=0;
				temp1[count++][1]=p1.gettingCount();
			}
			if(p2.gettingCount()<=21)
			{
				temp1[count][0]=1;
				temp1[count++][1]=p2.gettingCount();
			}
			if(p3.gettingCount()<=21)
			{
				temp1[count][0]=2;
				temp1[count++][1]=p3.gettingCount();
			}
			if(p4.gettingCount()<=21)
			{
				temp1[count][0]=3;
				temp1[count++][1]=p4.gettingCount();
			}
			if(count==0)
			{
				System.out.println("所有玩家都爆牌,恭喜同归");
			}
			else
			{
				int largest=0;
				for(int i=0;i<count;i++)//找出数组中最大的一个数
				{
					if(largest<=temp1[i][1])
					{
						largest=temp1[i][1];
					}
					
				}
				
				for(int i=0;i<count;i++)
				{
					if(temp1[i][1]==largest)
					{
						switch (temp1[i][0])
						{
							case 0:
								System.out.println("恭喜player1获胜,其他人头请闭眼……^0^");
								break;
							case 1:
								System.out.println("恭喜player2获胜,其他人头请闭眼……^v^");
								break;
							case 2:
								System.out.println("恭喜player3获胜,其他人头请闭眼……^o^");
								break;
							case 3:
								System.out.println("恭喜player4获胜,其他人头请闭眼……^_^");
								break;
						}
					}
				}
			}	
	}
}

package point21;

public class Player {
	public boolean state;//要牌或停牌的状态,默认为false,一旦选择停牌,则转为true
	public APuck[] appear;//明牌
	public int countAppear;//明牌点数
	public  int n;//明牌数量计数器
	private int countA;
	private APuck hiden;//暗牌
	private int countHiden;//暗牌点数
	private int count;//总点数
	public Player(){
		appear=new APuck[11];
	}
	public int gettingCount()
	{
		return count;
	}
	public APuck gettingHiden()
	{
		return hiden;
	}
	public void settingHiden(APuck stock) {//设置暗牌
		hiden=stock;
		countHiden=stock.point;//设置暗牌点数
		
	}
	public void settingCount(APuck stock)//统计明牌点数和总点数,每得到一张明牌都需要调用此方法
	{	
		countAppear=countAppear+stock.point;
		count=countHiden+countAppear;
		
	}
	public void settingCount()//统计明牌点数和总点数,每得到一张明牌都需要调用此方法
	{	
		countAppear=countAppear-10;
		count=count-10;
		countA--;
	}
	
	public void putAppear(APuck stock) {
		//要牌方法,随机从一副牌中获取一张没有使用的牌给调用者,如果已经超过21点则禁止再次要牌
		if(stock.content=="A")
		{
			countA++;
		}
		appear[n]=stock;
		n++;
		settingCount(stock);
	}
	public int gettingCountA() {
		return countA;
	}
}

package point21;

public class APuck{//单张牌类
	protected String content;
	protected String type;
	public boolean judge;
	public int point;
}

package point21;

public class Puck {//一副牌类
	public static APuck[][] stock;
	private static String[] contents;
	private static String[] types;
	public static void makePuck() {
		stock=new APuck[4][13];
		contents=new String[] {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
		types=new String[] {"红桃","方块","梅花","黑桃"};
		for(int i=0;i<4;i++)
			for(int j=0;j<13;j++)
			{
				stock[i][j]=new APuck();
				stock[i][j].type=types[i];
				stock[i][j].content=contents[j];
				if(stock[i][j].content=="J" || stock[i][j].content=="Q" || stock[i][j].content=="K")
				{
					stock[i][j].point=10;
				}
				else if(stock[i][j].content=="A")
				{
					stock[i][j].point=11;
				}
				else {
					stock[i][j].point=Integer.parseInt(stock[i][j].content);
				}
			}
	}
}

21点游戏面向对象实现21点游戏面向对象实现21点游戏面向对象实现

相关文章: