Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
 public bool CheckCrazy(BingoCardPatternMarkInfo marks, int count)
 {
     marks.best_away = count - marks.mark_index;
     if (marks.best_away == 0)
     {
         return(true);
     }
     return(false);
 }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        internal BingoCardPatternMarkInfo GetCurrentMark(int pattern_index)
        {
            if (pattern_index >= marks.Count)
            {
                marks.Add(new BingoCardPatternMarkInfo());
            }
            BingoCardPatternMarkInfo current_marks = marks[pattern_index];

            return(current_marks);
        }
Exemplo n.º 6
0
 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);
 }
Exemplo n.º 7
0
        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);
        }