我正在使用JavaScript编写扑克程序。我有一个Hand类,它具有“cards”,“value”和“valueCards”属性。 value属性是一个对应于手型的整数,valueCards是五个卡的数组,也对应于手型。例如,如果我的原始七张牌(包含在牌属性中)包含同花,则此值将翻转为6,而此.valueCards将仅等于等同于最高同花牌的五张牌。
我为每种手型设置了一种方法,如果检测到手型,则所有方法都会更改值和valueCards。我有一个名为getValue的值的访问器方法,所以当我创建一个方法来运行所有测试并保持最高的一个时,它看起来像这样:
POKER.Hand.prototype.getTrueValue = function () {
this.testStraightFlush();
if(this.value == POKER.HAND_TYPE.STRAIGHT_FLUSH){ return; }
this.testQuads();
if(this.value == POKER.HAND_TYPE.QUADS){ return; }
this.testFullHouse();
if(this.value == POKER.HAND_TYPE.FULL_HOUSE){ return; }
this.testFlush();
if(this.value == POKER.HAND_TYPE.FLUSH){ return; }
this.testStraight();
if(this.value == POKER.HAND_TYPE.STRAIGHT){ return; }
this.testTrips();
if(this.value == POKER.HAND_TYPE.TRIPS){ return; }
this.testTwoPair();
if(this.value == POKER.HAND_TYPE.TWO_PAIR){ return; }
this.testPair();
if(this.value == POKER.HAND_TYPE.PAIR){ return; }
this.getHighCards();
};
我的意思是,该方法运行正常。它只是困扰我,就像我应该以不同的方式做到这一点。这违反惯例吗?
答案 0 :(得分:3)
如果你改变你的this.test *函数,如果找到“hand”则返回true,否则返回false - 那么你可以做一些丑陋的事情,但不知何故令人满意,如
POKER.Hand.prototype.getTrueValue = function () {
this.testStraightFlush() ||
this.testQuads() ||
this.testFullHouse() ||
this.testFlush() ||
this.testStraight() ||
this.testTrips() ||
this.testTwoPair() ||
this.testPair() ||
this.getHighCards();
};
或强>
更改你的this.test *函数以仅检查this.found是否为false,如果找到一只手则设置this.found = true,所以你只需要
POKER.Hand.prototype.getTrueValue = function () {
this.found = false;
this.testStraightFlush();
this.testQuads();
this.testFullHouse();
this.testFlush();
this.testStraight();
this.testTrips();
this.testTwoPair();
this.testPair();
this.getHighCards();
};
答案 1 :(得分:1)
不是答案,但我会重新设计你的功能:
每个方法都应该返回道具本身:
stringVar DateNaissED := if isnull({ELEC_.DOB_DROIT}) then '' else {ELEC_.DOB_DROIT};
IF DateNaissED = '' THEN ''
ELSE
right(DateNaissED,2) + '/' + mid(DateNaissED,5,2) + '/' + left(DateNaissED,4)
通过这种方式,您将能够同时获得价值并检查其真实性。
function testFlush ()
{
if (...) return POKER.HAND_TYPE.FLUSH;
return null;
}
function testStraightFlush()
{
if (...) return POKER.HAND_TYPE.StraightFlush;
return null;
}
答案 2 :(得分:0)
只是为了它的乐趣,你可以重新设计这样的测试:
POKER.Hand.prototype.getTrueValue = function () {
var tests = [
[ "testStraightFlush", POKER.HAND_TYPE.STRAIGHT_FLUSH ],
[ "testQuads" , POKER.HAND_TYPE.QUADS ],
[ "testFullHouse" , POKER.HAND_TYPE.FULL_HOUSE ],
... etc...
];
for (var test in tests) {
var fun = this[tests[test][0]];
var val = tests[test][1];
fun();
if (this.value == val) {
return;
}
}
this.getHighCards();
};
或者函数可能只返回一个布尔值,因此你可以有一个更简单的测试数组
var tests = [
"testStraightFlush",
"testQuads" ,
"testFullHouse" ,
... etc...
];