初学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);
}
...全文
1366 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个数字,第三就是面向对象的问题吧。。。第一反正。。仅供参考,拿分!
【变换域数字水印技术:一种信息隐藏的方法】使用多幅图像作为水印的数字水印技术,该技术基于变换域函数,包括离散小波变换(DWT)、离散余弦变换(DCT)和奇异值分解(SVD)(Matlab代码实现)内容概要:本文介绍了一种基于变换域函数的多幅图像数字水印技术,主要采用离散小波变换(DWT)、离散余弦变换(DCT)和奇异值分解(SVD)相结合的方法,在Matlab环境中实现水印的嵌入与提取。该技术通过在变换域中处理宿主图像和水印图像,增强了水印的鲁棒性和不可见性,适用于版权保护、数据认证等场景。文中详细阐述了算法流程、关键技术环节及其实现代码,展示了该方法在抵抗常见图像攻击方面的有效性。; 适合人群:具备数字图像处理基础,熟悉Matlab编程,从事信息安全、多媒体技术或相关领域研究的研究生及科研人员。; 使用场景及目标:①实现多幅图像作为水印的信息隐藏;②提升水印在复杂攻击下的鲁棒性与透明性;③为学术研究和工程应用提供可复现的Matlab代码参考; 阅读建议:建议读者结合Matlab代码逐步调试算法流程,深入理解DWT、DCT与SVD在水印技术中的协同作用,并可通过添加不同攻击测试来验证算法性能。
【SCI级别】多策略改进鲸鱼优化算法(HHWOA)和鲸鱼优化算法(WOA)在CEC2017测试集函数F1-F30寻优对比内容概要:本文主要介绍了多策略改进鲸鱼优化算法(HHWOA)与传统鲸鱼优化算法(WOA)在CEC2017测试集的30个基准函数(F1-F30)上的寻优性能对比研究。通过引入多种优化策略对原始WOA进行改进,提升了算法的收敛速度、全局搜索能力和避免陷入局部最优的能力。实验结果表明,HHWOA在多数测试函数上表现优于标准WOA,验证了所提改进策略的有效性。该研究为智能优化算法的性能提升提供了可行的技术路径,并适用于复杂工程优化问题的求解。; 适合人群:具备一定算法基础的研究生、科研人员及从事智能优化、人工智能、自动化等领域工作的工程技术人员,熟悉MATLAB编程者更佳。; 使用场景及目标:①用于解决复杂的数值优化问题,如工程参数优化、机器学习超参数调优等;②作为智能优化算法教学与研究的案例,帮助理解鲸鱼优化算法的原理及其改进方法;③为相关领域提供高性能优化工具的开发参考。; 阅读建议:建议结合提供的Matlab代码实现进行实验复现,深入理解算法细节与改进策略的作用机制,同时可通过更换测试函数或应用场景进一步拓展研究深度。
【负荷预测】基于VMD-CNN-LSTM的负荷预测研究(Python代码实现)内容概要:本文介绍了基于变分模态分解(VMD)、卷积神经网络(CNN)和长短期记忆网络(LSTM)相结合的VMD-CNN-LSTM模型在负荷预测中的研究与应用,采用Python代码实现。该方法首先利用VMD对原始负荷数据进行分解,降低序列复杂性并提取不同频率的模态分量;随后通过CNN提取各模态的局部特征;最后由LSTM捕捉时间序列的长期依赖关系,实现高精度的负荷预测。该模型有效提升了预测精度,尤其适用于非平稳、非线性的电力负荷数据,具有较强的鲁棒性和泛化能力。; 适合人群:具备一定Python编程基础和深度学习背景,从事电力系统、能源管理或时间序列预测相关研究的科研人员及工程技术人员,尤其适合研究生、高校教师及电力行业从业者。; 使用场景及目标:①应用于日前、日内及实时负荷预测场景,支持智慧电网调度与能源优化管理;②为研究复合型深度学习模型在非线性时间序列预测中的设计与实现提供参考;③可用于学术复现、课题研究或实际项目开发中提升预测性能。; 阅读建议:建议读者结合提供的Python代码,深入理解VMD信号分解机制、CNN特征提取原理及LSTM时序建模过程,通过实验调试参数(如VMD的分解层数K、惩罚因子α等)优化模型性能,并可进一步拓展至风电、光伏等其他能源预测领域。

62,629

社区成员

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

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