为了账号安全,请及时绑定邮箱和手机立即绑定

做扑克牌游戏中遇到Exception in thread "main" java.lang.NumberFormatException: For input string: "K"

我先把13转成String类型,然后用Integer.valueof(string)转成int型,然后就报了这么个错误

相关代码如下

public player getWinner(player A,player B){

int maxA,maxB;

String colorA,colorB;

int countA,countB;

  if(A.obj[0][1]==null||A.obj[1][1]==null||B.obj[0][1]==null||B.obj[1][1]==null) {return null;}

if(Integer.valueOf(A.obj[0][1])>=Integer.valueOf(A.obj[1][1])){

maxA = Integer.valueOf(A.obj[0][1]);

colorA = A.obj[0][0];

}else{

maxA = Integer.valueOf(A.obj[1][1]);

colorA = A.obj[1][0];

}

if(Integer.valueOf(B.obj[0][1])>=Integer.valueOf(B.obj[1][1])){

maxB =Integer.valueOf(B.obj[0][1]);

colorB =B.obj[0][0];

}else{

maxB =Integer.valueOf(B.obj[1][1]);

colorB =B.obj[1][0];

}

if(maxA>maxB){

return A;

}else if(maxA==maxB){

countA =colorCompare(colorB);

countB =colorCompare(colorB);

if(countA>countB){

return A;

}else{

return B;

}

}else{

return B;

}

}

public int colorCompare(String color){

int colorCount=0;

if("黑桃".equals(color)){

colorCount=4;

}else if("梅花".equals(color)){

colorCount=3;

}else if("方块".equals(color)){

colorCount=2;

}else if("红桃".equals(color)){

colorCount=1;

}

return colorCount;

}

public static void main(String[] args) {

puke pork = new puke();

ArrayList<card> list_card =  (ArrayList<card>) pork.getCard();

System.out.println("请输入用户id");

Scanner s = new Scanner(System.in);

String ss = s.next();

System.out.println("请输入用户名");

Scanner n = new Scanner(System.in);

player personA = new player(ss, n.next());

player personB= new player("大神级", "大神");

System.out.println("用户创建完毕");

competition compe =new competition();

System.out.println("洗牌");

Collections.shuffle(list_card, new Random(10001));

// HashMap<Integer, String>  set_card = compe.washCard(list_card);

// Object[] obj = compe.attributeCard(set_card);

for(card c:list_card){

if(Integer.valueOf(c.count)==1){

c.setCount("A");

}else if(Integer.valueOf(c.count)==11){

c.setCount("J");

}else if(Integer.valueOf(c.count)==12){

c.setCount("Q");

}else if(Integer.valueOf(c.count)==13){

c.setCount("K");

System.out.println(c.color+c.count);

}

System.out.println("start!发牌");

 

personA.obj[0][0] = list_card.get(0).color;

personA.obj[0][1] = list_card.get(0).count;

personB.obj[0][0] = list_card.get(1).color;

personB.obj[0][1] = list_card.get(1).count;

personA.obj[1][0] = list_card.get(2).color;

personA.obj[1][1] = list_card.get(2).count;

personB.obj[1][0] = list_card.get(3).color;

personB.obj[1][1] = list_card.get(3).count;

player winner = compe.getWinner(personA, personB);

System.out.println(personA.id+personA.name+"的牌:"

+personA.obj[0][0]+personA.obj[0][1]+personA.obj[1][0]+personA.obj[1][1]);

System.out.println(personB.id+personB.name+"的牌:"

+personB.obj[0][0]+personB.obj[0][1]+personB.obj[1][0]+personB.obj[1][1]);

System.out.println("获胜者id:"+winner.id+"获胜者用户名:"+winner.name);

}

}

扑克牌类如下


public class puke {

private List<card> list_card;

public List<card> getCard(){

list_card = new ArrayList<card>();

for(int i=1;i<14;i++){ 

for(int j=1;j<5;j++){

card c = new card(); 

c.setCount(String.valueOf(i));

if(j==1){

c.color="红桃";

}else if(j==2){

c.color="方块";

}else if(j==3){

c.color="黑桃";

}else if(j==4) {

c.color="梅花";

}

list_card.add(c); 

}

}

return  list_card;

}

 


正在回答

3 回答

要不是看到回复我都忘了这个程序了,回去看了下真是一语点醒梦中人,我在比较之前就把13变成k了,然后又直接把k拿去转成int型去比较,所以报错了

0 回复 有任何疑惑可以回复我~

再次更正,我自己写了一下发现前面有很多说错的地方,但这个好像不能修改?以下面的为主把,代码测试通过了。

package Poke;

public class Poker {
	public static void main(String[] args){
		Cards cards = new Cards(); //初始化扑克牌
		Player a = new Player("Tom");
		Player b = new Player("Jerry");
		
		//每人发3张牌
		for(int i=0;i<3;i++){
			a.pick(cards.deal());
			b.pick(cards.deal());
		}
		
		/*
		  这里用showAll()来返回player手中的牌,showMax()来返回最大张。注意showAll返回String,而showMax返回Card,所以再用showFace()来生成牌面。
		  这里其实取巧了,因为这个题目只是要比较最大的牌,player手中的牌其实并没有排序,只是找出最大的一张。
		  所以在发牌的时候就可以比较且只比较第一张,大的放前面。这样取最大一张的时候直接拿第一张就行。
		 */
		
		System.out.println("-------------------------------------------------");
		System.out.print(a.name+"的牌是: " + a.showAll() + "\t" + "最大牌是: " +a.showMax().showFace() + "\n");
		System.out.print(b.name+"的牌是: " + b.showAll() + "\t" + "最大牌是: " + b.showMax().showFace() + "\n");
		
		/*
		  比较两张牌面,如果大小一样再比花色
		 */
		if(Cards.compare(a.showMax(),b.showMax())){
			System.out.println(a.name+"赢了");
		} else {
			System.out.println(b.name+"赢了");
		}	
	}
}
package Poke;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;


public class Cards {

	//Cards类用来存储一整幅扑克牌	
	private List<Card> poker = new ArrayList<Card>();
	Cards(){
		for(int n=1;n<5;n++){
			for(int m=2;m<15;m++){
				poker.add(new Card(n,m));
			}
		}
	}
	
	//随机发牌,并把用过的去掉
	Card deal(){
		Random rnd = new Random();
		int n = rnd.nextInt(poker.size());
		Card c = poker.get(n);
		poker.remove(n);
		return c;
	}
	
	//比较两张牌大小,先比数字,再比花色
	static boolean compare(Card a, Card b){
		boolean isBigger=false;
		if(a.number>b.number){isBigger=true;}
		if(a.number<b.number){isBigger=false;}
		if(a.number==b.number){
			if(a.color>b.color){isBigger=true;} else {isBigger=false;}
		}
		return isBigger;
	}
}
package Poke;

import java.util.*;


class Player{
	String name;
	
	//player手中的牌用list保存
	List<Card> myCard = new ArrayList<Card>(); 
	
	Player(String name) {
		this.name=name;
	}
	
	//抽牌,这里会把牌c和手中的第一张做比较,大的放在第一个。如果手里没有牌就放在第一个。
	void pick(Card c){
		System.out.println(this.name + "正在抽牌");
		if(myCard.isEmpty() || Cards.compare(myCard.get(0), c)){
			myCard.add(c);
		} else {
			myCard.add(0, c);
		}
	}
	
	//因为最大的一张放在第一个,所以直接返回第一张。
	Card showMax(){
		return myCard.get(0);
	}
	
	//遍历手牌,每张调用showFace()来生成牌面,并用一个StringBuilder来存储,最后返回一个String方便打印。
	String showAll(){
		StringBuilder sb = new StringBuilder();
		Iterator<Card> iter = myCard.iterator();
		while(iter.hasNext()){
			sb.append(iter.next().showFace());
			sb.append("  ");
		}
		return sb.toString();
	}
	
}
package Poke;

class Card{
	/*
	 * 花色color用int来表示,1-4代表方块到黑桃,这样比较花色大小很容易。
	 * 数字number在大于10的时候转成JQKA
	 */
	
