Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 29
1

Разработать программу, генерирующую случайное число по аналогу игральной кости

20.10.2017, 12:22. Показов 2311. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задание:
Разработать программу генерирующее случайное число по аналогу игральной кости. Программа должна иметь возможность выбора формы игральной кости (куб, додекаэдр и прочие), а также возможность использования нескольких костей одновременно.
Мой кодон огромен) - в нем,есть выбор кубиков(от 1 до 5),есть выбор вида кости(4 -грани,6 - граней,12 и т.д)
думаю тут все понятно)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
procedure TForm1.Button1Click(Sender: TObject);
var i,g:integer ;
begin
case form1.ComboBox1.ItemIndex of
0:begin
i:=4;
end;
1:begin
i:=6;
end;
2:begin
i:=8;
end;
3:begin
i:=12;
end;
4:begin
i:=20;
end;
5:begin
i:=100;
end;
end;
Randomize;
case form1.ComboBox2.ItemIndex of
0:begin
edit1.Visible:=true;
edit1.text:=IntToStr(Random(i)+1);
edit2.text:='';
edit3.text:='';
edit4.text:='';
edit5.text:='';
end;
1:begin
edit1.Visible:=true;
edit1.text:=IntToStr(Random(i)+1);
edit2.Visible:=true;
edit2.text:=IntToStr(Random(i)+1);
edit3.visible:=False;
edit4.visible:=false;
edit5.visible:=false;
end;
2:begin
edit1.Visible:=true;
edit1.text:=IntToStr(Random(i)+1);
edit2.Visible:=true;
edit2.text:=IntToStr(Random(i)+1);
edit3.Visible:=true;
edit3.text:=IntToStr(Random(i)+1);
edit4.visible:=false;
edit5.visible:=false;
end;
3:begin
edit1.Visible:=true;
edit1.text:=IntToStr(Random(i)+1);
edit2.Visible:=true;
edit2.text:=IntToStr(Random(i)+1);
edit3.Visible:=true;
edit3.text:=IntToStr(Random(i)+1);
edit4.Visible:=true;
edit4.text:=IntToStr(Random(i)+1);
edit5.visible:=false;
end;
4:begin
edit1.Visible:=true;
edit1.text:=IntToStr(Random(i)+1);
edit2.Visible:=true;
edit2.text:=IntToStr(Random(i)+1);
edit3.Visible:=true;
edit3.text:=IntToStr(Random(i)+1);
edit4.Visible:=true;
edit4.text:=IntToStr(Random(i)+1);
edit5.Visible:=true;
edit5.text:=IntToStr(Random(i)+1);
  end;
end;
 if ComboBox1.ItemIndex<0 then
  begin
    ShowMessage('Не выбран куб!');
    Exit;
  end;
 begin
 if ComboBox2.ItemIndex<0 then
    ShowMessage('Не выбрано количество кубиков!');
    Exit;
  end;
end;
end.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.10.2017, 12:22
Ответы с готовыми решениями:

Разработать модель процесса качения и определить номер выпавшей грани игральной кости
Игральная шестигранная кость катится по столу и останавливается.Разработать модель процесса качения...

Найти вероятность того, что на игральной кости два раза выпадет одно число очков.
игральную кость бросают 2 раза Найти вероятность того что оба раза выподет одно число очков

Как написать функцию генерирующую случайное число от 1 до 100 без использования rand()?
Написать функцию, генерирующую случайное число от 1 до 100, без использования стандартной функции...

Бросок игральной кости
Помогите решить задачу.При нажатии на соответствующую кнопку отображается результат броска...

20
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
20.10.2017, 12:39 2
отформатируй нормально, это не код, это боль

первое
Delphi
1
2
3
4
5
6
7
8
case form1.ComboBox1.ItemIndex of
    0:i:=4;
    1:i:=6;
    2:i:=8;
    3:i:=12;
    4:i:=20;
    5:i:=100;
  end;
