Gerador de Números Em Delphi

25/06/2021

0

Bom dia Mestre das Programação em Delphi. Eu andei pesquisando na internet um assunto referente a geração de sorteios da Mega Sena e em um site achei algo similar ao que eu tinha em mente, mais ainda não esta como eu imaginei. Vou posta o código abaixo. No código fiz uma mudança, lá no site que eu achei esse código no final ele colocava uma mensagem com o resultado, eu coloquei um Memo.

Pois bem o que estou querendo implementar nesse código é o seguinte: Eu colocar um TEdit (que receba apenas numero 1 .....), ai quando clica no botão ele gere a quantidade de sorteios que a pessoa digitou no Edit. Pois da forma que esta tem que fica clicando no botão para gerar os sorteios. Conto com a ajuda de vocês para fazer essa implementação no código. Desde já grato pela ajuda.

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 s : array[0..5] of Integer;
 i, a, b, z : Integer;
begin
  b := 7;
  Randomize;
  while b > 6 do
    begin
      b:= 0;
        for I := 0 to 5 do
          s[i] := Random(61);

       for I := 0 to 5 do
         begin
           a := s[i];
           if a = 0 then
            b := b + 1;
            for z := 0 to 5 do
              if a = s[z] then
                if a = s[z] then
                  b := b + 1;
         end;
    end;


    for z := 0 to 4 do
      begin
        for I := 0 to 4 do
          if s[i] > s[i+1] then
            begin
              a := s[i+1];
              s[i+1] := s[i];
              s[i] := a;
            end;
      end;


   Memo1.Lines.Add(
        IntToStr(s[0]) + ' - ' +
        IntToStr(s[1]) + ' - ' +
        IntToStr(s[2]) + ' - ' +
        IntToStr(s[3]) + ' - ' +
        IntToStr(s[4]) + ' - ' +
        IntToStr(s[5]));

end;

end.
Rubens Pena

Rubens Pena

Responder

Post mais votado

25/06/2021

Inclua seu código em um Loop For.

Exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
  s: array [0 .. 5] of Integer;
  i, a, b, z, j: Integer;
begin
  Memo1.Clear;

  for j := 0 to StrToIntDef(Edit1.Text, 0) - 1 do
  begin
    b := 7;
    Randomize;
    while b > 6 do
    begin
      b := 0;
      for i := 0 to 5 do
        s[i] := Random(61);

      for i := 0 to 5 do
      begin
        a := s[i];
        if a = 0 then
          b := b + 1;
        for z := 0 to 5 do
          if a = s[z] then
            if a = s[z] then
              b := b + 1;
      end;
    end;

    for z := 0 to 4 do
    begin
      for i := 0 to 4 do
        if s[i] > s[i + 1] then
        begin
          a := s[i + 1];
          s[i + 1] := s[i];
          s[i] := a;
        end;
    end;

    Memo1.Lines.Add(IntToStr(s[0]) + ' - ' + IntToStr(s[1]) + ' - ' + IntToStr(s[2]) + ' - ' + IntToStr(s[3]) + ' - ' +
      IntToStr(s[4]) + ' - ' + IntToStr(s[5]));
  end;
end;

Natanael Ferreira

Natanael Ferreira
Responder

Mais Posts

25/06/2021

Emerson Nascimento

tente algo assim:
procedure TForm5.Button1Click(Sender: TObject);
var
  Aposta: array of integer; // neste momento não sei quantos números serão sorteados
  NumeroDeApostas, NumerosPorAposta: integer;
  Sorteios, Sorteado: integer;
  AddMemo, NumerosSorteados: integer;
  strAposta: string;

  function ExisteNumero(Numero: integer): boolean;
  var
    iBusca: integer;
  begin
    Result := False;
    for iBusca := Low(Aposta) to High(Aposta) do
      if Aposta[iBusca] = Numero then
      begin
        Result := True;
        exit;
      end;
  end;
begin
  Randomize;

  MemoApostas.Clear; // limpa o memo
  NumeroDeApostas := SpinEdit1.Value; // quantidade de apostas a serem geradas
  NumerosPorAposta := SpinEdit2.Value; // quantidade de números por aposta
  SetLength(Aposta, NumerosPorAposta);

  for Sorteios := 1 to NumeroDeApostas do
  begin
    NumerosSorteados := 0;

    while NumerosSorteados < NumerosPorAposta do
    begin
      Sorteado := Random(60)+1; // sorteia de 1 a 60
      if not ExisteNumero(Sorteado) then
      begin
        Aposta[NumerosSorteados] := Sorteado;
        Inc(NumerosSorteados);
      end;
    end;

    strAposta := '';
    for AddMemo := Low(Aposta) to High(Aposta) do
    begin
      if strAposta <> EmptyStr then
        strAposta := strAposta + ', ';

      strAposta := strAposta + IntToStr(Aposta[AddMemo]);
      Aposta[AddMemo] := 0; // limpa o conteúdo da aposta
    end;

    MemoApostas.Lines.Add( strAposta );
  end;
end;
Responder

26/06/2021

Rubens Pena

Bom noite mestres da Programação em Delphi. Gostaria de Agradecer Natanael Ferreira e Emerson Nascimento, por terem tirado um tempo do seu tempo para me ajudar com esse código, testei ambos e salvei ambos em forms separados.

Agora o código que Emerson Nascimento passou é como se ele tivesse interpretado 100% a minha linha de pensamento, ficou show, reduziu bastante as linhas que estava no código inicial, sem falar esse componente do SpinEdit (muito bom ele), esse código servira para as demais modalidades.

Muito obrigado a ambos.
Responder

27/06/2021

Rubens Pena

tente algo assim:
procedure TForm5.Button1Click(Sender: TObject);
var
  Aposta: array of integer; // neste momento não sei quantos números serão sorteados
  NumeroDeApostas, NumerosPorAposta: integer;
  Sorteios, Sorteado: integer;
  AddMemo, NumerosSorteados: integer;
  strAposta: string;

  function ExisteNumero(Numero: integer): boolean;
  var
    iBusca: integer;
  begin
    Result := False;
    for iBusca := Low(Aposta) to High(Aposta) do
      if Aposta[iBusca] = Numero then
      begin
        Result := True;
        exit;
      end;
  end;
begin
  Randomize;

  MemoApostas.Clear; // limpa o memo
  NumeroDeApostas := SpinEdit1.Value; // quantidade de apostas a serem geradas
  NumerosPorAposta := SpinEdit2.Value; // quantidade de números por aposta
  SetLength(Aposta, NumerosPorAposta);

  for Sorteios := 1 to NumeroDeApostas do
  begin
    NumerosSorteados := 0;

    while NumerosSorteados < NumerosPorAposta do
    begin
      Sorteado := Random(60)+1; // sorteia de 1 a 60
      if not ExisteNumero(Sorteado) then
      begin
        Aposta[NumerosSorteados] := Sorteado;
        Inc(NumerosSorteados);
      end;
    end;

    strAposta := '';
    for AddMemo := Low(Aposta) to High(Aposta) do
    begin
      if strAposta <> EmptyStr then
        strAposta := strAposta + ', ';

      strAposta := strAposta + IntToStr(Aposta[AddMemo]);
      Aposta[AddMemo] := 0; // limpa o conteúdo da aposta
    end;

    MemoApostas.Lines.Add( strAposta );
  end;
end;

Boa tarde mestre. Com relação aos números saírem na ordem crescente, poderia fazer essa pequena alteração ai no seu código para mim?
E aproveitando o momento acrescentar uma numeração das linhas.
Exemplo:
01: 5-10-11-23-28-35
02: 11-22-24-25-58-60
03: 7-14-21-28-35-42
.
.
.
.

Obrigado pela atenção...
Responder

28/06/2021

Emerson Nascimento

segue...
procedure TForm5.Button1Click(Sender: TObject);
var
  Aposta: TStringList;
  NumeroDeApostas, NumerosPorAposta: integer;
  Sorteios, AddMemo: integer;
  strSorteado, strAposta: string;
