需求
用Java开发一个斗地主游戏,如下:
需求分析
- 1、共有54张牌。
- 2、点数:“3”,“4”,“5”,“6”,“7”,“8”,“9”,“10”,“J”,“Q”,“K”,“A”,"2“。
- 3、花色: “♠”, “♥”, “♣”, "♦“。
- 4、大小王:“👲” , "🃏“ 。
- 5、发出51张牌,剩下三张做底牌。
实现思路:
- 1、创建一个房间,提前准备好一副牌
- 2、再进行洗牌,发牌,对牌进行排序(方便玩家观观看和清晰的知道牌的情况),看牌等操作。
代码实现
- 牌类
package com.itheima.d3_collection_test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Room { // 房间类
// 房间里必须有一副牌
private List<Card> allCards = new ArrayList<>();
public Room() {
// 准备一副牌
// 1、点色
String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
// 2、花色
String[] colors = {"♠", "♥", "♣", "♦"};
int size = 0; // 表示牌的大小
// 3、把这些牌做好,存入allCards集合中
for (int i = 0; i < numbers.length; i++) {
size++;
// 遍历花色 ,让点数和花色组合
for (int j = 0; j < colors.length; j++) {
Card card = new Card(numbers[i], colors[j], size);
allCards.add(card);
}
}
// 4、存入最后大小王
allCards.add(new Card("", "🃏", ++size));
allCards.add(new Card("", "👲", ++size));
System.out.println("新牌:" + allCards);
// 启动游戏,开始洗牌,发牌,排序,看牌
start();
}
private void start() {
// 1、洗牌
Collections.shuffle(allCards);
System.out.println("洗牌后:" + allCards);
// 2、发牌,发51张,最后3张作为底牌
// 发51张牌给三个玩家 List Set, List可重复:可以放好几张一样的牌,有序:可以打乱顺序,有索引:可以根据索引取第几张牌,打出去
ArrayList<Card> lingHuChong = new ArrayList<>();
ArrayList<Card> jiuMoZhi = new ArrayList<>();
ArrayList<Card> renYingYing = new ArrayList<>();
// 遍历这51张牌,给这三个玩家发牌
for (int i = 0; i < allCards.size() - 3; i++) {
// 轮询发牌:第0张:令狐冲,第1张:鸠摩智,第2张:任盈盈,第3张:令狐冲
Card card = allCards.get(i);
if (i % 3 == 0) {
lingHuChong.add(card);
} else if (i % 3 == 1) {
jiuMoZhi.add(card);
} else if (i % 3 == 2) {
renYingYing.add(card);
}
}
// 3、排序
sort(lingHuChong);
sort(jiuMoZhi);
sort(renYingYing);
// 4、看牌
System.out.println("令狐冲:" + lingHuChong);
System.out.println("鸠摩智:" + jiuMoZhi);
System.out.println("任盈盈:" + renYingYing);
// 抢地主:加入令狐冲抢到了地主
// 把三张底牌发给令狐冲
List<Card> lastThreeCards = allCards.subList(allCards.size() - 3, allCards.size());
lingHuChong.addAll(lastThreeCards);
System.out.println("令狐冲:" + lingHuChong);
}
private void sort(List<Card> cards) {
Collections.sort(cards, new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {
return o1.getSize() - o2.getSize();
}
});
}
}
- 房间类
package com.itheima.d3_collection_test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Room { // 房间类
// 房间里必须有一副牌
private List<Card> allCards = new ArrayList<>();
public Room() {
// 准备一副牌
// 1、点色
String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
// 2、花色
String[] colors = {"♠", "♥", "♣", "♦"};
int size = 0; // 表示牌的大小
// 3、把这些牌做好,存入allCards集合中
for (int i = 0; i < numbers.length; i++) {
size++;
// 遍历花色 ,让点数和花色组合
for (int j = 0; j < colors.length; j++) {
Card card = new Card(numbers[i], colors[j], size);
allCards.add(card);
}
}
// 4、存入最后大小王
allCards.add(new Card("", "🃏", ++size));
allCards.add(new Card("", "👲", ++size));
System.out.println("新牌:" + allCards);
// 启动游戏,开始洗牌,发牌,排序,看牌
start();
}
private void start() {
// 1、洗牌
Collections.shuffle(allCards);
System.out.println("洗牌后:" + allCards);
// 2、发牌,发51张,最后3张作为底牌
// 发51张牌给三个玩家 List Set, List可重复:可以放好几张一样的牌,有序:可以打乱顺序,有索引:可以根据索引取第几张牌,打出去
ArrayList<Card> lingHuChong = new ArrayList<>();
ArrayList<Card> jiuMoZhi = new ArrayList<>();
ArrayList<Card> renYingYing = new ArrayList<>();
// 遍历这51张牌,给这三个玩家发牌
for (int i = 0; i < allCards.size() - 3; i++) {
// 轮询发牌:第0张:令狐冲,第1张:鸠摩智,第2张:任盈盈,第3张:令狐冲
Card card = allCards.get(i);
if (i % 3 == 0) {
lingHuChong.add(card);
} else if (i % 3 == 1) {
jiuMoZhi.add(card);
} else if (i % 3 == 2) {
renYingYing.add(card);
}
}
// 3、排序
sort(lingHuChong);
sort(jiuMoZhi);
sort(renYingYing);
// 4、看牌
System.out.println("令狐冲:" + lingHuChong);
System.out.println("鸠摩智:" + jiuMoZhi);
System.out.println("任盈盈:" + renYingYing);
// 抢地主:加入令狐冲抢到了地主
// 把三张底牌发给令狐冲
List<Card> lastThreeCards = allCards.subList(allCards.size() - 3, allCards.size());
lingHuChong.addAll(lastThreeCards);
System.out.println("令狐冲:" + lingHuChong);
}
private void sort(List<Card> cards) {
Collections.sort(cards, new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {
return o1.getSize() - o2.getSize();
}
});
}
}
- 测试类:
package com.itheima.d3_collection_test;
/**
* 目标:完成斗地主游戏案例的开发
* 分析业务需求:
* 总共有54张牌
* 点数: "3","4","5","6","7","8","9","10","J","Q","K","A","2“
* 花色: "♠", "♥", "♣", "♦“
* 大小王: "👲" , "🃏“
* 斗地主:发出51张牌,剩下3张做为底牌。
* <p>
* 实现思路:
* 在启动房间的时候,应该提前准备好一副牌
* 然后洗牌,发牌,对牌排序,看牌
*/
public class GameDemo {
public static void main(String[] args) {
// 1、启动房间,准备一副牌
Room room = new Room();
// 2、启动游戏,开始洗牌,发牌,排序,发牌,等一系列操作
}
}