	static final int SPADE=4;
	static final int HEART=3;
	static final int CLUB=2;
	static final int DIAMOND=1;
	static final int A=14;
	static final int K=13;
	static final int Q=12;
	static final int J=11;
	int color;
	int number;
	
	
	Card(int color, int number){
		this.color=color;
		this.number=number;		
	}
	
	//生成牌面
	String showFace(){
		String face = null;
		switch(color){
		case SPADE:
			face="黑桃";
			break;
		case HEART:
			face= "红桃";
			break;
		case CLUB:
			face= "梅花";
			break;
		case DIAMOND:
			face= "方块";
			break;
		}
		
		if(number<=10){return face+number;}
		switch(number){
		case A:
			face=face+"A";
			break;
		case K:
			face=face+"K";
			break;
		case Q:
			face=face+"Q";
			break;
		case J:
			face=face+"J";
			break;
		}
		
		return face;
	}
}

输出结果:

Tom正在抽牌

Jerry正在抽牌

Tom正在抽牌

Jerry正在抽牌

Tom正在抽牌

Jerry正在抽牌

-------------------------------------------------

Tom的牌是: 梅花6  黑桃4  黑桃2   最大牌是: 梅花6

Jerry的牌是: 方块K  黑桃6  梅花Q   最大牌是: 方块K

Jerry赢了


1 回复 有任何疑惑可以回复我~
#1

pullins

这道题目逻辑上很简单,主要在设计player和card这两个类上面。 player的属性:名字,手牌 player的动作:抽牌,出牌 card的属性:花色,大小 card的动作:展示牌面(花色+大小) 其余就是需要一个比较两张牌的大小就差不多了
2016-04-21 回复 有任何疑惑可以回复我~

没看到你的player类型是如何定义的,但根据报错来看你似乎是把字母K也放到 valueOf参数里面了,这里:

java.lang.NumberFormatException: For input string: "K"

这里你似乎是定义了一个数组来表示一张牌的花色和牌面,这样的话又何必定义card这个类?可以考虑定义card类型,在这个类型里面定义属性表示花色和牌面。

player则可以持有2张card的instance,定义一个String showMax() 来取出最大的一张,这样main里面可以写的比较清晰。

public static void main(String[] args) {
    Cards.shuffle();
    Player a = new Player();
    Player b = new Player();
    for(int i =0;i<2;i++){
        a.pick(Cards.deal());
        b.pick(Cards.deal());
    }
    System.out.println("a的牌是: " + a.showMax());
    System.out.println("b的牌是: " + b.showMax());
    if(Cards.compare(a.showMax, b.showMax)){
        System.out.println("a赢了");
        else {
            System.out.println("b赢了");
        }
    }
    
    //Card类表示一张牌
    class Card{
        String color;
        int number;
    }
    
    //Cards 静态类用来生成一副牌并发牌
    static class Cards{
        List<Card> poker = new ArrayList<Card>();
        //shuffle生成一个Card的list,里面可以包含所有52张牌。
        void shuffle(){...}
        
        //deal来随机发牌给player
        Card deal(){...}
        
        //compare比较两张牌大小
        boolean compare(Card a, Card b){...}
    }
    
    //player类有id、name、手牌,3个属性,拿牌、出牌2个动作。
    class Player {
        int id;
        String name;
        List<Card> myCard = new ArrayList<Card>();
        void pick(Card c){...};
        String showMax(){...};
    }
}


0 回复 有任何疑惑可以回复我~
#1

pullins

有一点写错了,boolean compare(String a, String b) 参数应该是String,因为上面写的是Cards.compare(a.showMax, b.showMax)
2016-04-20 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Java入门第三季
  • 参与学习       409788    人
  • 解答问题       4340    个

Java中你必须懂得常用技能,不容错过的精彩,快来加入吧

进入课程

做扑克牌游戏中遇到Exception in thread "main" java.lang.NumberFormatException: For input string: "K"

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信