Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Разработать программу моделирующую игру

Автор: STEEL
Дата сообщения: 20.01.2003 18:39
Разработать программу, моделирующую игру. Игра имеет следующие правила. Перед Вами большое число ящиков с деньгами. Сумма денег в каждом ящике – случайная величина, равномерно распределённая на отрезке [0, 1]. Вы выбираете ящик, открываете его и или берёте деньги из ящика, или отказываетесь от них. Если Вы берёте деньги, игра кончается. В противном случае Вы можете выбрать другой ящик. Эта процедура повторяется максимум до пяти ящиков (деньги из пятого ящика должны быть взяты, если он открыт).

Добавлено
..и ещё одна задачках
Разработать программу, моделирующую игру «Скачки». В игре участвуют 10 наездников; за каждый тур игры каждый из них продвигается вперёд на расстояние от 1 до 5 км случайным образом. Длина дистанции – 50 км. Всего проводится 5 заездов, победителю каждого заезда начисляется 5 очков. Победителем считается наездник, набравший наибольшее количество очков во всех заездах. Перед началом заездов участник игры выбирает номер наездника, с которым он будет идентифицироваться во время игры. Количество участников игры не превышает 10. В каждом туре с вероятностью 0.1 каждый наездник может упасть, т.е. продвинуться за этот тур на ноль км. Передвижение наездников отобразить графически на экране. Предусмотреть возможность случайного распределения номеров наездников.
Автор: Flex256
Дата сообщения: 21.01.2003 07:39
Курсовик?
var yshik[1..5]of float;
i:integer;
win:float;
begin
Randomize;
for i:=1 to 5 do yshik[1]:=random;
win:=yshik[5];
for i:=1 to 4 do begin {цикл до 4-х потому что 5-ый ящик так и так твой}
if MessageBox(0,pchar("Сумма денег="+FloatToStr(yshik[i])),"Возьмете деньги?",MB_IconQuestion+MB_YESNO)=IDYES then
begin win=yshik[i];break;end;
end;
MessageBox(0,pchar("Сумма денег="+FloatToStr(yshik[i])),"",MB_OK+MB_ICONINFORMATION);
end.
Примерно так, но я не компилировал
Компильни - найди ошибки
Вторая задача - такая же глупость
Автор: autumn_orion
Дата сообщения: 21.01.2003 12:01
сорри невнимательно прочитал условие... Исправляю...

program sch;
const StageCount=5;
HorsCount=10;
FailureProb=0.1;
DistanceLength=50;
WinPoints=5;
type Thorseman=record
Dist:integer;
Points:integer;
Valid:boolean;
end;
THorsarray=array[1..HorsCount] of Thorseman;
var Hno:integer;
HorsArray:THorsarray;
MaxDistance:integer;
i,j:integer;
CanRace:boolean;

begin
Write ('Input horseman number ');
Readln ( Hno);
Randomize;
for i:=1 to HorsCount do
HorsArray[i].Points:=0;
for i:=1 to StageCount do
begin
CanRace:=false;
for j:=1 to HorsCount do
begin
if (random>FailureProb) then
begin
HorsArray[j].Valid:=true;
CanRace:=true;
end
else
HorsArray[j].Valid:=false;
HorsArray[j].Dist:=0;
end;
if CanRace then
begin
repeat
for j:=1 to Horscount do
if HorsArray[j].Valid then
HorsArray[j].Dist:=HorsArray[j].Dist+round(random(4))+1;
MaxDistance:=0;
for j:=1 to HorsCount do
if ((HorsArray[j].Valid) and (HorsArray[j].Dist>MaxDistance)) then
begin
MaxDistance:=HorsArray[j].Dist;
end;
until (MaxDistance>=DistanceLength);
for j:=1 to HorsCount do
if (HorsArray[j].Dist=MaxDistance) then
HorsArray[j].Points:=HorsArray[j].Points+WinPoints;
end;
writeln ('Stage no ',i);
writeln ('no ', ' Distance ', ' Points');
for j:=1 to HorsCount do
writeln (j,' ',HorsArray[j].Dist,' ',HorsArray[j].Points);
readln;
end;
MaxDistance:=0;
for i:=1 to HorsCount do
if HorsArray[i].Points>MaxDistance then
begin
MaxDistance:=HorsArray[i].Points;
end;
writeln ('Horseman no. ',Hno,' points= ',HorsArray[Hno].Points);
for i:=1 to HorsCount do
if (HorsArray[i].Points=MaxDistance) then
writeln ('Winner is horseman no. ',i,'! Points= ',MaxDistance);
end.

Вроде так, только без графики ... Хотя, наверное, можно было это оптимальней написать...

Кстати, у меня если победителей несколько, то всем дается по 5 очков или д.б. фотофиниш ? То же самое относительно победителя во всех заездах.
Автор: STEEL
Дата сообщения: 21.01.2003 18:35
Всем огромное спасибо! Сегодня попробую. Я просто TP не знаю. Сейчас BC, и VCPP изучаю. А для получения диплома, необходимо решить следующие задачи! Спасибо!
Автор: STEEL
Дата сообщения: 10.02.2003 19:02
Flex256

Я не знаю синтаксиса Pascal-я. Что это за ошибка, понять не могу.
Автор: Schicout
Дата сообщения: 10.02.2003 23:05
":" expected - значит, по конструкции требуется двоеточие. Если я понял Вашу мысль правильно, надо писать так:
yshik: array[1..5] of float;
переводится как ныршл типа массив от 1 до 5 переменных типа float.
Автор: STEEL
Дата сообщения: 11.02.2003 11:43
Schicout

Автор: UncoNNecteD
Дата сообщения: 11.02.2003 13:44
STEEL
Исходник для Дельфи а не для ДОС-Паскаля!
Автор: Schicout
Дата сообщения: 11.02.2003 20:14
STEEL

быват... Я думал, что все уже сделано...

Замените float на real (48-bit float) или на Extended (64-bit float). Или перед var'ом поставьте конструкцию (если float используется много-много раз):

type
Float = Extended;

или

type
Float = Real;

Правда на счет extended я уже не помню, в Delphi он прописан по умолчанию, в TP тоже, правда, должен, но ежели нет, тогда только Real.

Добавлено
Стоять!
У Вас тут страшная смесь! Начать хотя бы с того под какую платформу задача (Win32 или DOS) ? Если под Win32, то все почти правильно, а если под DOS (а TP только под дос и умеет компилять) то никаких MessageBox и Break'ов там просто нет!

Добавлено
Flex256

Цитата:
Примерно так, но я не компилировал
Компильни - найди ошибки


Ответ : 13 штук.

STEEL

Не знаю как с функциональностью, но, по крайней мере, компилируемое приложение на Delphi выглялит так:

program Project1;

{$APPTYPE CONSOLE}

uses
Windows,
SysUtils;

var yshik: array [1..5] of extended;
i:integer;
win:extended;
begin
Randomize;
for i:=1 to 5 do yshik[1]:=random;
win:=yshik[5];
for i:=1 to 4 do begin
if MessageBox(0,pchar('summa deneg='+FloatToStr(yshik[i])),'Vozmete dengi?',MB_IconQuestion+MB_YESNO)=IDYES then
begin
win:=yshik[i];
break;
end;
end;
MessageBox(0,pchar('Summa deneg='+FloatToStr(yshik[i])),'',MB_OK+MB_ICONINFORMATION);
end.
Автор: STEEL
Дата сообщения: 18.02.2003 22:02
ТЕперь, если не в лом, не могли бы вы мне прокомментировать хотя бы часть исходника. у меня зачёт в пятницу... ничего не понимаю в дельфи. заранее благодарен..
и если есть возможность, откомпилировать и скинуть на steel@sochi-info.ru
Автор: CHiF
Дата сообщения: 19.02.2003 12:08
Если действительно проблемы, попробую объяснить step-by-step, на примере исходника который кинул Schicout (под ДОС)

Код: program Project1;

var yshik: array [1..5] of real; {ящики}
i:integer;
win: real; {сумма в ящике-победителе}
ch: char;
begin
Randomize;
for i:=1 to 5 do yshik[i]:=random; {бросаем в ящики деньки [0;1)}
win:=yshik[5]; {поумолчанию делаем выбранным ящик #5; на случай если ни один не возьмут}
for i:=1 to 4 do begin
writeln('summa deneg= ',yshik[i]); {Для форматного вывода float числа в паскале можно юзать так: yshik[i]:5:3 например (т.е. 5 всего цифр, и 3 после запятой, может я чето попутал - давно за паскалем не сидел, но вроде так)}
write('Vozmete dengi [Y\N]?');
repeat
ch:=readkey;
until (upcase(ch)='Y') or (upcase(ch)='N'); {Пока не нажмут Y или N далее не пускаем}
write(' ',ch);
writeln;
if ch='Y' then
begin
win:=yshik[i]; {вот выбранный ящик}
break;
end;
end;
writeln('Summa deneg=',yshik[i]); {показываем сколько выиграл юзер}
end.
Автор: b0ev0y_ezh
Дата сообщения: 19.02.2003 16:45
CHiF
Спасибо большое, ты помог мне разобраться, теперь я понял, у меня была похожая ситуация
Автор: CHiF
Дата сообщения: 19.02.2003 17:31
b0ev0y_ezh издеваешся чтоли надо мной? "похожая ситуация"
- ладно steel, ну незнает он делфи, а ты то чо )
Автор: STEEL
Дата сообщения: 20.02.2003 06:01
кто может откомпелировать выше написаный код?
Автор: STEEL
Дата сообщения: 20.02.2003 18:44
CHiF
Спасибо! Но ведь программа не работает - правильно!
Автор: autumn_orion
Дата сообщения: 22.02.2003 12:29
STEEL

Так чего? Программа с ящиками неправильно работает? Уточни, плиз, правила!!!
Ошибка в том, что пользователь не может выбирать номер ящика, а производится последовательный перебор ящиков без участия польователя?
Ящики могут выбираться повторно или нет?
И на чем тебе прога нужна: на Delphi или на Паскале?
Автор: STEEL
Дата сообщения: 22.02.2003 15:00
autumn_orion

Да.. не могу выбрать ящик. Потом сумма какая-то непонятная нацисляется всё время 0.353527698496 . Мне нужно, чтобы я мог выбирать ящики. повторно выбрать ящик нельзя..

всё равно ... на делфи или паскале... если можно, сразу с появнениями пиши
Автор: autumn_orion
Дата сообщения: 26.02.2003 12:24
STEEL
В общем, я слегка исправил програмку, которая приводилась выше...
Теперь, вроде бы, должно работать правильно. Оптимальность и изящность не гарантирую ...

program Project1;
type
TYshik=record
Summa:real;
Avail:boolean; // ящик=запись: сумма в ящике и его доступность для открытия
end;
TYshikArray=array[1..5] of TYshik; // тип = массив ящиков
var yshik: TYshikArray;
Av_Yshiks:boolean; // Флаг наличия закрытых ящиков
i,j:integer; // вспомогат переменные
ch: char;
begin
Randomize; // инициализация датчика псевдослучайных чисел
for j:=1 to 5 do // инициализируем ящики...
begin
yshik[j].Summa:=random; // сумма в ящике случ. величина на (0,1)
yshik[j].Avail:=true; // Ящик можно открывать
end;
Av_Yshiks:=true; // Закрытые ящики есть!
while (Av_Yshiks) do // пока есть закрытые ящики
begin
Av_Yshiks:=false; // Флаг=закрытых ящиков нет!
repeat // повторяем тело цикла
write('Vvedite nomer yashika (1-5): ');
readln (i);
if ((i>5) or (i<1)) then // Если номер ящика вне [1,5], то ошибка!
writeln ('Neverny nomer yashika!')
else // иначе
if not (yshik[i].Avail) then // если Ящик уже открыт, то пишем, что ящик уже выбирался
writeln ('Yashik uzhe vybran!');
until ((i<6) and (i>0) and yshik[i].Avail); // пока пользователь не введет номер ящика от // 1 до 5 и не открывавшийся ранее
yshik[i].Avail:=false; // выбранному ящику присваиваем статус "открыт"
writeln('summa deneg= ',yshik[i].Summa:10:5); // Пишем сумму денег в выбранном
// ящике
write('Vozmete dengi [Y\N]?'); // "Возьмете деньги?"
repeat // повторяем считывание символа
readln (ch);
until (upcase(ch)='Y') or (upcase(ch)='N'); // пока пользователь не введет y(Y) или //n(N)
writeln;
if (upcase(ch)='Y') then
break; // если деньги берем, то выходим из внешнего цикла
for j:=1 to 5 do // проверяем, остались ли еще закрытые ящики...
if Yshik[j].Avail then // Если да, то
begin
Av_Yshiks:=true; // устанавливаем флаг наличия закрытых ящиков
break; // и выходим из цикла проверки закрытых ящиков...
end;
end;
writeln('Summa deneg=',yshik[i].summa:10:5); // "Сумма денег=..."
end.

Страницы: 1

Предыдущая тема: Создать XML-документ на Delphi


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.