лишние begin..end не нужны.
1
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 29
22.10.2017, 19:58  [ТС] 3
Ну я больше даже не знаю,что тут можно отформатировать...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
procedure TForm1.Button1Click(Sender: TObject);
var i:integer ;
begin
case form1.ComboBox1.ItemIndex of
0:i:=4;
1:i:=6;
2:i:=8;
3:i:=12;
4:i:=20;
5:i:=100;
end;
Randomize;
case form1.ComboBox2.ItemIndex of
0:begin
edit1.Visible:=true;
edit1.text:=IntToStr(Random(i)+1);
edit2.visible:=false;
edit3.visible:=false;
edit4.visible:=false;
edit5.visible:=false;
end;
1:begin
edit1.Visible:=true;
edit1.text:=IntToStr(Random(i)+1);
edit2.Visible:=true;
edit2.text:=IntToStr(Random(i)+1);
edit3.visible:=false;
edit4.visible:=false;
edit5.visible:=false;
end;
2:begin
edit1.Visible:=true;
edit1.text:=IntToStr(Random(i)+1);
edit2.Visible:=true;
edit2.text:=IntToStr(Random(i)+1);
edit3.Visible:=true;
edit3.text:=IntToStr(Random(i)+1);
edit4.visible:=false;
edit5.visible:=false;
end;
3:begin
edit1.Visible:=true;
edit1.text:=IntToStr(Random(i)+1);
edit2.Visible:=true;
edit2.text:=IntToStr(Random(i)+1);
edit3.Visible:=true;
edit3.text:=IntToStr(Random(i)+1);
edit4.Visible:=true;
edit4.text:=IntToStr(Random(i)+1);
edit5.visible:=false;
end;
4:begin
edit1.Visible:=true;
edit1.text:=IntToStr(Random(i)+1);
edit2.Visible:=true;
edit2.text:=IntToStr(Random(i)+1);
edit3.Visible:=true;
edit3.text:=IntToStr(Random(i)+1);
edit4.Visible:=true;
edit4.text:=IntToStr(Random(i)+1);
edit5.Visible:=true;
edit5.text:=IntToStr(Random(i)+1);
  end;
end;
 if ComboBox1.ItemIndex<0 then
  begin
    ShowMessage('Не выбран куб!');
    Exit;
  end;
 begin
 if ComboBox2.ItemIndex<0 then
    ShowMessage('Не выбрано количество кубиков!');
    Exit;
  end;
end;
end.
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
22.10.2017, 20:16 4
Цитата Сообщение от maxim4eG38rus Посмотреть сообщение
Ну я больше даже не знаю,что тут можно отформатировать...
посмотри статьи как нужно форматировать код

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
procedure TForm1.Button1Click(Sender: TObject);
var i,g:integer ;
begin
 
// проверки сначала. глупо делать вычисления вначале кода и потом делать проверки
 if ComboBox1.ItemIndex<0 then
  begin
    ShowMessage('Не выбран куб!');
    Exit;
  end;
 begin
 if ComboBox2.ItemIndex<0 then
    ShowMessage('Не выбрано количество кубиков!');
    Exit;
  end;
 
// тут у тебя куча лишних begin..end
case form1.ComboBox1.ItemIndex of
  0:i:=4;
  1:i:=6;
  2:i:=8;
  3:i:=12;
  4:i:=20;
  5:i:=100;
end;
 
// сразу уберем все чтобы не мешалось
edit1.visible:=false;
edit2.visible:=false;
edit3.visible:=false;
edit4.visible:=false;
edit5.visible:=false;
 
Randomize;
 
for g:=0 to i do begin
  if i<>5 then begin // 5 у тебя нигде не обрабатывается
    (fincomponent(edit+inttostr(g+1)) as tedit).visible:=true;
    (fincomponent(edit+inttostr(g+1)) as tedit).text:=IntToStr(Random(i)+1);
  end;
end;
 
