今天学了顺序表,下面是用所学知识,做出的扑克牌代码和杨慧三角
目录
扑克牌代码地址
扑克牌
1.买牌(初始化)
一张牌Card
suit:牌色,rank牌字面大小,一定要有toString,防止输出对象
class Card {
public String suit;
public int rank;
public Card(String suit, int rank) {
this.suit = suit;
this.rank = rank;
}
@Override
public String toString() {
return "Card{" +
"suit='" + suit + '\'' +
", rank=" + rank +
'}';
}
}
一副牌cards
这里采用顺序表的存储方式啊ArrayList,初始化52张牌出来(调用Card构造方法),并循环加入add,到cards里面,返回集合cards
public static final String suits[] = {"♥", "♠", "♣", "♦"};
//1.买牌
public List<Card> BuyDeskCard() {
List<Card> cards = new ArrayList<>();
for (int i = 1; i <= 13; i++) {
for (int j = 0; j < 4; j++) {
Card card = new Card(suits[j], i);
cards.add(card);
}
}
return cards;
}
2.打乱牌
public void shuffle(List<Card> cards) {
Random random = new Random();
for (int i = cards.size() - 1; i > 0; i--) {
//产生[0,i)的随机数
int index = random.nextInt(i);
swap(cards, i, index);
}
}
public void swap(List<Card> cards, int i, int j) {
// Card tmp=cards[i];
Card tmp = cards.get(i);
// cards[i]=cards[j];
cards.set(i, cards.get(j));
// cards[j]=tmp;
cards.set(j, tmp);
}
由于刚才的牌是依次初始化(买的牌是不是都是新的),这里需要将牌无规则打乱
每次产生(o,i]的随机数index,拿出最后一张牌,取出前i张牌任意一张index,进行交换,注意细节一定要从后往前随机取,理由random每次都是0到i,可能会把前面的也随机了。
3.揭牌
假设三个人,轮流五次, 每个人从洗好的牌,依次抓牌,抓到的牌放到自己的牌堆里hand1,hand2,hand3,再用集合记录三个人的牌堆hands,返回牌堆hands,记录了三个人的抓牌信息
public List<List<Card>> test(List<Card> cards) {
List<Card> hand1 = new ArrayList<>();
List<Card> hand2 = new ArrayList<>();
List<Card> hand3 = new ArrayList<>();
List<List<Card>> hands = new ArrayList<>();
hands.add(hand1);
hands.add(hand2);
hands.add(hand3);
//发5次牌,每个人轮流拿一张
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
Card card = cards.remove(0);
hands.get(j).add(card);
}
}
return hands;
}
4.调用方法测试
package 扑克牌;
import java.util.List;
public class Test {
public static void main(String[] args) {
Carddemo carddemo = new Carddemo();
List<Card> ret = carddemo.BuyDeskCard();
System.out.println(ret);
System.out.println("洗牌");
carddemo.shuffle(ret);
System.out.println(ret);
System.out.println("揭牌");
List<List<Card>> ret2 = carddemo.test(ret);
for (int i = 0; i < ret2.size(); i++) {
System.out.println("第" + i + "个人的牌:" + ret2.get(i));
}
System.out.println("剩余的牌:");
System.out.println(ret);
}
}
5.结果
杨慧三角
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> ret = new ArrayList<>();
List<Integer> list = new ArrayList<>();
//添加第一行的数据
list.add(1);
ret.add(list);
for (int i = 1; i < numRows; i++) {
//开始构造当前行的数据
List<Integer> curList = new ArrayList<>();
curList.add(1);
//保存上一行的数据
List<Integer> preList = ret.get(i - 1);
for (int j = 1; j < i; j++) {
//中间的数据(上一行同列和前一列,第一列无法算j从1开始)
int num=preList.get(j)+preList.get(j-1);
//构造好数据放回当前列中
curList.add(num);
}
curList.add(1);//末尾来个1
//把这一行的数据存到ret中
ret.add(curList);
}
return ret;
}
思路: