开发者

Complex process of making a typical Housie/Bingo game ticket?

开发者 https://www.devze.com 2023-01-10 23:06 出处:网络
I\'m trying to create a typical Housie/Bingo Game ticket in Asp.net 2.0 (VB). But, not being succeeded. 开发者_JS百科Ticket contains 3 row with 9 columns. Total 27 blocks, and it must be only 15 shoul

I'm trying to create a typical Housie/Bingo Game ticket in Asp.net 2.0 (VB). But, not being succeeded. 开发者_JS百科Ticket contains 3 row with 9 columns. Total 27 blocks, and it must be only 15 should be fill outta those 27. and each column contains value like 1st column should be between 1-10 and 2nd must have random values between 11-20.. It doesn't matter how many blocks filled in each column.. 1 is must, no single column should be blank, all 9 columns must be filled, some have all 3 blocks filled, some have 1 with total of 15 blocks filled in whole ticket. with random numbers..

Guys here was the typical housie ticket specification.. Please help me out generating a ticket like this. I've tried but, not being that much succeeded, I get whole column blank and validating columns.. takes extra load on system. please find me the way to make it.


You need deterministic algorithm

First redefine your requirements:

  1. Every column should have at least 1 number, so no column should be completely blank
  2. First column should have numbers from 1..10, second 11..20, third 21..30 and so on to the ninth column having from 81..90
  3. only 15 numbers needed to fill the ticket
  4. Additional requirement: Every row should have 5 numbers

This is how I'd do it:

  1. First select 9 randoms (to satisfy first requirement)
    • 1..10 - one random number from this range
    • 11..20 - one random number from this range
    • ...
    • 81..90 - one random number from this range
  2. Prepare an array (selectNums) of numbers 1..90 and remove all selected in step 1
  3. Loop
    1. get a random number from the selectNums array
    2. add it to your ticket and remove it from the selectNums aray
    3. if selected number fills a column of three then remove all numbers from that range from the selectNums array.
    4. Go back to step 1 in the loop

This algorithm will take you exactly 9 steps + 6 steps in the loop so it's deterministic which is better for the processor utilization. And it also fills your ticket with up to three numbers per column and not less than 1 (if I understood your requirements due too poor english in the question).

Yo when you select random numbers you always select a number between 0 and selectNums array length which will give you position in array where you have to take a number from.

Additonal functionality to create the actual ticket

Above steps will get you to a point where you will get exactly 15 numbers with at most 3 from the same ten numbers range. Fine. All you have to do now is to create your ticket.

  1. define 3 variables: row1Count, row2Count and row3Count and set them all to 0.
  2. Fill the ticket by starting from the fully filled columns (all three numbers):
    1. Get the first full column and fill it up in the ticket while also incrementing all three variables by one.
    2. Remove these numbers from the selectNums array.
    3. Go back to step 2.1.
  3. Fill the ticket with columns with two numbers:
    1. Get the first two numbers column. Fill them in the ticket by using three possible permutations of filling them in (1&2, 2&3, 1&3). Fill the first pair using the first permutation, second one with the second and so on. Don't forget to increment corresponding row counter variables.
    2. remove those two numbers from selectNums array
    3. Go back to step 3.1.
  4. Fill the ticket with single number columns (those that have just one number):
    1. Get the first number from selectNums array and put it in the row with the smallest count and put in on the ticket in that particular row. When there are at least two rows with the same count, you can select whichever you prefer by either selecting one randomly or taking the first one (quickest).
    2. Remove the number from selectNums array
    3. Go back to 4.1.

This part should get you to fully filled ticket with all columns having at least one number and all rows containing exactly 5 numbers in total.

If smaller numbers are not allowed to be under larger ones, you can always add an additional step to this process and reorder numbers in those columns that have more than just one number in it.

One final observation

This solution has been simplified by using arrays and counters. You could of course create a complete object model that would be functionally rich and would provide you all the info you need. You could for instance have a Ticket and TicketColumn classes:

public class TicketColumn
{
    public int Count { get; }
    public int? FirstRowValue { get; set; }
    public int? SecondRowValue { get; set; }
    public int? ThirdRowValue { get; set; }

    ...
    public void Reorder() { ... }
}

public class Ticket
{
    public TicketColumn[] Columns

    public int FirstRowCount { get; private set; }
    public int SecondRowCount { get; private set; }
    public int ThirdRowCount { get; private set; }

    ...
}

Or something similar. This is just an idea that this whole program would be better off in object oriented manner.


I have prepared a code for playing Housie with an arbitrary number of players. It informs whether anyone has won the game and terminates when someone has won the full house

The approach given to this problem goes like this; I have prepared 10 lists. Each list has with 3 unique random numbers arranged in ascending order, ranging from 10 to 20, 20 to 30, ..., 80 to 90. Next, I have assigned the first number in 5 random lists to the top row, the second number in another 5 random lists to the middle row, and the third number in another 5 random lists to the bottom row. I have done this with the intention of not repeating the numbers, ensuring that only 5 numbers are printed on each row of the ticket, each column has it's number in an ascending order form top to bottom

I have used empty strings ' ' to be printed where there are no numbers to be printed and I have used the asterisk/star ' * ' mark to tell to the player that he/she has marked that number on that ticket!

Here's a sample ticket;

<player name>, your ticket is as follows:-

['   ' '   ' '   ' '33' '   ' '54' '66' '72' '83']
['   ' '12' '27' '   ' '45' '57' '   ' '   ' '88']
['8' '19' '29' '   ' '49' '   ' '   ' '75' '   ']

<player name>, do you want to mark?(Type 'Yes' or 'No'):            

I have then asked whether the player wants to mark. Then I ensure that the player inputs an integer present in the ticket and which has also been called

It's looks like this(after marking);

The lucky number is 54!


<player name>, your ticket is as follows:-

['   ' '   ' '   ' '33' '   ' '54' '66' '72' '83']
['   ' '12' '27' '   ' '45' '57' '   ' '   ' '88']
['8' '19' '29' '   ' '49' '   ' '   ' '75' '   ']

<player name>, do you want to mark?(Type 'Yes' or 'No'): Yes

<player name>, type the number you want to mark:  54


<player name>, your ticket is as follows:-

['   ' '   ' '   ' '33' '   ' '*54' '66' '72' '83']
['   ' '12' '27' '   ' '45' '57' '   ' '   ' '88']
['8' '19' '29' '   ' '49' '   ' '   ' '75' '   ']

Notice that there is an asterisk mark beside the integer 54

It then asks whether the user wants to check if he/she has won! The confirmatory message regarding the winners is as follows;

<player name>, do you want to check if you have won?(Type 'Yes' or 'No'): Yes

Sorry <player name>, you have not won!

   Jaldi 5 Winner: None   
   Top row winner: None   
Middle row winner: None
Bottom row winner: None
Full house winner: None

I have ensured that the numbers called don't get repeated(The main board is a list with numbers ranging from 1 to 90 and each time a number is called the sam random number is removed from the main board and while the player is given the opportunity to mark, the code ensures that the number is present in the player's ticket and the number is not present in the main board. If the player inputs a number which doesn't satisfy the above mentioned conditions, it keeps on asking until the player input a correct number

The speciality of this code is that it accepts arbitrary number of players. It initially asks you the number of players playing the game and then asks that many times the name of each individual player

Finally, the code automatically gets terminated when a player wins the full house

Here's the code I've prepared;

import random

import numpy as np

def list_of_ten(lower_limit, upper_limit):
    yield list(str(number) for number in range(lower_limit, upper_limit))

def replace(numbers_list, row, collection):
    for element in numbers_list:
        if len(element) == 1:
            collection[row][0] = element
        elif int(element) == 90:
            collection[row][-1] = element
        else:
            collection[row][int(element[0])] = element

def check_number(number, array):

    row_counter = 0
    column_counter = 0

    for row in array:
        if number in row:
            for element in row:
                if element == number:
                    return True, tuple((row_counter, column_counter))
                column_counter += 1
        row_counter += 1
    else:
        return False, None

def class_instantiation(player_count, class_to_create):

    names_dict = dict()

    counter = 0

    while counter < int(player_count):

        temporaray_input = input(f"Enter the name of the player{counter + 1}: ")
        names_dict[temporaray_input.lower()] = class_to_create(temporaray_input)

        counter += 1

    return names_dict        

def call_method(diction):
    for tup in diction.items():
        diction[tup[0]].display_ticket()
        diction[tup[0]].mark()  

def call_numeral(diction):
    for tup in diction.items():
        return diction[tup[0]].call_number()