end;
end.
вот итог - 44 строки с пробелами, которые отделяют функциональные части программы
НО все равно много тут не правильно
1. проверку Combobox надо вешать на них самих, то есть пока не выбрали оба - не показывать кнопку
2 вывод граней нужно делать рисунком (картинкой или на канве) для наглядности
0
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 29
24.10.2017, 18:10  [ТС] 5
Цитата Сообщение от qwertehok Посмотреть сообщение
for g:=0 to i do begin
* if i<>5 then begin // 5 у тебя нигде не обрабатывается
* * (fincomponent(edit+inttostr(g+1)) as tedit).visible:=true;
* * (fincomponent(edit+inttostr(g+1)) as tedit).text:=IntToStr(Random(i)+1);
Как это понимать?
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
24.10.2017, 19:43 6
мозгом
0
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 29
27.10.2017, 19:25  [ТС] 7
Нужно задать массив и присвоить его элементы к каждому item в combobox1.
То есть,мне нужно выбрать в combobox элемент, которому должно уже быть присвоено свое число, сделать рандом этого числа
И ещё нужно что бы я например выбрал в combobox2 что мне надо 2-жды или N-жды число(которое я выбрал в combobox1) ввести рандомно в memo1
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
27.10.2017, 19:33 8
лучше напиши задание каким тебе его дали, потому что твой пересказ никуда не годен.
0
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 29
27.10.2017, 19:42  [ТС] 9
Разработать программу генерирующее случайное число по аналогу игральной кости. Программа должна иметь возможность выбора формы игральной кости (куб, додекаэдр и прочие), а также возможность использования нескольких костей одновременно.
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
27.10.2017, 21:54 10
так тыж уже вроде разработал?
при чем тут массив, combobox?
0
Модератор
9256 / 6034 / 2379
Регистрация: 21.01.2014
Сообщений: 25,793
Записей в блоге: 3
27.10.2017, 22:15 11
Лучший ответ Сообщение было отмечено maxim4eG38rus как решение

Решение

Если безо всяких графических красивостей (чисто текстовый вариант) - то вот она вся Ваша задача... В разделе объявления компонентов в комментариях свойства этого компонента по умолчанию, которые в инспекторе объектов выставляются
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Math, StdCtrls, Spin;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    ComboBox1: TComboBox; //Items: 4, 6, 12
    SpinEdit1: TSpinEdit; //MinValue = 1, MaxValue = 5, Value = 3
    Button1: TButton; //Enabled = false
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private { Private declarations }
    MaxVal: integer;
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 Randomize;
 MaxVal := 0;
end;
 
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
 MaxVal := StrToInt(ComboBox1.Text) + 1;
 Button1.Enabled := true;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
 Memo1.Lines.Clear;
 for i := 1 to SpinEdit1.Value do
  Memo1.Lines.Add(Format('Кость %d - выпало %d', [i, RandomRange(1, MaxVal)]));
end;
 
end.
Миниатюры
Разработать программу, генерирующую случайное число по аналогу игральной кости  
1
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 29
28.10.2017, 18:25  [ТС] 12
D1973,спасибо огромное)
0
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 29
16.05.2018, 15:30  [ТС] 13
D1973, А как сделать что бы можно было генерировать несколько форм костей одновременно?
0
Модератор
9256 / 6034 / 2379
Регистрация: 21.01.2014
Сообщений: 25,793
Записей в блоге: 3
17.05.2018, 05:11 14
Цитата Сообщение от maxim4eG38rus Посмотреть сообщение
несколько форм костей одновременно
Как одни из возможных вариантов...
1. Задать количество костей
2. Исходя из этого значения динамически создать и заполнить нужное количество Комбобоксов
3. Обходить все комбобоксы циклом и применять код, приведенный выше...
0
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 29
19.05.2018, 20:26  [ТС] 15
Как вывести текст в memo используя функцию format из комбобокса(в комбобоксе items написал названия форм костей)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
Memo1.Lines.Clear;
for j := 0 to Combobox1.Items.Count - 6 do
 if SpinEdit2.Value<>0 then
  for i := 1 to SpinEdit1.Value do
  Memo1.Lines.Add(Format('(!Вот тут название кости выбранную в комбобоксе!) кость №%d - выпало %d', [i,RandomRange(1, a)]));
 for j := 0 to Combobox2.Items.Count - 6 do
 if SpinEdit2.Value<>0 then
  for i := 1 to SpinEdit2.Value do
  Memo1.Lines.Add(Format('(!Вот тут название кости выбранную в комбобоксе!) кость №%d - выпало %d', [i,RandomRange(1, b)]));
