这是java入门三的扑克牌的游戏程序,自己写的,有挺多不懂得地方,慢慢上网自己琢磨出来的,可能写的不是太好,加入了很多的sleep是为了让进程输出是有停顿,更人性化一些,大家帮忙看看,有什么可以改进的地方欢迎大家的批评和建议,共同进步,谢谢~
package com.edward;
public class Pokers {
private String kind;
private String number;
Pokers(String kind,String number){
this.kind=kind;
this.number=number;
}
public void getPoker(){
System.out.print(kind+number+",");
}
public String getKind(){
return kind;
}
public String getNumber(){
return number;
}
}
public class Players {
private int ID;
private String name;
public void setID(int ID){
this.ID=ID;
}
public void setName(String name){
this.name=name;
}
public int getID(){
return ID;
}
public String getName(){
return name;
}
public Pokers handPokers[]=new Pokers[2];//玩家手牌
}
import java.util.Comparator;
public class PokerComparator implements Comparator<Pokers> {
@Override
//自定义的poker比较方式
public int compare(Pokers o1, Pokers o2) {
// TODO 自动生成的方法存根
if(o1.getNumber().equals(o2.getNumber())){//若数字相同,则比较花色
if(o1.getKind().equals("黑桃")) return 1;
else if(o2.getKind().equals("黑桃")) return -1;
else if(o1.getKind().equals("红心")) return 1;
else if(o2.getKind().equals("红心")) return -1;
else if(o1.getKind().equals("梅花")) return 1;
else return -1;
}else if(o1.getNumber().equals("A")) return 1;
else if(o2.getNumber().equals("A")) return -1;
else if(o1.getNumber().equals("K")) return 1;
else if(o2.getNumber().equals("K")) return -1;
else if(o1.getNumber().equals("Q")) return 1;
else if(o2.getNumber().equals("Q")) return -1;
else if(o1.getNumber().equals("J")) return 1;
else if(o2.getNumber().equals("J")) return -1;
else if(o1.getNumber().equals("10")) return 1;
else if(o2.getNumber().equals("10")) return -1;
else return o1.getNumber().compareTo(o2.getNumber()); //数字除了A,K,Q,J,10外,可以直接用字符串默认的比较方式
}
}
package com.edward;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
public class PlayGames {
public List<Pokers> pokersList;
public Random random;
public Scanner console;
public Players player1,player2;
public int p;//p用于指向扑克牌list中的下一张牌
public PlayGames() {
// TODO 自动生成的构造函数存根
pokersList=new ArrayList<Pokers>();
random=new Random();
console=new Scanner(System.in);
player1=new Players();
player2=new Players();
p=0;
}
//shuffle方法用于洗牌
public void shuffle(Pokers pokersArray[]){
System.out.println("\n----------开始洗牌...----------");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
pokersList.add(pokersArray[0]);//先往pokersList中添加第一张牌
//for循环中通过random生成随机数,使后面的牌插入pokersList中随机的位置
for(int i=1;i<pokersArray.length;i++){
pokersList.add(random.nextInt(i), pokersArray[i]);
}
System.out.println("----------洗牌成功!----------");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
//添加玩家
public void addPlayer(){
System.out.println("----------请输入第一位玩家的ID:----------");
while (true) {
try {
player1.setID(console.nextInt());
} catch (Exception e) {//如果输入非数字,则捕获抛出的异常
System.out.println("请输入数字ID!"); //提示用户输入数字
console.next(); //清空缓存区中的非数字内容
continue; //继续下一轮循环
// TODO: handle exception
}
break; //若无异常则跳过catch,通过break跳出循环
}
System.out.println("----------请输入第一位玩家的姓名:----------");
player1.setName(console.next());;
//第二位玩家同上
System.out.println("----------请输入第二位玩家的ID:----------");
while (true) {
try {
player2.setID(console.nextInt());;
} catch (Exception e) {
System.out.println("请输入数字ID!");
console.next();
continue;
// TODO: handle exception
}
break;
}
System.out.println("----------请输入第二位玩家的姓名:----------");
player2.setName(console.next());;
System.out.println("----------欢迎玩家 "+player1.getName()+"和"+player2.getName()+"----------");
}
//发牌
public void sendCard(){
System.out.println("----------开始发牌----------");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println("-----"+player1.getName()+"拿牌...");
//p用于指向扑克牌list中的下一张牌,取完牌后自加1
player1.handPokers[0]=pokersList.get(p++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println("-----"+player2.getName()+"拿牌...");
player2.handPokers[0]=pokersList.get(p++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println("-----"+player1.getName()+"拿牌...");
player1.handPokers[1]=pokersList.get(p++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println("-----"+player2.getName()+"拿牌...");
player2.handPokers[1]=pokersList.get(p++);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println("----------发牌结束----------");
}
//比较并输出结果
public void start(){
//利用sort方法和自定义的pokercomparator将两位玩家的手牌按从小到大排序,手牌中最大的牌为数组下标最大的
Collections.sort(Arrays.asList(player1.handPokers), new PokerComparator());
System.out.println("玩家"+player1.getName()+"的最大手牌为:"+player1.handPokers[1].getKind()+player1.handPokers[1].getNumber());
Collections.sort(Arrays.asList(player2.handPokers), new PokerComparator());
System.out.println("玩家"+player2.getName()+"的最大手牌为:"+player2.handPokers[1].getKind()+player2.handPokers[1].getNumber());
//利用自定义的pokercomparator比较两位玩家的最大手牌,玩家1大则返回1,否则返回-1,并将结果保存到flag
PokerComparator comparator=new PokerComparator();
int flag=comparator.compare(player1.handPokers[1], player2.handPokers[1]);
//根据得到的flag输出胜利的玩家
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
if(flag>0)
System.out.println("----------玩家"+player1.getName()+"获胜!----------");
else
System.out.println("----------玩家"+player2.getName()+"获胜!----------");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println("玩家各自的手牌为:");
System.out.println(player1.getName()+":"+player1.handPokers[0].getKind()+player1.handPokers[0].getNumber()+"、"+player1.handPokers[1].getKind()+player1.handPokers[1].getNumber());
System.out.println(player2.getName()+":"+player2.handPokers[0].getKind()+player2.handPokers[0].getNumber()+"、"+player2.handPokers[1].getKind()+player2.handPokers[1].getNumber());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("----------创建扑克牌...----------");
//用数组pokersArray保存扑克牌的信息
Pokers pokersArray[]={new Pokers("黑桃", "2"),new Pokers("黑桃", "3"),new Pokers("黑桃", "4"),new Pokers("黑桃", "5"),new Pokers("黑桃", "6"),new Pokers("黑桃", "7"),new Pokers("黑桃", "8"),new Pokers("黑桃", "9"),new Pokers("黑桃", "10"),new Pokers("黑桃", "J"),new Pokers("黑桃", "Q"),new Pokers("黑桃", "K"),new Pokers("黑桃", "A"),
new Pokers("红心", "2"),new Pokers("红心", "3"),new Pokers("红心", "4"),new Pokers("红心", "5"),new Pokers("红心", "6"),new Pokers("红心", "7"),new Pokers("红心", "8"),new Pokers("红心", "9"),new Pokers("红心", "10"),new Pokers("红心", "J"),new Pokers("红心", "Q"),new Pokers("红心", "K"),new Pokers("红心", "A"),
new Pokers("梅花", "2"),new Pokers("梅花", "3"),new Pokers("梅花", "4"),new Pokers("梅花", "5"),new Pokers("梅花", "6"),new Pokers("梅花", "7"),new Pokers("梅花", "8"),new Pokers("梅花", "9"),new Pokers("梅花", "10"),new Pokers("梅花", "J"),new Pokers("梅花", "Q"),new Pokers("梅花", "K"),new Pokers("梅花", "A"),
new Pokers("方块", "2"),new Pokers("方块", "3"),new Pokers("方块", "4"),new Pokers("方块", "5"),new Pokers("方块", "6"),new Pokers("方块", "7"),new Pokers("方块", "8"),new Pokers("方块", "9"),new Pokers("方块", "10"),new Pokers("方块", "J"),new Pokers("方块", "Q"),new Pokers("方块", "K"),new Pokers("方块", "A")};
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println("----------扑克牌创建成功----------");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println("牌的种类为:");
//foreach输出牌的信息
for (Pokers pokers : pokersArray) {
pokers.getPoker();
if(pokers.getNumber().equals("A")){
System.out.println();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
PlayGames pg=new PlayGames();//创建playgame对象
pg.shuffle(pokersArray);//调用对象的shuffle方法来洗牌
pg.addPlayer();//调用addplayer方法来添加玩家
pg.sendCard();//发牌
System.out.println("----------开始游戏----------");
pg.start();//比较并输出结果
System.out.println("----------是否继续游戏?(1):是 /(others):否----------");
String flag=pg.console.next();
//根据用户输入判断是否要继续游戏,若继续游戏则将剩余的牌发给玩家,按流程继续游戏,知道玩家选择不继续或者牌已发完,则结束游戏
while(flag.equals("1")&&pg.p<52){//p指向pokerlist中的牌,当p=52时牌不存在,则游戏结束
pg.sendCard();
pg.start();
if(pg.p<52){
System.out.println("----------是否继续游戏?(1):是 /(others):否----------");
flag=pg.console.next();
}else{
System.out.println("----------扑克牌已发完----------");
}
}
System.out.println("----------游戏结束,谢谢使用,再见----------");
}
}