初学Java,简单扑克牌游戏思路请教, 写不下去了~~~

ShaneGK 2018-08-24 09:25:32
如下需求


我目前的代码如下, 共4个类:
1.卡牌类------------------------------------------------------------------
package cardGame;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ShuffleAllCards {
//cards应该是不变的, 所以要static,要不然调用的时候创建的是新的.size为0的.
public static List<String> cards;
public ShuffleAllCards(){
ShuffleAllCards.cards = new ArrayList<String>();
}
/**
* 生成所有52张牌
* */
public void CardsCreate(){
System.out.println("-----------游戏开始!-----------");
//通过遍历得到所有52张牌.
String[] number = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
String[] color = {"黑桃","红桃","梅花","方块"};
for(int i=0;i<number.length;i++){
for (int j = 0; j < color.length; j++) {
//第一个是 黑桃A, 然后 红桃A,
String OneCard = color[j]+number[i];
//每一次都加到List里,list是有序的.
cards.add(OneCard);
}
}
if(cards.size() == 52){
System.out.println("-----------生成扑克牌成功-------");
}
}
/**
* 打乱所有52张牌的顺序
* */
public void ShuffleCards(){
System.out.println("-----------开始洗牌-----------");
Collections.shuffle(cards);
for (String str : cards) {
System.out.print(str+", ");
}
System.out.println("-----------洗牌结束-----------");
}
}

2.玩家类----------------------------------------------------------------------------------------------
package cardGame;

import java.util.ArrayList;
import java.util.List;
/**
* 玩家类,有ID/name/手牌
* 其中手牌来着ShuffleAllCards类.
* */
public class Players {
public int ID;
public String name;
public List<String> HandCards;

public Players() {

}
//实例化属性
public Players(int ID,String name) {
this.ID = ID;
this.name = name;
//不能直接实例化List,因为set是一个接口.
this.HandCards = new ArrayList<String>();
}
public Players(int ID,String name,List<String> HandCard){
this.ID = ID;
this.name = name;
//不能直接实例化List,因为set是一个接口.
this.HandCards = new ArrayList<String>();
}





}


3.打牌类---(就是这个写不下去了....)---------------------------------------------------------------------
package cardGame;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class LetUsPlay {
Scanner console = new Scanner(System.in);
//定义一个玩家List
public List<Players> players;
public LetUsPlay() {
//初始化玩家List
players = new ArrayList<Players>();

}


/**
* 创建玩家方法
* */
public void CreatePlayers(){
System.out.println("-----------登记玩家信息-----------");
System.out.println("一共有几位玩家呢?");
int playerCounter = console.nextInt();
for(int i=0;i<playerCounter;i++){
//try{
//确定一共有几个玩家
System.out.println("请输入第"+(i+1)+"位玩家ID: ");
int playerId = console.nextInt();
System.out.println("请输入第"+(i+1)+"位玩家姓名: ");
String playerName = console.next();
Players player = new Players(playerId,playerName);
players.add(player);
//}catch(InputMismatchException ex){
// System.out.println("请输入整数类型的ID!");
// i--;
// continue;
//}
}
//for (Players players : players) {
//System.out.println(players.name);
//}
}



/**
* 为玩家发牌,之前扑克牌已经打乱顺序了
* */
public void GiveCards(){
//共有多少个玩家,就循环多少次.比方5个玩家
for(int i=0;i<players.size();i++){
//先给每个玩家发第一张牌, 发的是1-5张牌
players.get(i).HandCards.add(ShuffleAllCards.cards.get(i));
//再发第二张牌,发的是6-10张牌,第6张牌给第1个玩家.
players.get(i).HandCards.add(ShuffleAllCards.cards.get(i+players.size()));
}
}
/**
* 比较玩家手里的卡牌
* 规则为:取两人各自手中点数最大的牌进行比较,点数大的赢.
* 若两人各自的点数最大的牌相等,则再按花色比较.
* (黑桃>红桃>梅花>方块) 方块A, 黑桃Q, 黑桃6, 梅花3,
* */
public void CompareCards(){
for(int i=0;i<players.size();i++){
//每个玩家的手里的第一张和第二张牌
String firstCard = players.get(i).HandCards.get(0);
String SecondCard = players.get(i).HandCards.get(1);

/** 这里, 要比较得到较大的一张牌, 然后把所有玩家的较大的一张牌放到一个集合里, 再比较, 但是 之前的cards集合,
* 是比方说,"方块5"这样的, 必须取出"方块"和5分开, 这一步似乎可以做到, 见下面的代码, 但是感觉很复杂啊,
* 而且像A,J,K,Q和"方块"这样的还不能直接比较
* 并且后面就不知道怎么写了
**/
}
}
}



--------------------这里是之前删掉的CompareCards方法里的代码-----------------------------------------------
	//先创建一个list用来存放每个玩家手牌里较大的那一张.
List<String> theBigOne = new ArrayList<String>();
//先比较每个玩家自己手中的两张卡牌,找出一张较大的.
for(int i=0;i<players.size();i++){
//每个玩家的手里的第一张和第二张牌
String firstCard = players.get(i).HandCards.get(0);
String SecondCard = players.get(i).HandCards.get(1);
//取得每个玩家两张手牌的点数
String FirstCardPoint = firstCard.substring(2, firstCard.length());
String SecondCardPoint = SecondCard.substring(2, SecondCard.length());
//取得每个玩家两张手牌的花色
String FirstCardColor = firstCard.substring(0,2);
String SecondCardColor = SecondCard.substring(0,2);
//==比较的是值,equals比较的是地址,switch方法在jdk1.6中不能传入String类型
//start 把点数中的A,j,Q,K转成1,11,12,13,然后才能比较大小.
int FirstCardPoint1 = 0,SecondCardPoint1 = 0;
if(FirstCardPoint=="A" || SecondCardPoint=="A"){
FirstCardPoint1= 1; SecondCardPoint1 = 1;
}
if(FirstCardPoint=="J" || SecondCardPoint=="J"){
FirstCardPoint1= 11; SecondCardPoint1 = 11;
}
if(FirstCardPoint=="Q" || SecondCardPoint=="Q"){
FirstCardPoint1= 12; SecondCardPoint1 = 12;
}
if(FirstCardPoint=="K" || SecondCardPoint=="K"){
FirstCardPoint1= 13; SecondCardPoint1 = 13;
}
//end 把点数中的A,j,Q,K转成1,11,12,13,然后才能比较大小.
//start 把花色中的黑桃>红桃>梅花>方块 转成14,15,16,17,然后才能比较大小.
int FirstCardColor1 =0 ,SecondCardColor1 = 0;
if(FirstCardColor=="黑桃" || SecondCardColor=="黑桃"){
FirstCardColor1= 17; SecondCardColor1 = 17;
}
if(FirstCardColor=="红桃" || SecondCardColor=="红桃"){
FirstCardColor1= 16; SecondCardColor1 = 16;
}
if(FirstCardColor=="梅花" || SecondCardColor=="梅花"){
FirstCardColor1= 15; SecondCardColor1 = 15;
}
if(FirstCardColor=="方块" || SecondCardColor=="方块"){
FirstCardColor1= 14; SecondCardColor1 = 14;
}
//end 把花色中的黑桃>红桃>梅花>方块转成14,15,16,17,然后才能比较大小.
//start 比较每个玩家两张手牌的点数的大小,较大的放到新的theBigOne的list里.
if(FirstCardPoint1 > SecondCardPoint1 || Integer.parseInt(FirstCardPoint) > Integer.parseInt(SecondCardPoint)){
theBigOne.add(firstCard);
}
else if(FirstCardPoint1 < SecondCardPoint1 || Integer.parseInt(FirstCardPoint) < Integer.parseInt(SecondCardPoint)){
theBigOne.add(SecondCard);
}
else if(FirstCardPoint1 == SecondCardPoint1 || Integer.parseInt(FirstCardPoint) == Integer.parseInt(SecondCardPoint)){
//点数相同,比较花色
if(FirstCardColor1 > SecondCardColor1){
theBigOne.add(firstCard);
}
else if(FirstCardColor1 < SecondCardColor1){
theBigOne.add(SecondCard);
}
else if(FirstCardColor1 == SecondCardColor1){
System.out.println("不可能!两个人抽到相同的牌了");
}
}
//end 比较每个玩家两张手牌的点数的大小,较大的放到新的theBigOne的list里.

}
for (String string : theBigOne) {
System.out.println(string);
}
...全文
1333 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
miaoch 2018-08-28
  • 打赏
  • 举报
回复
链接: https://pan.baidu.com/s/1-WcSgxqYVBztdIZ5DnOf2A 密码: b1s1
我写好了,放到百度云盘了,你可以down过去看看
miaoch 2018-08-28
  • 打赏
  • 举报
回复
为什么不把卡牌当成一个类呢,用String拼接也太麻烦了,我反正无聊,就简单写一个给你看看吧
  • 打赏
  • 举报
回复
基础阶段多练练逻辑、算法,棋牌、算式很有帮助
  • 打赏
  • 举报
回复
比牌大小,直接看扎金花算法就好了。
wodefree 2018-08-27
  • 打赏
  • 举报
回复
用泛型把那个类弄进去 用遍历遍出来
  • 打赏
  • 举报
回复
技术教程 https://blog.csdn.net/weixin_42644456
代码下载 https://download.csdn.net/user/weixin_42644456/uploads
虽然没有棋牌类的,这些资料供你参考。
有时间的话,我会做一份棋牌的游戏。
licjd 2018-08-25
  • 打赏
  • 举报
回复
 int FirstCardPoint1 = 0,SecondCardPoint1 = 0;
    if(FirstCardPoint=="A" || SecondCardPoint=="A"){
        FirstCardPoint1= 1;     SecondCardPoint1 = 1;           
    }
首先你的这段代码有错,初始值被赋值0,是不是需要将牌的数值赋给之后在判断A、J、Q、K
然后我看了你的需求后,有以下思路(代码实现就不要了,没你写得好):
可以先将每位玩家最大牌取出,然后比较,得到前两位的,若牌值相等才利用花色比较大小。
[机智] 2018-08-24
  • 打赏
  • 举报
回复
其实你可以把牌放到一个map里面,然后先比较牌面的大小!数字要是相同就比较key的值!!!(你要注意key是不可以重复的,当然你也可以吧定义的数字放在value中!这样比较的话!会不会简单一点呢
qq_37257058 2018-08-24
  • 打赏
  • 举报
回复
还行吧只是比大小的问题,我觉得解决这个问题有三个方面。第一就是牌,我觉得可以做一个42大小的Integer数组和牌去映射,比的时候好比,第二就是一个消耗队列,去这个队列去随机拿出42个数字,第三就是面向对象的问题吧。。。第一反正。。仅供参考,拿分!

62,614

社区成员

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

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