所有的代码放在一个文件里就可以运行,文件名是:入口类名.java
卡牌的比较是通过将点数和花色放在不同的数组里,然后利用数组下标来比较大小
洗牌是通过不断将第一个位置的卡牌插入随机位置来实现的
用户的ID设定必须是数字且不能相同
下边是代码,注释还是很完备的,有问题留言,我们一起交流一下
PS:我再也不发原创了,太麻烦了T_T
入口类
import java.util.*;
public class PalyCard
{
public static void main(String[] args)
{
Game gm=new Game();
gm.setCards();//获取卡牌
gm.shuffle();//洗牌
gm.setPlayers();//获取用户
gm.dealCards();//发牌
gm.playCards();//开始游戏
gm.showCards();//展示卡牌
}
}
游戏主体
class Game
{
private List<Card> cards;
private List<Player> players;
Game(){
cards=new ArrayList<Card>();
players=new ArrayList<Player>();
}
//初始化卡牌
void setCards(){
System.out.println("-----------创建扑克牌--------------");
String[] suits={"黑桃","红桃","梅花","方片"};//花色
String[] numbers={"2","3","4","5","6","7","8","9","10",
"J","Q","K","A"};//点数
for(int i=0;i<suits.length;i++){
for(int j=0;j<numbers.length;j++){
cards.add(new Card(suits[i],numbers[j]));
}
}
System.out.println("-----------扑克牌创建成功!--------------");
System.out.println(cards);
}
//洗牌,第一个对象插入随机位置
void shuffle(){
System.out.println("-----------开始洗牌!--------------");
Random random=new Random();
for(int i=0;i<cards.size();i++){//洗牌次数我随便设的,没有科学依据
Card c=cards.get(0);//获取第一个元素
cards.add(random.nextInt(cards.size()),c);//将第一个元素再次添加在任意位置
cards.remove(0);//移除第一个元素
}
System.out.println("-----------洗牌结束!--------------");
//System.out.println(cards);
}
//初始化玩家2人
void setPlayers(){
Scanner in=new Scanner(System.in);
int i=1;
do{
System.out.println("请输入第"+i+"位玩家的ID和姓名:");
while(true){
try{
System.out.println("请输入ID:");
int id=in.nextInt();
if(players.contains(new Player(id+"",null)))
throw new Exception();//ID已存在,抛出异常
System.out.println("请输入玩家姓名:");
String name=in.next();
players.add(new Player(id+"",name));
break;//新建信息成功,跳出循环
}catch(InputMismatchException e){
in=new Scanner(System.in);//这个必须有,不然就是死循环了
System.out.println("请输入整数类型的ID!");
}catch(Exception e){
System.out.println("该ID已存在,请重新输入!");
}
}
i++;
}while(i<3);
for(int j=0;j<players.size();j++){
System.out.println("---欢迎玩家:"+players.get(j).name);
}
}
//发牌
void dealCards(){
System.out.println("-----------开始发牌!--------------");
for(int i=0;i<2;i++){//每人发牌数i
for(int j=0;j<players.size();j++){//玩家数j
System.out.println("---玩家"+players.get(j).name+"-拿牌");
players.get(j).setCards(cards.get(0));
cards.remove(0);
}
}
System.out.println("-----------发牌结束!--------------");
}
//比较卡牌大小
void playCards(){
System.out.println("-----------游戏开始!--------------");
for(int i=0;i<players.size();i++){
Collections.sort(players.get(i).cards);
System.out.println("玩家:"+players.get(i).name+"最大的手牌为"+players.get(i).cards.get(1));
}
int judge=players.get(0).cards.get(1).compareTo(players.get(1).cards.get(1));
String name=judge>0 ? players.get(0).name:players.get(1).name;//条件语句,相当于if...else
System.out.println("-----------玩家:"+name+"获胜!--------------");
}
//展示手牌
void showCards(){
System.out.println("-----------玩家手牌展示--------------");
System.out.println(players.get(0)+""+players.get(0).cards);
System.out.println(players.get(1)+""+players.get(1).cards);
}
}
用户类
//用户类,为了防止ID重复,重写了equals,这样可以调用contains判断
class Player
{
public String id;
public String name;
public List<Card> cards;
Player(String id, String name){
this.id=id;
this.name=name;
cards=new ArrayList<Card>();
}
void setCards(Card c){
cards.add(c);
}
//重写toString只是为了写程序的时候测试用着方便
public String toString(){
return "Name:"+name;
}
public boolean equals(Object o){
if(this==o)return true;
if(o==null)return false;
if(!(o instanceof Player))return false;
Player p=(Player)o;
return Objects.equals(id,p.id);
}
}
卡牌类
//要比较卡牌的大小,所以要添加比较方法
class Card implements Comparable<Card>
{
public String suit;//花色
public String number;//点数
Card(String suit, String number){
this.suit=suit;
this.number=number;
}
//展示卡牌信息用
public String toString(){
return suit+number;
}
//实现比较方法
public int compareTo(Card c){
if(this.getNumberNum()==c.getNumberNum())
return this.getSuitNum()-c.getSuitNum();
else return this.getNumberNum()-c.getNumberNum();
}
//获取点数排序
int getNumberNum(){
String[] numbers={"2","3","4","5","6","7","8","9","10",
"J","Q","K","A"};
for(int i=0;i<numbers.length;i++){
if(numbers[i].equals(number))return i;
}
return -1;
}
//获取花色排序
int getSuitNum(){
String[] suits={"黑桃","红桃","梅花","方片"};
for(int i=0;i<suits.length;i++){
if(suits[i].equals(suit))return i;
}
return -1;
}
}
热门评论
非常感谢,很有启发!
非常感谢,很有启发!
代码中创建两个玩家那里,有两个catch块,为什么第一个catch块中需要重新new一个Scanner对象,而第二个中不需要?