Win2000的空当接龙算法
以下代码是反汇编 freecall 得到的代码。有需要的同志看看 :) 。
没有给出 -1 和 -2 局的算法,因为这两局是固定的,而且无解的牌局。
int gameNum = 1; // 牌局号
int cards[168], order[53];
int i,j,k;
for (i=0; i<168; i++)
cards[i] = -1;
for (i=0; i<=52; i++)
order[i] = i;
srand(gameNum);
for (i=0; i<52; i++)
{
j = rand() % order[52];
k = i/8 + (i & 7) * 21;
cards[k] = order[j];
order[j] = order[52-i-1];
--order[52];
}
for (i=0;i<168;i++)
{
if (cards[i] == -1)
printf("%-10d", -1);
else
{
k = ((cards[i]+1 % 13)+3) / 4;
k = k?k:13; // 计算牌面大小
printf("%-2d(%-2X) ", k, cards[i]);
}
}
牌的存储结构你可以通过打印出列表,对照着 freecall 游戏看的很清楚。
虽然得到了源代码,我却仍然不明白这样为什么会使牌局有解。:(