Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Создание искусственного времени   Найти похожие ветки 

 
!Trinix ©   (2005-06-10 15:28) [0]

Я создаю игру, как The Sims (подробнее на sgstd.nm.ru), со временем у меня полный порядок, но с датой не выходит. Дата у меня принадлежит к типу TDayOfWeek. Когда время становится 24(00) часа, то настает следующий день, но почему-то день не ихменяется и вообще t.Day равняется 0. Помогите, пожалуйста, вот мой код:
procedure Timer
type
TCanTime = 0..59;
TDayOfWeek = 1..7;
TCurTime = record
Minutes : TCanTime;
Hours : TCanTime;
Day : TDayOfWeek;
end;

var
t : TCurTime;

procedure TForm1.Timer_TimeTimer(Sender: TObject);
begin
t.Minutes := t.Minutes + 1;
if t.Minutes > 58 then begin
t.Minutes := 0;
t.Hours := t.Hours + 1;
end;
if t.Hours > 23 then begin
t.Hours := 0;
if t.Day = 1 then t.Day := 2;
if t.Day = 2 then t.Day := 3;
if t.Day = 3 then t.Day := 4;
if t.Day = 4 then t.Day := 5;
if t.Day = 5 then t.Day := 6;
if t.Day = 6 then t.Day := 7;
if t.Day = 7 then t.Day := 1;
end;
LabelHour.Caption := IntToStr(t.Hours);
LabelMinutes.Caption := IntToStr(t.Minutes);
case t.Day of
1 : LabelDay.Text := "пон";
2 : LabelDay.Text := "втр";
3 : LabelDay.Text := "срд";
4 : LabelDay.Text := "чтв";
5 : LabelDay.Text := "пят";
6 : LabelDay.Text := "суб";
7 : LabelDay.Text := "вос";
end;
end;


 
TUser ©   (2005-06-10 15:40) [1]

Как ты думаешь, что получиться в результате последоватлеьного выполнения вот этих строчек, если t.Day = 1?


> if t.Day = 1 then t.Day := 2;
> if t.Day = 2 then t.Day := 3;
> if t.Day = 3 then t.Day := 4;
> if t.Day = 4 then t.Day := 5;
> if t.Day = 5 then t.Day := 6;
> if t.Day = 6 then t.Day := 7;
> if t.Day = 7 then t.Day := 1;


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


 
Ega23 ©   (2005-06-10 15:40) [2]

1.  if t.Minutes > 58 then begin   Может быть 59?
2.
if t.Day = 1 then t.Day := 2
if t.Day = 2 then t.Day := 3;
if t.Day = 3 then t.Day := 4;
if t.Day = 4 then t.Day := 5;
if t.Day = 5 then t.Day := 6;
if t.Day = 6 then t.Day := 7;
if t.Day = 7 then t.Day := 1;

У тебя t.Day ВСЕГДА будет 1. Почему - подумай.


 
Ega23 ©   (2005-06-10 15:41) [3]

2 TUser ©   (10.06.05 15:40) [1]
Как ты думаешь, что получиться в результате последоватлеьного выполнения вот этих строчек, если t.Day = 1?

Да даже, если t.Day = 2 или t.Day =7


 
Ega23 ©   (2005-06-10 15:44) [4]

А вообще t.day:=(t.day+1) mod 7;


 
TUser ©   (2005-06-10 15:46) [5]

t.Day:=[4]+1;


 
TUser ©   (2005-06-10 15:47) [6]

Сорри, не то ляпнул.


 
-=XP=- ©   (2005-06-10 15:49) [7]

Посмотрите в сторону TDateTime и не изобретайте двухколесное транспортное средство.


 
default ©   (2005-06-10 15:49) [8]

t.day:= (t.day mod 7) + 1
Ega23 ©   (10.06.05 15:44) [4]
(6 + 1) mod 7 = 0
а должно давать 7


 
-=XP=- ©   (2005-06-10 15:50) [9]

P.S. Я Ваш "шедевр" распечатал и на стену повесил. :)


 
Antonn ©   (2005-06-10 15:51) [10]

incDay не переплюнуть:)


 
TUser ©   (2005-06-10 15:53) [11]

> Ega23 ©   (10.06.05 15:44) [4]
> default ©   (10.06.05 15:49) [8]

t.Day:=(t.Day mod 7)+1;


 
default ©   (2005-06-10 15:56) [12]

TUser ©   (10.06.05 15:53) [11]
так я это и написал:)


 
Чапаев ©   (2005-06-10 16:17) [13]

if Day<High(TDayOfWeek)
 then Inc(Day)
 else Day:=Low(TDayOfWeek);


 
Alexander Panov ©   (2005-06-10 16:18) [14]

type

 THH=0..23;
 TMM=0..59;
 TDD=1..7;

 TSyntheticTime=class
 private
   FDaysWeek: array[1..7] of String;
   FDay: TDD;
   FHH: THH;
   FMM: TMM;

   function GetDay: String;

 public
   constructor Create(aDay: TDD; aHH: THH; aMM: TMM);

   procedure NextTime;

   property DayOfWeek: String read GetDay;
   property DD: TDD read FDay write FDay;
   property HH: THH read FHH write FHH;
   property MM: TMM read FMM write FMM;
 end;

var
 Form1: TForm1;
 ST: TSyntheticTime;

constructor TSyntheticTime.Create(aDay: TDD; aHH: THH; aMM: TMM);
begin
 FHH := aHH;
 FMM := aMM;
 FDay := aDay;
 FDaysWeek[1] :="пон";
 FDaysWeek[2] :="втр";
 FDaysWeek[3] :="срд";
 FDaysWeek[4] :="чтв";
 FDaysWeek[5] :="пят";
 FDaysWeek[6] :="суб";
 FDaysWeek[7] :="вос";
end;

function TSyntheticTime.GetDay: String;
begin
 Result := FDaysWeek[FDay];
end;

procedure TSyntheticTime.NextTime;
begin
 if FMM=59 then
 begin
   FMM := 0;
   if FHH=23 then
   begin
     FHH := 0;
     if FDay=7
     then FDay := 1
     else FDay := FDay+1;
   end
   else FHH := FHH+1;
 end
 else FMM := FMM+1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 ST := TSyntheticTime.Create(1,0,0);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Label1.Caption := ST.DayOfWeek+" "+ IntToStr(ST.HH)+":"+IntToStr(ST.MM);
 ST.NextTime;
end;


 
!Trinix ©   (2005-06-10 16:46) [15]

Спасибо, моя вина - сам недосмотрел с прибавлением дня.
Туплю...:)



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.06 c
6-1112888304
Egorr
2005-04-07 19:38
2005.07.11
Шифрование траффика-TIdMappedPortTCP


14-1118651662
syte_ser78
2005-06-13 12:34
2005.07.11
Вопрос по HTML


1-1118902502
Магнум
2005-06-16 10:15
2005.07.11
TListView and "Array index out of bounds"


3-1117179499
Гость2
2005-05-27 11:38
2005.07.11
Как просуммровать значения по полю таблицы?


4-1115833998
MakedoneZ
2005-05-11 21:53
2005.07.11
Копирование и запуск приложения через прогу