1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
#include "gypsy.h"
#include <klocale.h>
#include "deck.h"
#include "cardmaps.h"
Gypsy::Gypsy( KMainWindow* tqparent, const char *name )
: Dealer( tqparent, name )
{
const int dist_x = cardMap::CARDX() * 11 / 10 + 1;
const int dist_y = cardMap::CARDY() * 11 / 10 + 1;
deck = Deck::new_deck(this, 2);
deck->move(10 + dist_x / 2 + 8*dist_x, 10 + 45 * cardMap::CARDY() / 10);
connect(deck, TQT_SIGNAL(clicked(Card*)), TQT_SLOT(slotClicked(Card *)));
for (int i=0; i<8; i++) {
target[i] = new Pile(i+1, this);
target[i]->move(10+dist_x*(8+(i/4)), 10 + (i%4)*dist_y);
target[i]->setAddType(Pile::KlondikeTarget);
}
for (int i=0; i<8; i++) {
store[i] = new Pile(9+i, this);
store[i]->move(10+dist_x*i, 10);
store[i]->setAddType(Pile::GypsyStore);
store[i]->setRemoveType(Pile::FreecellStore);
}
setActions(Dealer::Hint | Dealer::Demo);
}
void Gypsy::restart() {
deck->collectAndShuffle();
deal();
}
void Gypsy::dealRow(bool faceup) {
for (int round=0; round < 8; round++)
store[round]->add(deck->nextCard(), !faceup, true);
}
void Gypsy::deal() {
dealRow(false);
dealRow(false);
dealRow(true);
takeState();
}
Card *Gypsy::demoNewCards()
{
if (deck->isEmpty())
return 0;
dealRow(true);
return store[0]->top();
}
bool Gypsy::isGameLost() const {
if(!deck->isEmpty())
return false;
for(int i=0; i < 8; i++){
if(store[i]->isEmpty())
return false;
if(store[i]->top()->rank() == Card::Ace)
return false;
for(int j=0; j <8; j++){
if(!target[j]->isEmpty() &&
(store[i]->top()->suit()==target[j]->top()->suit()) &&
(store[i]->top()->rank()==(target[j]->top()->rank()+1)))
return false;
}
}
for(int i=0; i < 8; i++) {
Card *cnext=store[i]->top();
int indexi=store[i]->indexOf(cnext);
Card *cardi= 0;
do{
cardi=cnext;
if (indexi>0)
cnext=store[i]->at( --indexi );
for(int k=0; k <8; k++) {
if (i == k)
continue;
if((cardi->rank()+1 == store[k]->top()->rank()) &&
cardi->isRed() != store[k]->top()->isRed()){
// this test doesn't apply if indexi==0, but fails gracefully.
if(cnext->rank() == store[k]->top()->rank() &&
cnext->suit() == store[k]->top()->suit())
break; //nothing gained; keep looking.
return false;// TODO: look deeper, move may not be helpful.
}
}
} while((indexi>=0) && (cardi->rank()+1 == cnext->rank()) &&
(cardi->isRed() != cnext->isRed()));
}
return true;
}
static class LocalDealerInfo7 : public DealerInfo
{
public:
LocalDealerInfo7() : DealerInfo(I18N_NOOP("Gy&psy"), 7) {}
virtual Dealer *createGame(KMainWindow *tqparent) { return new Gypsy(tqparent); }
} gyfdi;
#include "gypsy.moc"
|