我正在尝试制作一个简单的二十一点程序.可悲的是,我现在遇到了问题,产生了一副牌.
#include#include using namespace std; int main() { vector deck; char suit[] = {'h','d','c','s'}; char card[] = {'2','3','4','5','6','7','8','9','10','J','Q','K','A'}; for (int j=0; j<13; j++) { for (int i=0; i<4; i++) { deck.push_back(card[j] suit[i]); } } return 0; }
我知道我的问题始于我试图将值'10'分配给char.显然我无法编译,但我确定当我尝试将卡值分配给矢量卡时我也会收到错误,因为我使用了变量类型'char'.知道使用什么样的变量类型似乎在扼杀我.还有'deck.push_back(card [j] suit [i]);' 是卡和套装相结合的正确代码,还是你必须在卡[j]和套装[i]之间放一些东西?如果你们中的任何人能够带领我朝着正确的方向前进,我将不胜感激.另外作为一个侧面说明,这是家庭作业的一部分,所以请不要只给我整个代码块.谢谢你的帮助.
我认为您要使用的是枚举.它将使您的代码更清晰并解决您的问题.
enum SUIT { HEART, CLUB, DIAMOND, SPADE }; enum VALUE { ONE, TWO, THREE, ..., TEN, JACK, QUEEN, KING};
尝试使用套装和卡片作为成员创建卡类,并将其设置为一种矢量.喜欢
public class Card { public: Card(char suit, char card); char suit, card; }; int main() { vectordeck; char suit[] = {'h','d','c','s'}; char card[] = {'2','3','4','5','6','7','8','9','T','J','Q','K','A'}; for (int j=0; j<13; j++) { for (int i=0; i<4; i++) { deck.push_back(new Card(card[j],suit[i])); } } return 0; }
也使用枚举而不是西装和卡片中的字符会使它更清晰.
你建模的方式实际上取决于你想要做什么.
你是在创造一个真正的游戏吗?数据结构只需要支持游戏玩法吗?
如果是这样,我将创建一个卡片类,其中包含套装的枚举字段和面值的数字类型(值为1 - 13).
另一方面,如果您正在构建分析应用程序或AI播放器,那么该模型可能会略有不同.
几年前,我编写了一个模拟器来计算各种德州扑克场景中的概率,我希望它能够快速逼近数字.我从一个非常直接的模型(卡类,套装枚举等)开始,但经过大量的分析和优化后,我最终得到了一个按位表示.
每张卡的值为16位,其中十三个高位表示面值,两个低位表示套装,位[2]表示一个特殊标记,表示ace(仅用于表示ace的情况) ace可能出现在A2345笔直).
这里有一些例子:
0000000000001001 <---- Two of hearts 0100000000000011 <---- King of spades 1000000000000110 <---- Ace of diamonds ^^^^^^^^^^^^^ ("face-value" bits) ^ ("low-ace" flag) ^^ ("suit" bits)
你可以想象,通过这样的设计,它可以快速点亮成对,三种类型和直道(冲洗稍微有些棘手).
我不会涉及所有特定操作,但足以说这种模型每秒支持数百万次操作......
当然,请记住,我并不是在提倡你在简单的游戏实现中使用这样的设计.我最终得出这个设计的唯一原因是因为我需要进行大规模的统计模拟.
所以仔细想想你想要如何建模:
每张卡片
一名球员的手
整个甲板
桌子的状态......包括所有玩家的手(包括分开他们的初手的玩家),可能是六层鞋,弃牌堆等
整体应用程序模型以及应用程序的总体目标将在很大程度上决定最合适的数据结构类型.
玩得开心!!!
使用'T'而不是10.
您是否尝试用11替换J,用12替换Q和用13替换K?然后你可以使用int
egers而不是acters char
.稍后用适当的字母替换11-13.