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);
}
}
}
}