class Player:

    board = list(range(1, 91))

    jaldi_5_winner    = None
    top_row_winner    = None
    middle_row_winner = None
    bottom_row_winner = None
    full_house_winner = None

    def __init__(self, name):
        self.name = name

        self.full_list    = list()
        self.check_top    = list()
        self.check_middle = list()
        self.check_bottom = list()

        n1 = random.sample(next(list_of_ten( 1, 10)), 3)
        n2 = random.sample(next(list_of_ten(10, 20)), 3)
        n3 = random.sample(next(list_of_ten(20, 30)), 3)
        n4 = random.sample(next(list_of_ten(30, 40)), 3)
        n5 = random.sample(next(list_of_ten(40, 50)), 3)
        n6 = random.sample(next(list_of_ten(50, 60)), 3)
        n7 = random.sample(next(list_of_ten(60, 70)), 3)
        n8 = random.sample(next(list_of_ten(70, 80)), 3)
        n9 = random.sample(next(list_of_ten(80, 91)), 3)

        n1.sort()
        n2.sort()
        n3.sort()
        n4.sort()
        n5.sort()
        n6.sort()
        n7.sort()
        n8.sort()
        n9.sort()

        number_list = [n1, n2, n3, n4, n5, n6, n7, n8, n9]

        self.ticket = np.array([['   '] * 9] * 3)

        self.top_row    = [element[0] for element in random.sample(number_list, 5)]
        self.middle_row = [element[1] for element in random.sample(number_list, 5)]
        self.bottom_row = [element[2] for element in random.sample(number_list, 5)]

        replace(self.top_row, 0, self.ticket)
        replace(self.middle_row, 1, self.ticket)
        replace(self.bottom_row, 2, self.ticket)

    def display_ticket(self):
        print("\n\n" + f"{self.name}, your ticket is as follows:-" + "\n")
        print(self.ticket[0])
        print(self.ticket[1])
        print(self.ticket[2])

    def call_number(self):
        print(f"The lucky number is {Player.board.pop(Player.board.index(random.choice(Player.board)))}!")

    def mark(self):
        mark_it = input("\n" + f"{self.name}, do you want to mark?(Type 'Yes' or 'No'): ")
        while not mark_it.lower() == 'yes' and not mark_it.lower() == 'no':
            mark_it = input("\n" + f"{self.name}, please type 'Yes' or 'No' only: ")
        if mark_it.lower() == 'yes':
            mark_number = input("\n" + f"{self.name}, type the number you want to mark: " + " ")
            condition = check_number(mark_number, self.ticket)
            while not condition[0] or int(mark_number) in Player.board:
                mark_number = input("\n" + "Type a number present in your ticket which has also been called: ")
                condition = check_number(mark_number, self.ticket)
            if mark_number in self.ticket[0]:
                self.check_top.append(mark_number)
                self.full_list.append(mark_number)
            elif mark_number in self.ticket[1]:
                self.check_middle.append(mark_number)
                self.full_list.append(mark_number)
            else:
                self.check_bottom.append(mark_number)
                self.full_list.append(mark_number)
            self.ticket[condition[1][0]][condition[1][1]] = "*" + mark_number            
        self.display_ticket()
        winner_input = input("\n" + f"{self.name}, do you want to check if you have won?(Type 'Yes' or 'No'): ")
        while not winner_input.lower() == 'yes' and not winner_input.lower() == 'no':
            winner_input = input("\n" + f"{self.name}, please type 'Yes' or 'No' only: ")
        if winner_input.lower() == 'yes':
            if len(self.full_list) == 5 and Player.jaldi_5_winner == None:
                print("\n" + f"{self.name}, you have won jaldi 5!" + "\n")
                Player.jaldi_5_winner = self.name
            elif len(self.full_list) == 15 and Player.full_house_winner == None:
                print("\n" + f"Congratulations, {self.name}, you have won the game!" + "\n")
                Player.full_house_winner = self.name
            elif len(self.check_top) == 5 and Player.top_row_winner == None: 
                print("\n" + f"{self.name}, you have won the top row!" + "\n")
                Player.top_row_winner = self.name
            elif len(self.check_middle) == 5 and Player.middle_row_winner == None:
                print("\n" + f"{self.name}, you have won the middle row!" + "\n")
                Player.middle_row_winner = self.name
            elif len(self.check_bottom) == 5 and Player.bottom_row_winner == None:
                print("\n" + f"{self.name}, you have won the bottom row!" + "\n")
                Player.bottom_row_winner = self.name
            else:
                print("\n" + f"Sorry {self.name}, you have not won!" + "\n")
        print(f"   Jaldi 5 Winner: {Player.jaldi_5_winner}   ")
        print(f"   Top row winner: {Player.top_row_winner}   ")
        print(f"Middle row winner: {Player.middle_row_winner}")
        print(f"Bottom row winner: {Player.bottom_row_winner}")
        print(f"Full house winner: {Player.full_house_winner}")

no_of_players = input("How many players are going to play housie?: ")

players_dict = class_instantiation(no_of_players, Player)

while True:
    if Player.full_house_winner != None:
        break
    else:    
        call_numeral(players_dict)

        call_method(players_dict)


Hello might be a decade late but here is how I did it. It's in C#

using System;

 namespace HelloWorld
 {
  class Program
{
  public static void Main (String[] args)
    {
        for(int times=0;times<2;times++)
        {
            startGame();
            Console.WriteLine("******************************************************************");
        }
        
    }

     private static void startGame()
    {
        int[,] game = new int[3, 9];
        int occupancyLimit = 15;

        while (occupancyLimit > 0)
        {
            int i = getRandomNumber(3);
            int j = getRandomNumber(9);
            //Console.Write(i);
            //Console.Write(j);
            // Console.Write(game[i,j]+" ");
            int data = validateAndReturnNumber(i, j, game);
        
            if (data>0)
            {
                game[i, j] = data;
                occupancyLimit--;
                //Console.WriteLine(game[i,j]);
            }

        }
     for (int i = 0; i < game.GetLength(0); i++)
    {
        for (int j = 0; j < game.GetLength(1); j++)
        {
            Console.Write(game[i,j] + "\t");
        }
        Console.WriteLine();
    }
       
    } 

 
    private static  int validateAndReturnNumber(int i, int j, int[,] game)
    {
        //do not override existing elements in array
        if (game[i,j] != 0)
        {
            return -1;
        }
        //column cannot have more then two elements
        int columncounter = 0;
        for(int c=0;c<3;c++)
        {
            if(game[c,j]!=0)
            {
                columncounter++;
            }
        }
        if(columncounter>=2)
        {
            return -1;
        }
      /*
        //rows cannot have more 
     then two cells filled in and 
        //rows cannot have more 
         then two empty cells
      for(int columnIndex=0;columnIndex<=6;columnIndex++)
      {
          if(game[i,columnIndex+2]!=0)
          {
              return -1;
          }
      }
 */      
        // rows cannot have more then 5 elements
        int rowcounter = 0;
        for(int r=0;r<9;r++)
        {     
            if(game[i,r]!=0)
            {       
                rowcounter++;
            }
            
        }
        //Applying, rows cannot have more then 5 elements
        if(rowcounter>=5)
        {
            return -1;
        }

        //return getRandomNumberForColumn(j);
        int data = 0;
        Boolean isValueSet = false;
        do
        {
            data = getRandomNumberForColumn(j);
            isValueSet = isValueExistsInCol(game, i, j, data);
        } while (isValueSet);
        return data;
    }

    private static bool isValueExistsInCol(int[,] game, int i, int j, int data)
    {
        Boolean status = false;
        for(int k=0;k<3;k++)
        {
            if(game[k,j]==data)
            {
                status = true;
                break;
            }
        }
        return status;
    }

    private static int getRandomNumberForColumn(int high)
    {
      if(high==0)
        {
            high = 10;

        }
        else
        {
            high=(high + 1) * 10;
        }
        int low = high - 9;
        Random random = new Random();
        return random.Next(high-low)+low;
    }

    private static int getRandomNumber(int max)
    {
        Random random = new Random();
        int num=random.Next(max);
        return (num);
        
    }
}
  }


$arr = new SplFixedArray(27);

for($m=1;$m<=100000;$m++)
{
    in:
     $final_array  = array();
     foreach ( $arr as $key => $val )
     $final_array[ $key+1 ] = $val;

     $elements_array=array();
     foreach ( $arr as $key => $val )
     $elements_array[ $key+1 ] = $val;

    for($i=1;$i<=count($elements_array);$i++)
    {

      if($i==1 || $i==10 || $i==19 )
      {
        $elements_array[$i]=rand(1,9);
      }

      if($i==2 || $i==11 || $i==20 )
      {
        $elements_array[$i]=rand(10,19);
      }

      if($i==3 || $i==12 || $i==21 )
      {
        $elements_array[$i]=rand(20,29);
      }

      if($i==4 || $i==13 || $i==22 )
      {
        $elements_array[$i]=rand(30,39);
      }
      if($i==5 || $i==14 || $i==23 )
      {
        $elements_array[$i]=rand(40,49);
      }

      if($i==6 || $i==15 ||$i==24 )
      {
        $elements_array[$i]=rand(50,59);
      }

      if($i==7 || $i==16 ||$i==25 )
      {
        $elements_array[$i]=rand(60,69);
      }

      if($i==8 || $i==17 || $i==26 )
      {
        $elements_array[$i]=rand(70,79);
      }

      if($i==9 || $i==18 || $i==27)
      {
        $elements_array[$i]=rand(80,90);
      }
    }
    for($k=1;$k<=5;$k++)
    {
      $index1=rand(1,9);
      $final_array[$index1]=$elements_array[$index1];
    }
    $x1 = 0;
    $ar1=[];
    for($q=1;$q<=9;$q++)
    {
        if(isset($final_array[$q]))
        {
            $ar1[$x1]= $q;
            $x1++;
        }
    }
    loop:
    if($x1 != 5)
    {
        $in1 =rand(1,9);

        if(!in_array($in1, array_keys($ar1)))
        {
            $final_array[$in1]=$elements_array[$in1];
            $ar[$x1]= $in1;
            $x1++;

        }
        goto loop;
    }
    $z1=0;
    for($q=1;$q<=9;$q++)
    {
        if(isset($final_array[$q]))
        {
            $ar1[$x1]= $q;
            $z1++;
        }
    }
    if($z1 != 5)
    goto in;

    for($l=1;$l<=5;$l++)
    {
      $index2=rand(10,18);        
      $final_array[$index2]=$elements_array[$index2];

    }

    $x2 = 0;
    $ar2=[];
    for($q=10;$q<=18;$q++)
    {
        if(isset($final_array[$q]))
        {
            $ar2[$x2]= $q;
            $x2++;
        }
    }
    loop2:
    if($x2 != 5)
    {
        $in2 =rand(10,18);

        if(!in_array($in2, array_keys($ar2)))
        {
            $final_array[$in2]=$elements_array[$in2];
            $ar[$x2]= $in2;
            $x2++;

        }
        goto loop2;
    }
    $z2=0;
    for($q=10;$q<=18;$q++)
    {
        if(isset($final_array[$q]))
        {
            $ar1[$x1]= $q;
            $z2++;
        }
    }
    if($z2 != 5)
    goto in;

    for($n=1;$n<=5;$n++)
    {
      $index3=rand(19,27);

      $final_array[$index3]=$elements_array[$index3];

    }

    $x3 = 0;
    $ar3=[];
    for($q=19;$q<=27;$q++)
    {
        if(isset($final_array[$q]))
        {
            $ar3[$x3]= $q;
            $x3++;
        }
    }
    loop3:
    if($x3 != 5)
    {
        $in3 =rand(19,27);

        if(!in_array($in3, array_keys($ar3)))
        {
            $final_array[$in3]=$elements_array[$in3];
            $ar[$x3]= $in3;
            $x3++;

        }
        goto loop3;
    }
    $z3=0;
    for($q=19;$q<=27;$q++)
    {
        if(isset($final_array[$q]))
        {
            $ar3[$x3]= $q;
            $z3++;
        }
    }
    if($z3 != 5)
    goto in;

    DB::table('tambola')->insert(['a1'=>$final_array[1],
                                  'a2'=>$final_array[2],
                                  'a3'=>$final_array[3],
                                  'a4'=>$final_array[4],
                                  'a5'=>$final_array[5],
                                  'a6'=>$final_array[6],
                                  'a7'=>$final_array[7],
                                  'a8'=>$final_array[8],
                                  'a9'=>$final_array[9],
                                  'b1'=>$final_array[10],
                                  'b2'=>$final_array[11],
                                  'b3'=>$final_array[12],
                                  'b4'=>$final_array[13],
                                  'b5'=>$final_array[14],
                                  'b6'=>$final_array[15],
                                  'b7'=>$final_array[16],
                                  'b8'=>$final_array[17],
                                  'b9'=>$final_array[18],
                                  'c1'=>$final_array[19],
                                  'c2'=>$final_array[20],
                                  'c3'=>$final_array[21],
                                  'c4'=>$final_array[22],
                                  'c5'=>$final_array[23],
                                  'c6'=>$final_array[24],
                                  'c7'=>$final_array[25],
                                  'c8'=>$final_array[26],
                                  'c9'=>$final_array[27],
                                ]);

}
0

精彩评论

暂无评论...
验证码 换一张
取 消