begin
  Randomize; // o correto é colocar no OnCreate do form, porque precisa ser chamado apenas 1 vez

  MemoApostas.Clear; // limpa o memo
  NumeroDeApostas := SpinEdit1.Value; // quantidade de apostas a serem geradas
  NumerosPorAposta := SpinEdit2.Value; // quantidade de números por aposta
  Aposta := TStringList.Create; // cria a aposta

  for Sorteios := 1 to NumeroDeApostas do
  begin
    Aposta.Clear; // limpa a aposta
    while Aposta.Count < NumerosPorAposta do
    begin
      strSorteado := FormatFloat('00', Random(60)+1); // sorteia de 1 a 60
      if Aposta.IndexOf(strSorteado) < 0 then
        Aposta.Add(strSorteado);
    end;
    Aposta.Sort; // ordena os números da aposta

    strAposta := '';
    for AddMemo := 0 to Aposta.Count-1 do
    begin
      if strAposta <> EmptyStr then
        strAposta := strAposta + ', ';

      strAposta := strAposta + Aposta[AddMemo];
    end;

    MemoApostas.Lines.Add( strAposta );
  end;
end;

Responder

28/06/2021

Rubens Pena

segue...
procedure TForm5.Button1Click(Sender: TObject);
var
  Aposta: TStringList;
  NumeroDeApostas, NumerosPorAposta: integer;
  Sorteios, AddMemo: integer;
  strSorteado, strAposta: string;
begin
  Randomize; // o correto é colocar no OnCreate do form, porque precisa ser chamado apenas 1 vez

  MemoApostas.Clear; // limpa o memo
  NumeroDeApostas := SpinEdit1.Value; // quantidade de apostas a serem geradas
  NumerosPorAposta := SpinEdit2.Value; // quantidade de números por aposta
  Aposta := TStringList.Create; // cria a aposta

  for Sorteios := 1 to NumeroDeApostas do
  begin
    Aposta.Clear; // limpa a aposta
    while Aposta.Count < NumerosPorAposta do
    begin
      strSorteado := FormatFloat('00', Random(60)+1); // sorteia de 1 a 60
      if Aposta.IndexOf(strSorteado) < 0 then
        Aposta.Add(strSorteado);
    end;
    Aposta.Sort; // ordena os números da aposta

    strAposta := '';
    for AddMemo := 0 to Aposta.Count-1 do
    begin
      if strAposta <> EmptyStr then
        strAposta := strAposta + ', ';

      strAposta := strAposta + Aposta[AddMemo];
    end;

    MemoApostas.Lines.Add( strAposta );
  end;
end;


Show de Bola, Obrigado mestre. Mais uma vez Obrigado Pela Ajuda.
Responder

26/09/2021

Rubens Pena

segue...
procedure TForm5.Button1Click(Sender: TObject);
var
  Aposta: TStringList;
  NumeroDeApostas, NumerosPorAposta: integer;
  Sorteios, AddMemo: integer;
  strSorteado, strAposta: string;
begin
  Randomize; // o correto é colocar no OnCreate do form, porque precisa ser chamado apenas 1 vez

  MemoApostas.Clear; // limpa o memo
  NumeroDeApostas := SpinEdit1.Value; // quantidade de apostas a serem geradas
  NumerosPorAposta := SpinEdit2.Value; // quantidade de números por aposta
  Aposta := TStringList.Create; // cria a aposta

  for Sorteios := 1 to NumeroDeApostas do
  begin
    Aposta.Clear; // limpa a aposta
    while Aposta.Count < NumerosPorAposta do
    begin
      strSorteado := FormatFloat('00', Random(60)+1); // sorteia de 1 a 60
      if Aposta.IndexOf(strSorteado) < 0 then
        Aposta.Add(strSorteado);
    end;
    Aposta.Sort; // ordena os números da aposta

    strAposta := '';
    for AddMemo := 0 to Aposta.Count-1 do
    begin
      if strAposta <> EmptyStr then
        strAposta := strAposta + ', ';

      strAposta := strAposta + Aposta[AddMemo];
    end;

    MemoApostas.Lines.Add( strAposta );
  end;
end;


Bom dia. Teria como fazer o sorteio com base nos números selecionados? Estou enviando o font do projeto pra que possa ser analisado um jeito de sortear em com base nas dezenas selecionada.

Link do font: ( https://mega.nz/file/DIpnHI4Q#q9fIvyq60Y-CVikUNcjmNa7VGOtKoYMtQkxFZ6wG1Mk )

Com relação ao código se não der pra postar aqui envia no meu email : rubens.pena7@gmail.com, vai me ajudar bastante. desde já grato pela atenção.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar