高手。。麻烦了。。生成扑克牌问题 100分!

whynot2010 2010-06-22 09:22:27
使用JAVA编写以下程序:
1、请定义一个名为Card的扑克牌类,该类有两个private访问权限的字符串变量face和suit;分别描述一张牌的牌面值(如:A、K、Q、J、10、9、……3、2等)和花色(如:“黑桃”、“红桃”、“梅花”、“方块”);定义Card类中的public访问权限的构造方法,为类中的变量赋值;定义protected访问权限的方法getFace(),得到扑克牌的牌面值;定义protected访问权限的方法getSuit(),得到扑克牌的花色;定义方法toString(),返回表示扑克牌的花色和牌面值字符串(如“红桃A”、“梅花10”等)。

2、若应用程序的main方法中,定义字符串数组f和s;分别表示扑克牌的牌面值和花色;定义52个元素的Card类型数组deck,用来存放4个花色的52张牌。如下所示。
String f[] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
String s[] = {"黑桃","红桃","梅花","方块"};
Card deck = new Card[52];
(1)使用Card类的构造方法给deck数组的52张牌赋值,要求数组中先存放黑桃花色的A、2、3、……、K;然后是红桃花色的A、2、3、……、K;梅花花色的A、2、3、……、K;方块花色的A、2、3、……、K。请写出实现上述功能的程序段。
(2)请编写模拟洗牌的完整程序,即把数组deck中的扑克牌随机打乱存放顺序。

原题如下:

引用内容
private String face; // A, K, Q, J, 10, ... 2
private String suit; // Spade, Heart, Club, Diamond
public Card(String suit, String face) {
this.face = face;
this.suit = suit;
}

protected String getFace() {
return face;
}

protected String getSuit() {
return suit;
}

public String toString() {
return suit + " " + face;
}


解题,完成程序解:

程序代码
package poker;

public class Card {

private String face; // A, K, Q, J, 10, ... 2
private String suit; // Spade, Heart, Club, Diamond
public Card(String suit, String face) {
this.face = face;
this.suit = suit;
}

protected String getFace() {
return face;
}

protected String getSuit() {
return suit;
}

public String toString() {
return suit + " " + face;
}

public static void shuffle(Card[] deck, int startIndex, int size,
int splitIndex) { //shuffle洗牌
System.out.println("startIndex:" + startIndex);
if (splitIndex * 2 > size) { //if rand is 30
Card.swap(deck, startIndex, splitIndex, size - splitIndex); //[52]、0、30、22
shuffle(deck, size - splitIndex, splitIndex, size - splitIndex); //[52]、22、30、22
} else if (splitIndex * 2 < size) { //if rnd is 10
Card.swap(deck, startIndex, size - splitIndex, splitIndex); //[52]、0、42、10
shuffle(deck, startIndex, size - splitIndex, splitIndex); //[52]、0、42、10
} else {
Card.swap(deck, startIndex, splitIndex, splitIndex);
}

}

public static void swap(Card[] deck, int srcIndex, int dstIndex, int size) { //交换
//SRC是在本位置显示:source的缩写,源的意思 HREF是点击后连接的目标:HyperlinkReference,超链接引用
String face = "";
String suit = "";
for (int i = 0; i < size; i++) {
face = deck[srcIndex + i].face;
suit = deck[srcIndex + i].suit;
deck[srcIndex + i].face = deck[dstIndex + i].face;
deck[srcIndex + i].suit = deck[dstIndex + i].suit;
deck[dstIndex + i].face = face;
deck[dstIndex + i].suit = suit;
}
}

/**
* @param args
*/
public static void main(String[] args) {
//第一问解答
Card[] deck = new Card[52];
String f[] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J",
"Q", "K"};
String s[] = {"Spade", "Heart", "Club", "Diamond"};
for (int i = 0; i < s.length; i++) {
for (int j = 0; j < f.length; j++) {
deck[i * 13 + j] = new Card(s[i], f[j]); //依次存入数组之中,每13张一回合
}
}
//第二问解答
int rnd = 0;
int numOfShuffle = 10;
for (int i = 0; i < numOfShuffle; i++) {
rnd = (int) Math.abs(Math.random() * 52); //Math.random()返回大于或等于 0.0 但小于 1.0 的伪随机 double 值。

Card.shuffle(deck, 0, deck.length, rnd);
}
// Test
/*
for (int i=0; i<deck.length; i++)
{
System.out.println(deck[i]);
} */
}

}
...全文
769 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lryxxh 2010-11-04
  • 打赏
  • 举报
回复
你的洗牌的原理是什么?只是为了随机取值么?没有其他的规则?如果这样的话直接把deck 放到List里面.然后随机取出一个remove一个.循环完了就OK了.
yingfengershi 2010-11-04
  • 打赏
  • 举报
回复
import java.util.Random;


public class Poker {

private Card[] cards;
private Random random;

public Poker(){
cards = new Card[52];

String[] codes = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
String[] colors = {"黑桃","红桃","梅花","方块"};
int[] points = {1,2,3,4,5,6,7,8,9,10,10,10,10};

for(int i=0; i<codes.length; i++){
for(int j=0; j<colors.length; j++){
Card card = new Card();
card.setCode(codes[i]);
card.setColor(colors[j]);
card.setPoint(points[i]);
cards[j + 13*i] = card;
}
}

random = new Random();

}

public void show(){
for(Card card : cards){
card.show();
}
}

public void wash(){
for(int i=0; i<cards.length; i++){
int randomInt = random.nextInt(52);
if(i!=randomInt){
Card temp = cards[i];
cards[i] = cards[randomInt];
cards[randomInt] = temp;
}
}
}

public Card[] getCards(){
return this.cards;
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Poker poker = new Poker();

//poker.wash();
poker.show();
}


}
yingfengershi 2010-11-04
  • 打赏
  • 举报
回复
public class Card {

private String color;
private String code;
private int point;

public void show(){
System.out.println(color + code + " -> " + point + "点");
}

public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public int getPoint() {
return point;
}
public void setPoint(int point) {
this.point = point;
}

public static void main(String[] args){
Card card = new Card();
card.setColor("梅花");
card.setCode("5");
card.setPoint(5);

card.show();
}
}
bawgiitx 2010-11-04
  • 打赏
  • 举报
回复

/** 1
*/
class Card {

/**一张牌的牌面值(如:A、K、Q、J、10、9、……3、2等*/
private String face;
/**花色(如:“黑桃”、“红桃”、“梅花”、“方块”);*/
private String suit;

public Card(String face, String suit) {
this.face = face;
this.suit = suit;
}

/**
* 扑克牌的牌面值
* @return
*/
protected String getFace() {
return face;
}

/**
* 得到扑克牌的花色
* @return
*/
protected String getSuit() {
return suit;
}

@Override
public String toString() {
return (suit != null ? suit : "") + (face != null ? face : "");
}
}

/**
*
* @author Tsubasa
*/
public class NewClass {

public static void main(String[] args) {
String f[] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
String s[] = {"黑桃", "红桃", "梅花", "方块"};
Card[] deck = new Card[52];

/// 2.1
for (int i = 0; i < s.length; i++) {
for (int j = 0; j < f.length; j++) {
deck[i * f.length + j] = new Card(f[j], s[i]);
}
}

////// 2.2
// 从最后一个位置开始,随机和前面的牌换位置,换完51次即洗完牌
java.util.Random rd = new java.util.Random(System.currentTimeMillis());
for (int t, i = deck.length - 1; i > 0; i--) {
t =rd.nextInt(i);
Card c = deck[t];
deck[t] = deck[i];
deck[i] = c;
}
}
}
TearsStoneJava 2010-11-04
  • 打赏
  • 举报
回复
有理!
liuhongdong2010 2010-11-03
  • 打赏
  • 举报
回复
suit表示牌的花色,face表示牌的内容
Me___Sheanr 2010-11-02
  • 打赏
  • 举报
回复
看起来有点繁琐
clariones 2010-11-02
  • 打赏
  • 举报
