4 int AI_ComputeBet(Player player)
8 int numberOfKind[4] = { 0 }, high[4] = { 0 };
10 RuffGame * game = player.game;
11 Round * round = &game->rounds[game->round];
12 static const int betTable[10][25]=
14 {40,40,40,40,40,40,40,40,40,40,40,40,40,40,40, 40,40,40,40,40,40,40,40,40,40},
15 {40,40,40,40,40,40,40,40,40,40,40,40,40,40,40, 40,40,40,40,40,40,40,40,40,40},
16 {40,40,40,40,40,40,40,40,40,40,40,40,40,40,40, 40,40,40,40,40,40,40,40,40,40},
17 {40,40,40,40,40,45,45,45,45,45,45,45,45,45,45, 45,45,45,45,45,45,45,45,45,45},
18 {40,40,40,40,40,45,50,50,50,50,50,50,50,50,50, 50,50,50,50,50,50,50,50,50,50},
19 {40,40,40,40,40,45,50,55,60,60,60,60,60,60,60, 60,60,60,60,60,60,60,60,60,60},
20 {40,40,40,40,40,45,50,55,60,65,70,70,70,70,70, 70,70,70,70,70,70,70,70,70,70},
21 {40,40,40,40,40,45,50,55,60,65,70,75,80,85,85, 85,85,85,85,85,85,85,85,85,85},
22 {40,40,40,40,40,45,50,55,60,65,70,75,80,85,90, 95,95,95,95,95,95,95,95,95,95},
23 {100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100}
29 Card * card = &player.cards[c];
31 numberOfKind[card->kind] ++;
34 case Ace: high[card->kind] += 3; break;
35 case King: high[card->kind] += 2; break;
36 case Queen: high[card->kind] += 1; break;
39 highTotal = high[0] + high[1] + high[2] + high[3];
41 for(kind=0; kind<4; kind++)
43 if(betTable[numberOfKind[kind]][highTotal] > bet)
46 bet = betTable[numberOfKind[kind]][highTotal];
48 else if(betTable[numberOfKind[kind]][highTotal] == bet && kind)
50 if(trump == none || (numberOfKind[kind] > numberOfKind[trump] && high[kind] > high[trump]))
53 bet = betTable[numberOfKind[kind]][highTotal];
58 // Check if we're going to pass...
59 if(bet <= round->bet.howMuch && (player.id != round->shuffle || bet != round->bet.howMuch))
68 int AI_ComputeBet(Player player)
73 int numberOfKind[4] = { 0 }, high[4] = { 0 };
75 RuffGame * game = player.game;
76 Round * round = &game->rounds[game->round];
77 static const int betTable[67] =
79 0, 0, 0, 0, 0, 0, 0, 0,
80 0, 0, 0, 0, 0, 0, 0, 0,
81 5, 5, 5, 10, 10, 15, 15, 15,
82 20, 20, 20, 25, 25, 25, 30, 30,
83 30, 35, 35, 35, 40, 40, 40, 45,
84 45, 45, 50, 50, 50, 55, 55, 55,
85 60, 60, 60, 65, 65, 65, 70, 70,
86 70, 75, 75, 75, 80, 80, 80, 85,
89 static const int kindTable[37] =
93 15, 15, 20, 20, 20, 25,
94 25, 25, 30, 30, 30, 35,
95 35, 35, 40, 40, 40, 45,
96 50, 55, 60, 65, 70, 75,
97 80, 85, 90, 95, 100, 100
105 Card * card = &player.cards[c];
107 numberOfKind[card->kind] ++;
108 high[card->kind] += card->number;
110 highTotal = high[0] + high[1] + high[2] + high[3];
112 for(kind=0; kind<(Kind)4; kind++)
114 if(numberOfKind[kind] >= 3 &&
115 (trump == none || high[kind] > high[trump] || (high[kind] == high[trump] && numberOfKind[kind] > numberOfKind[trump])))
119 kindScore = kindTable[high[trump]];
120 switch(numberOfKind[trump])
122 case 3: kindScore = Min(kindScore, 20); break;
123 case 4: kindScore = Min(kindScore, 40); break;
124 case 5: kindScore = Min(kindScore, 50); break;
125 case 6: kindScore = Min(kindScore, 60); break;
126 case 7: kindScore = Min(kindScore, 70); break;
127 case 8: kindScore = Min(kindScore, 80); break;
130 if(trump == none || betTable[highTotal] > betTable[highTotal - high[trump]] + kindScore)
133 bet = betTable[highTotal];
136 bet = betTable[highTotal - high[trump]] + kindTable[high[trump]];
139 if(bet < 40) bet = 0;
141 // Check if we're going to pass...
142 if(bet <= round->bet.howMuch && (player.id != round->shuffle || bet != round->bet.howMuch))
144 else if(player.id == round->shuffle)
145 bet = round->bet.howMuch ? round->bet.howMuch : 40;
147 player.trump = trump;
152 void AI_RequestBet(Player player)
154 Player_PlaceBet(player, AI_ComputeBet(player));
157 void AI_RequestTrump(Player player)
159 Player_ChoseTrump(player, player.trump);
162 static bool CardMaster(Player player, Card card)
165 for(c = ace; c > card.number; c--)
166 if(player.left[card.kind][c])
171 static bool DoesNotMakeNude(Player player, Card whichCard)
177 Card * card = &player.cards[c];
178 if(card->kind == whichCard.kind &&
179 card->number != whichCard.number &&
180 card->number != ace &&
181 card->number != _10 &&
188 static bool AloneInKind(Player player, Card whichCard)
193 Card * card = &player.cards[c];
194 if(card->kind == whichCard.kind && card->number != whichCard.number)
200 enum TrumpFlag { AnyCard, NoTrump, PutTrump, Alone, DontNudify };
202 static int Discard(Player player, char * numbers, TrumpFlag trumpFlag)
204 RuffGame * game = player.game;
205 Round * round = &game->rounds[game->round];
206 Kind trump = round->bet.trump;
207 Kind kindRequested = game->played[game->start].kind;
209 for(card = 0; numbers[card]; card++)
214 switch(numbers[card])
216 case '5': number = _5; break; // AUTOCOMPLETE BUG ON number =
217 case '7': number = _7; break;
218 case '8': number = _8; break;
219 case '9': number = _9; break;
220 case 'T': number = _10; break;
221 case 'J': number = jack; break;
222 case 'Q': number = queen; break;
223 case 'K': number = king; break;
224 case 'A': number = ace; break;
228 Card * card = &player.cards[c];
229 if(card->number == number && RUFF_Legal(game, player, c))
233 case AnyCard: return c;
235 if(trump == kindRequested || card->kind != trump)
239 if(card->kind == trump)
243 if(AloneInKind(player,card))
247 if(DoesNotMakeNude(player,card))
257 void AI_RequestCard(Player player)
259 RuffGame * game = player.game;
260 Round * round = &game->rounds[game->round];
261 int cardPlayed = None;
262 Kind trump = round->bet.trump;
263 Kind kindRequested = game->played[game->start].kind;
264 PlayerPosition partner = (player.id + 2) % 4;
265 bool trumpLeft = player.trumpLeft[(player.id+1) % 4] || player.trumpLeft[(player.id+3) % 4];
266 int maxScore, points;
267 PlayerPosition winner = RUFF_HandWinner(game, &points, &maxScore);
268 // Master if ignoring cards in my hands
269 bool master = (winner != none) ? CardMaster(player, &game->played[winner]) : false;
270 Kind winnerKind = game->played[winner].kind;
272 int turn = game->turn - game->start;
275 // Count the remaining trump
280 if(!player.left[trump][c])
282 if(count == 9) trumpLeft = false; // AUTOCOMPLETE BUG ON = IF ONLY } AFTER
285 if(turn < 0) turn += 4;
292 Card * card = &player.cards[c];
293 int score = RUFF_CardScore(game, card->kind, card->number);
294 if(score > maxScore && RUFF_Legal(game, player, c) && card->kind == kindRequested)
303 Logf("Player %d thinking:\n", player.id);
304 Logf(" round = %d, turn = %d, partner = %d, winner = %d, trumpLeft = %d, maxScore = %d, master = %d, plus = %d\n",
305 game->round, turn, partner, winner, trumpLeft, maxScore, master, plus);
311 if(player.id == round->bet.player && trumpLeft)
313 // J'ai pris alors je fais tomber l'atout
314 // if((cardPlayed = Discard(player, "AKQJ9875T", PutTrump)) != None) break;
315 if((cardPlayed = Discard(player, "AKQJ987", PutTrump)) != None) break;
317 // Je mets ma plus grosse carte (pas des points)
318 if((cardPlayed = Discard(player, "AKQJ9875T", NoTrump)) != None) break;
319 // Je n'ai pas d'atout alors je mets ma plus grosse carte (pas des points)
320 if((cardPlayed = Discard(player, "AKQJ9875T", AnyCard)) != None) break;
323 // Je peux battre la carte sur la table alors je la bats
326 if((cardPlayed = Discard(player, "AKQJ9875T", NoTrump)) != None) break;
328 // Je ne peux pas battre la carte alors j'essaie de couper ou je mets ma plus petite carte
331 if(winnerKind != trump)
333 if((cardPlayed = Discard(player, "789JQKT5A", PutTrump)) != None) break;
335 if((cardPlayed = Discard(player, "789J", Alone)) != None) break;
336 if((cardPlayed = Discard(player, "789J", DontNudify)) != None) break;
337 if((cardPlayed = Discard(player, "789JQ5KTA", AnyCard)) != None) break;
341 // Mon partner est maitre alors je lui donne des points
342 if(winner == partner && master)
344 if((cardPlayed = Discard(player, "T5", NoTrump)) != None) break;
345 if((cardPlayed = Discard(player, "T5", AnyCard)) != None) break;
347 if((cardPlayed = Discard(player, "789JQ", NoTrump)) != None) break;
349 if((cardPlayed = Discard(player, "789JQ", AnyCard)) != None) break;
351 if((cardPlayed = Discard(player, "KA", NoTrump)) != None) break;
352 if((cardPlayed = Discard(player, "KA", AnyCard)) != None) break;
354 // Je peux battre la carte sur la table alors je la bats
357 if((cardPlayed = Discard(player, "AKQJ9875T", NoTrump)) != None) break;
359 // Je ne peux pas battre la carte alors j'essaie de couper ou je mets ma plus petite carte
362 if(winnerKind != trump)
364 if((cardPlayed = Discard(player, "T5789JQKA", PutTrump)) != None) break;
366 if((cardPlayed = Discard(player, "789J", Alone)) != None) break;
367 if((cardPlayed = Discard(player, "789J", DontNudify)) != None) break;
368 if((cardPlayed = Discard(player, "789JQ5KTA", AnyCard)) != None) break;
372 // Mon partner remporte alors je lui donne des points
373 if(winner == partner)
375 if((cardPlayed = Discard(player, "T5", NoTrump)) != None) break;
376 if((cardPlayed = Discard(player, "T5", AnyCard)) != None) break;
378 if((cardPlayed = Discard(player, "789JQ", NoTrump)) != None) break;
379 if((cardPlayed = Discard(player, "789JQ", AnyCard)) != None) break;
381 if((cardPlayed = Discard(player, "KA", NoTrump)) != None) break;
382 if((cardPlayed = Discard(player, "KA", AnyCard)) != None) break;
384 // Je peux battre la carte sur la table alors je la bats
387 if((cardPlayed = Discard(player, "AKQJ9875T", NoTrump)) != None) break;
389 // Je ne peux pas battre la carte alors j'essaie de couper ou je mets ma plus petite carte
392 if(winnerKind != trump)
394 if((cardPlayed = Discard(player, "T5789JQKA", PutTrump)) != None) break;
396 if((cardPlayed = Discard(player, "789J", Alone)) != None) break;
397 if((cardPlayed = Discard(player, "789J", DontNudify)) != None) break;
399 if((cardPlayed = Discard(player, "789JQ5KTA", AnyCard)) != None) break;
403 Player_PlayCard(player, cardPlayed);
406 void AI_InformNewRound(Player player, int round, PlayerPosition shuffle, Card * cards)
410 for(kind = 0; kind<4; kind++)
412 player.left[kind][c] = true;
413 player.trumpLeft[0] = player.trumpLeft[1] =
414 player.trumpLeft[2] = player.trumpLeft[3] = true;
418 if(player.cards[c].kind != none)
419 player.left[player.cards[c].kind][player.cards[c].number] = false;
423 void AI_InformBet(Player player, int who, int howMuch)
428 void AI_InformTrump(Player player, Kind trump)
433 void AI_InformCardPlayed(Player player, int who, Kind kind, Number number)
435 RuffGame * game = player.game;
436 Round * round = &game->rounds[game->round];
438 player.left[kind][number] = false;
439 // Mark this player as not having trump anymore
440 if(game->played[game->start].kind == round->bet.trump &&
441 kind != round->bet.trump)
442 player.trumpLeft[who] = false;
443 // Assume no more trump if a 10 is discarded
444 else if(game->played[game->start].kind == round->bet.trump && number == _10)
445 player.trumpLeft[who] = false;
448 void AI_InformEndOfRound(Player player, int score0, int score1)