1

我正在尝试在 Asp.net 2.0 (VB) 中创建一个典型的 Housie/Bingo 游戏票。但是,没有成功。票证包含 3 行 9 列。总共 27 个块,并且必须只有 15 个应该从这 27 个中填充。每列包含值,例如第一列应该在 1-10 之间,第二列必须有 11-20 之间的随机值。不管多少每列填写的块.. 1 是必须的,没有一个列应该是空白的,所有 9 列必须填写,有些填写了所有 3 个块,有些填写了 1 个,总共填写了 15 个块。用随机数..

伙计们这里是典型的housie票规格..请帮我生成这样的票。我已经尝试过,但是没有那么成功,我得到了整个列的空白和验证列.. 对系统造成了额外的负担。请帮我找到制作它的方法。

4

3 回答 3

5

你需要确定性算法

首先重新定义您的要求:

  1. 每列应至少有 1 个数字,因此任何列都不应完全空白
  2. 第一列的数字应为 1..10,第二列为 11..20,第三列为 21..30,依此类推,第九列的数字应为 81..90
  3. 填票只需15个号码
  4. 附加要求:每行应有 5 个数字

这就是我的做法:

  1. 首先选择9个随机数(满足第一个要求)
    • 1..10 - 此范围内的一个随机数
    • 11..20 - 此范围内的一个随机数
    • ...
    • 81..90 - 此范围内的一个随机数
  2. selectNums准备一个数字 1..90的数组 ( ) 并删除所有在步骤 1 中选择的
  3. 环形
    1. selectNums数组中获取一个随机数
    2. 将其添加到您的票中并将其从selectNumsaray中删除
    3. 如果选定的数字填充了三列,则从selectNums数组中删除该范围内的所有数字。
    4. 返回循环中的第 1 步

该算法将在循环中准确地执行 9 步 + 6 步,因此它是确定性的,哪个更适合处理器利用率。它还为您的票填满每列最多三个数字且不少于 1(如果我理解您的要求,因为问题中的英语太差)。

哟,当你选择随机数时,你总是选择一个介于 0 和selectNums数组长度之间的数字,这会给你在数组中的位置,你必须从中获取一个数字。

用于创建实际票证的附加功能

上述步骤将使您达到一个点,即您将从相同的十个数字范围中获得最多 3 个的 15 个数字。美好的。您现在要做的就是创建您的票证。

  1. 定义 3 个变量:row1Countrow2Count并将row3Count它们全部设置为 0。
  2. 从填满的列(所有三个数字)开始填写票证:
    1. 获取第一个完整列并将其填充到票证中,同时将所有三个变量都加一。
    2. selectNums数组中删除这些数字。
    3. 返回到步骤 2.1。
  3. 用带有两个数字的列填写工单:
    1. 获取前两个数字列。使用三种可能的填充方式(1&2、2&3、1&3)将它们填充到票证中。使用第一个排列填充第一对,第二个使用第二个排列,依此类推。不要忘记增加相应的行计数器变量。
    2. selectNums从数组中删除这两个数字
    3. 返回到步骤 3.1。
  4. 用单个数字列填写票证(只有一个数字):
    1. 从数组中获取第一个数字selectNums并将其放入计数最少的行中,然后放入该特定行的票中。当至少有两行具有相同计数时,您可以通过随机选择一个或取第一个(最快)来选择您喜欢的任何一个。
    2. selectNums数组中删除数字
    3. 回到 4.1。

这部分应该让您填写完整的票证,其中所有列至少有一个数字,所有行总共正好包含 5 个数字。

如果不允许较小的数字位于较大的数字之下,您始终可以在此过程中添加一个额外的步骤,并在其中包含多个数字的列中重新排序数字。

最后的观察

该解决方案已通过使用数组和计数器进行了简化。您当然可以创建一个功能丰富的完整对象模型,并为您提供所需的所有信息。例如,您可以有一个 Ticket 和 TicketColumn 类:

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; }

    ...
}

或类似的东西。这只是一个想法,即整个程序以面向对象的方式会更好。

于 2010-08-09T11:56:01.340 回答
0

我已经准备了一个与任意数量的玩家一起玩 Housie 的代码。它通知是否有人赢得了比赛,并在有人赢得满堂彩时终止

解决这个问题的方法是这样的;我准备了10个清单。每个列表有 3 个按升序排列的唯一随机数,范围从 10 到 20、20 到 30、...、80 到 90。接下来,我将 5 个随机列表中的第一个数字分配到顶行,第二个另外 5 个随机列表中的数字到中间行,另外 5 个随机列表中的第三个数字到底行。我这样做的目的是不重复数字,确保票的每一行只打印 5 个数字,每列的数字从上到下按升序排列

我在没有要打印的数字的地方使用了空字符串“ ”,并且我使用了星号/星号“ * ”标记告诉玩家他/她已在该票上标记了该数字!

这是一张样票;

<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'):            

然后我问玩家是否想标记。然后我确保玩家输入了一个存在于票证中并且也被调用的整数

它看起来像这样(标记后);

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' '   ']

注意整数 54 旁边有一个星号

然后询问用户是否想检查他/她是否赢了!关于获奖者的确认信息如下;

<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

我已确保所调用的数字不会重复(主板是一个列表,其数字范围从 1 到 90,每次调用一个数字时,都会从主板中删除 sam 随机数,同时给玩家标记的机会,代码保证号码出现在玩家的票中,号码不出现在主板上。如果玩家输入的号码不满足上述条件,它会不断询问,直到玩家输入正确的数字

这段代码的特点是它接受任意数量的玩家。它最初会询问您玩游戏的玩家人数,然后多次询问每个玩家的姓名

最后,当玩家赢得满堂彩时,代码会自动终止

这是我准备的代码;

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)
于 2020-04-22T13:31:09.487 回答
-1
$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],
                                ]);

}
于 2016-02-19T07:51:36.883 回答