回复
不写可以,你用 system.out.println(card)就会看到类似 Card@1291723 之类的信息。
写这个就好看些,知道具体是哪个牌。

我看这个打印只是在被注释掉的test里有用,所以应该不写也不影响解题
parckle 2010-11-02
  • 打赏
  • 举报
回复
toString()方法是Object类的方法,所以其他子类(所有其他类都继承Object类,所以即使你没有显式地写上toString()方法,你的aaa类也有toString()方法)都有这个方法,如果你没有显式是写toString()方法,那它就默认地执行继承而来的行为,也就是打印出对象的地址,而这里,你的题目要求toString()方法是返回表示扑克牌的花色和牌面值字符串(如“红桃A”、“梅花10”等),所以你要重写toString()方法.
wxd81818 2010-11-02
  • 打赏
  • 举报
回复
哇好复杂的程式,

我不知道我写的符合龟腚不?


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

public class aaa {
static List<String> parkList = new ArrayList<String>();
static List<String> zslist = new ArrayList<String>();
static List<String> lslist = new ArrayList<String>();
static List<String> wwlist = new ArrayList<String>();
static List<String> zllist = new ArrayList<String>();

public static void main(String[] args) {
// 初始化牌
for (int i = 1; i < 5; i++) {
switch (i) {
case 1:
initP("红桃");
break;
case 2:
initP("梅花");
break;
case 3:
initP("方片");
break;
case 4:
initP("黑桃");
break;
}
}
// 开始分牌
fenpai();
for (int i = 0; i < 4; i++) {
switch (i) {
case 0:
System.out.println("张三的牌为:=\r\n");
printlist(zslist);
break;
case 1:
System.out.println("李四的牌为:=\r\n");
printlist(lslist);
break;
case 2:
System.out.println("王五的牌为:=\r\n");
printlist(wwlist);
break;
case 3:
System.out.println("赵六的牌为:=\r\n");
printlist(zllist);
break;
}
}
}

private static void printlist(List<String> list) {
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}

private static void initP(String str) {
String temstr = str;
for (int i = 1; i < 14; i++) {
temstr = str;
switch (i) {
case 1:
temstr = temstr + "A";
break;
case 11:
temstr = temstr + "J";
break;
case 12:
temstr = temstr + "Q";
break;
case 13:
temstr = temstr + "K";
break;
default:
temstr = temstr + i;
}
parkList.add(temstr);
}
}

private static void fenpai() {
Random random = new Random();
int k = 0;
for (int i = 0; i < parkList.size(); i++) {
switch (k) {
case 0:
zslist.add(parkList.get(random.nextInt(parkList.size())));
break;
case 1:
lslist.add(parkList.get(random.nextInt(parkList.size())));
break;
case 2:
wwlist.add(parkList.get(random.nextInt(parkList.size())));
break;
case 3:
zllist.add(parkList.get(random.nextInt(parkList.size())));
break;
}
if (k == 3) {
k = 0;
}
else
{
k++;
}
}
}
}


bolink5 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 whynot2010 的回复:]

想问问
public String toString() {
return suit + " " + face;
}
是什么意思 不写可以么 谢谢谢了
[/Quote]
一般toString() 方法 是把某个对象转化为字符串
而在这的话,他返回的是以空格分隔的字符串,可以理解为toString()方法重写
个人理解、、、
网络科技 2010-06-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 whynot2010 的回复:]
想问问
public String toString() {
return suit + " " + face;
}
是什么意思 不写可以么 谢谢谢了
[/Quote]
这个相当于重写吧,具体意思你要自己研究了,不写应该也可以,但你要在另外的地方写,不方便.
jjc1989 2010-06-22
  • 打赏
  • 举报
回复
你自己运行过吗?
无伤 2010-06-22
  • 打赏
  • 举报
回复
虽然,帮不上忙, 帮顶下。
whynot2010 2010-06-22
  • 打赏
  • 举报
回复
想问问
public String toString() {
return suit + " " + face;
}
是什么意思 不写可以么 谢谢谢了

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