end;
 
end.
Пытался воспользоваться индексом %p ,но пишет неверное значение переменно,я так понимаю потому что там текст.
Как сделать?
0
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 29
19.05.2018, 20:36  [ТС] 16
Вот скрин
Миниатюры
Разработать программу, генерирующую случайное число по аналогу игральной кости  
0
Модератор
9256 / 6034 / 2379
Регистрация: 21.01.2014
Сообщений: 25,793
Записей в блоге: 3
19.05.2018, 21:49 17
Цитата Сообщение от maxim4eG38rus Посмотреть сообщение
Пытался воспользоваться индексом %p
А Вы прочитайте про функцию Format - при чем тут какой-то указатель???
0
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 29
20.05.2018, 09:14  [ТС] 18
Спасибо разобрался

Добавлено через 2 минуты
D1973, Слушай,можно ли как то это,присвоить нескольким combobox по короче как то?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
case form1.ComboBox1.ItemIndex of
0:edit1.Text:='4';
1:edit1.Text:='6';
2:edit1.Text:='8';
3:edit1.Text:='12';
4:edit1.Text:='20';
5:edit1.text:='100';
end;
 a := StrToInt(Edit1.Text) + 1;
end;
 
procedure TForm1.ComboBox2Change(Sender: TObject);
begin
case Form1.Combobox2.Itemindex of
0:edit2.Text:='4';
1:edit2.Text:='6';
2:edit2.Text:='8';
3:edit2.Text:='12';
4:edit2.Text:='20';
5:edit2.text:='100';
end;
 b := StrToInt(Edit2.Text) + 1;
end;
У мену тут получается чел выбирает форму,и автоматически выводятся грани.Мне таких комбобоксов нужно создать 6.
0
Модератор
9256 / 6034 / 2379
Регистрация: 21.01.2014
Сообщений: 25,793
Записей в блоге: 3
21.05.2018, 04:37 19
Можно.
1. Для каждого из КомбоБоксов установить свое свойство Tag от 0 до 5
2. Аналогичное значение свойства Tag выставить для соответствующих Эдитов
3. Создать обработчик OnChange для ComboBox1, написать в нем код и присвоить этот обработчик всем остальным Комбобоксам
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.ComboBox1Change(Sender: TObject);
var i: integer;
begin
 case TComboBox(Sender).ItemIndex of
  0 : a := 5;
  1 : a := 7;
  2 : a := 9;
  3 : a := 13;
  4 : a := 21;
  5 : a := 101;
 end;
 for i := 0 to ControlCount - 1 do
  if Controls[i] is TEdit then
   if TEdit(Controls[i]).Tag = TComboBox(Sender).Tag then TEdit(Controls[i]).Text := IntToStr(a - 1);
end;
только что такое а? и почему в Вашем вышеприведенном примере в одном обработчике используется a, а во втором - b... Если таких обработчиков Вы планировали 6 штук то у Вас что, 6 переменных разных будет? м.б. имеет смысл в сторону целочисленного массива посмотреть?
0
0 / 0 / 0
Регистрация: 28.04.2016
Сообщений: 29
21.05.2018, 09:13  [ТС] 20
a и b - они выводят в edit количество граней выбранной формы кости
И с edit уже обработчик считывает число(зависящее от выбора формы кости), то что выбрал пользователь и генерирует
0
21.05.2018, 09:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.05.2018, 09:13
Помогаю со студенческими работами здесь

Бросок игральной кости
Добрый день! Решал соседу задачку из информатики, может кому пригодится или будут мысли на тему...

Програма должна имитировать n бросков игральной кости
помогите програма должна имитировать n бросков игральной кости #include &lt;stdio.h&gt;...

Четыре грани первой игральной кости красные и две - белые
Четыре грани первой игральной кости красные и две - белые, а у второй кости две грани красные и...

Что более вероятно: получить 12 или 11 очков при трёх бросаниях игральной кости?
Игральная кость бросается трижды. Пусть х — сумма очков, полученных при всех бросаниях. Что более...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru