internal bool MarkNew(BingoCardPatternMarkInfo marks, int faces, int columns, int[] balls) { byte ball_num; bool marked = false; byte start; if (marks.mark_index > 0) { ball_num = marks.real_ball_index[marks.mark_index - 1]; ball_num++; start = marks.ball_index[marks.mark_index - 1]; start++; } else { ball_num = 0; start = 0; } for (byte n = start; n < balls.Length; n++) { if (balls[n] < 1 || balls[n] > 75) { continue; } if (MarkOne(marks, faces, columns, balls[n])) { marked = true; marks.real_ball_index[marks.mark_index - 1] = ball_num; marks.ball_index[marks.mark_index - 1] = n; } ball_num++; } return(marked); }
public bool CheckCrazy(BingoCardPatternMarkInfo marks, int count) { marks.best_away = count - marks.mark_index; if (marks.best_away == 0) { return(true); } return(false); }
internal bool MarkAll(int[] balls, int pattern_index) { int faces = card.GetLength(0); int columns = card.GetLength(2); BingoCardPatternMarkInfo current_marks = GetCurrentMark(pattern_index); current_marks.mark_index = 0; return(MarkNew(current_marks, faces, columns, balls)); }
public bool CheckPattern(BingoCardPatternMarkInfo marks, List <int> pattern_masks) { int card_mask; if (bitcounts == null) { int n; int count; bitcounts = new int[256]; for (n = 0; n < 256; n++) { count = 0; for (int b = 0; b < 8; b++) { if ((n & (1 << b)) != 0) { count++; } } bitcounts[n] = count; } } if (marks.mark_index > 0) { card_mask = marks.card_masks[marks.mark_index - 1]; } else { card_mask = 0x400; } if (marks.mark_index > 0) { foreach (int pattern_mask in pattern_masks) { int count = 0; int test_mask = (pattern_mask & ~card_mask); count += bitcounts[(test_mask >> (0 * 8)) & 0xFF]; count += bitcounts[(test_mask >> (1 * 8)) & 0xFF]; count += bitcounts[(test_mask >> (2 * 8)) & 0xFF]; count += bitcounts[(test_mask >> (3 * 8)) & 0xFF]; if (count < marks.best_away) { marks.best_away_pattern_mask = pattern_mask; marks.best_away = count; } if (count == 0) { return(true); } } } return(false); }
internal BingoCardPatternMarkInfo GetCurrentMark(int pattern_index) { if (pattern_index >= marks.Count) { marks.Add(new BingoCardPatternMarkInfo()); } BingoCardPatternMarkInfo current_marks = marks[pattern_index]; return(current_marks); }
public bool CheckBig3(BingoCardPatternMarkInfo marks) { if (marks.mark_index > 0) { int count = checkbits(0x7 & ~marks.card_masks[marks.mark_index - 1]); if (count < marks.best_away) { marks.best_away_pattern_mask = 0x7; marks.best_away = count; } if (count == 0) { return(true); } } return(false); }
bool MarkOne(BingoCardPatternMarkInfo marks, int faces, int columns, int ball) { bool marked = false; int card_bits = 0; if (ball < 1 || ball > 75) { return(false); } Lastball = ball; if (columns == 3) { int j = 0; card_bits = (marks.mark_index == 0) ? (0) : marks.card_masks[marks.mark_index - 1]; // 1 << 12 (the center free spot) for (int i = 0; i < 3; i++) { for (int face = 0; face < faces; face++) { if (card[face, j, i] == ball) { int thisbit = 1 << (i); if ((card_bits & thisbit) == 0) { // don't re-mark the same spot (dual action cards) marked = true; card_bits |= thisbit; } break; } } // have to check for not_changed later... } } else if (columns > 5 && card.GetLength(1) == 1) { card_bits = (marks.mark_index == 0) ? (0) : marks.card_masks[marks.mark_index - 1]; // 1 << 12 (the center free spot) // 6x1,7x1,8x1,9x1,10x1... columns are treated as upickem cards. for (int j = 0; j < columns; j++) { if (card[0, 0, j] == ball) { int thisbit = 1 << (j); if ((card_bits & thisbit) == 0) { // don't re-mark the same spot (dual action cards) marked = true; card_bits |= thisbit; } break; } } } else { card_bits = (marks.mark_index == 0) ? (1 << 12) : marks.card_masks[marks.mark_index - 1]; // 1 << 12 (the center free spot) int i = (ball - 1) / 15; for (int j = 0; j < 5; j++) { if (i == 2 && j == 2) { continue; } for (int face = 0; face < faces; face++) { if (card[face, i, j] == ball) { int thisbit = 1 << ((i * 5 + j)); if ((card_bits & thisbit) == 0) { // don't re-mark the same spot (dual action cards) marked = true; card_bits |= thisbit; } break; } } // have to check for not_changed later... } } if (marked) { marks.balls[marks.mark_index] = (byte)ball; marks.card_masks[marks.mark_index++] = card_bits; } return(marked); }