Turbo Pascal - Prośba o pomoc z projektem na zaliczenie

0

Witam.
Zacząłem właśnie drugą klasę TI i na pierwszej lekcji dostaliśmy zadanie na zaliczenie z Turbo Pascala.
Do końca września, musimy mieć już jakiś pomysł i "szkic".
Muszę napisać obojętnie jaki program, byleby był super dobry. Nauczyciel mówił, że może to być nawet gra.
Myślałem nad tą grą, ale nie przerobiliśmy na lekcjach jak dodawać grafikę w TP. Myślałem też nad odtwarzaczem muzyki (takim z własną playlistą itd.). Jak myślicie, co łatwiej byłoby zrobić: odtwarzacz muzyki czy jakąś grę (ja myślałem o grze w stylu Mario w której dochodziłoby jeszcze sterowanie myszką)?
Chce naprawdę dobrze wypaść, będę się starał żeby zrobić to najlepiej, ale potrzebuję waszej pomocy :)

0

A może interpreter własnego języka? :)

Nie znasz jeszcze dobrze pascala a już chcesz zaprogramować Mario? Nie sądzę, żebyś sobie poradził z tym.

Myślałem nad tą grą, ale nie przerobiliśmy na lekcjach jak dodawać grafikę w TP.

Bo tego nie obejmuje materiał. Poza tym po co Ci grafika? Wykorzystaj tryb tekstowy konsoli i kolorowanie. Konsolowy zestaw znaków zawiera wiele ciekawych znaków, z których możesz robić ramki, mini okienka itd. Pobaw się najpierw trybem znakowym, później przejdź do grafiki. Wymyśl coś, co będziesz w stanie zaprogramować.

BTW: Ja na zaliczenie pierwszego roku TI zrobiłem grę - wieża Hanoi. Pracuje w trybie tekstowym, ma proste ustawienia (zmiana klawiszy, koloru krążków), pozwala wybrać ilość krążków od 3 do 10. Kodu Ci nie dam, ale w załączniku masz ekseka - pobaw się, podglądnij sobie konstrukcję i wymyśl coś swojego. Jest to dość prosta gra, kodu jest niewiele (938 linii).

Pozdrawiam.

EDIT: Graj na pełnym ekranie bo będzie się mulić.

0

A może interpreter własnego języka?
To jest dobry temat ale nie dla początkujących... :-P .

Chce naprawdę dobrze wypaść, będę się starał żeby zrobić to najlepiej, ale potrzebuję waszej pomocy

Po co Tobie nasza pomoc? Google nie pomaga czy jak? Ja rozumiem pomoc w sensie POMOC Z PROBLEMEM, ale nie napisanie za ciebie połowy kodu.

odtwarzacz muzyki czy jakąś grę

To zależy: Jakąś grę jest napisać równie łatwo jak jakiś odtwarzacz muzyki. Ale gdy chodzi o odtwarzanie plików wave i/lub mp3, zazwyczaj używa się bibliotek, a z tym jest za łatwo, a bez nich z kolei to jest bezsensowna robota.
Gra może zawierać muzykę (wtedy jest trudniejsza niż odtwarzacz), ale może jej nie zawierać...

Może wymyśl coś co TY byś chciał zrobić, bo co jak co, ale motywacja to rzecz ważna.

0

Zrób prosty emulator maszyny RAM z jednym sumatorem,
bedziesz miał operacje na pliku *(wczytanie programu zapisanie programu) i jakąś akcję :) a przy tym bedzie to cos ciekawego ;P

0

A może interpreter własnego języka?
To jest dobry temat ale nie dla początkujących...

No właśnie :) Napisałem tak, bo nie wiem, czy kolega za wysoko nie mierzy. Po pierwszym roku nauki programowania w szkole nie można zbyt wiele zdziałać, bo są omawiane podstawy podstaw. Nawet rekordów nie ma w programie, a takie przydatne...

Gra zawierająca muzykę? Fajny pomysł, ale nawet umiejąc materiał na 6 nie ma możliwości napisania tego, jeżeli się samemu nie uczy i programuje w wolnym czasie. Maszyna RAM też niezły pomysł, ale kandydat powinien sam wymyślić co chce zrobić.

Ja napisałem wieżę Hanoi, bo dość szybko obczaiłem w jaki sposób układać te klocki. Z resztą czasem paluszki rozgrzewam przed programowaniem właśnie w tej grze :)

2

Hm...
IMHO, za uczenie Turbo Pascala powinno się w dzisiejszych czasach robić niemiłe rzeczy...
FPC forever! :D

0

Na pewno prostszy będzie odtwarzacz muzyki, ale gra będzie bardziej pokazowa. Niestety na podstawach nauki zostaje odtwarzacz.

0

w Turbo Pascalu z dźwiękiem na dzisiejszych komputerach i systemach operacyjnych będzie wielki problem.

0

Musisz coś w końcu wymyślić. W przeciwnym razie będziesz się tak zastanawiał aż przyjdzie sądny dzień zaliczenia i nic nie będziesz miał.

Zastanów się dobrze nad tym co jesteś w stanie napisać biorąc pod uwagę Twój poziom wiedzy z programowania w TP. Najpierw się zastanów nad tym, później dopasuj umiejętności do programu. Jak wymyślisz coś, czego nie będziesz umiał napisać, to tylko zmarnujesz czas i zasypiesz 4p pytaniami.

Pamiętaj - praca ma być Twoja, a nie serwisu.

0

Napisz Kółko i Krzyżyk/Statki/Sapera/Snake/Tetrisa/Frogga w konsoli. Trochę roboty z tym będzie, ale nic, czego by się nie dało wykonać, jak się zna szkolne podstawy. Gra będzie efektownym projektem - nawet w konsoli będzie prezentować się lepiej niż dowolny odtwarzacz, czy coś innego cobyś wymodził znając jedynie to czego w szkole uczą.
Najszybszą drogą jest napisanie jakiejś gry, w którą będą grać dwie osoby - raz, że zaciągniesz do tego nauczyciela, a dwa - nie musisz pisać AI przeciwnika - a to zazwyczaj trudniejszy kawałek chleba. Kółko i Krzyżyk na rozgrzewkę,a na zaliczenie Warcaby, lub Szachy (jak jesteś ambitny) - wystarczy zakodzić system wyświetlania i przesuwania pionów, jakieś tam ograniczenia ruchów (albo i nie - niech gracze sami się kontrolują).

0

napisz grę w życie, proste a cieszy :)

0

Możesz spróbować zrobić też prosty czat. Zapisujesz wiadomości od jednego user'a w pliku, u drugiego odczytujesz i wyświetlasz (coś w ten deseń). Podobnie w drugą stronę. Do tego, co Jadaszek powiedział, dołożyłbym jeszcze River Raid'a :).

1

Po przeczytaniu waszych postów i po zastanowieniu się, doszedłem do wniosku że mogę napisać kilka prostych gier w jednej. Na myśli mam "game boy'a" takiego za 10zł w którym jest kilka gier: tetris, jakieś tam samochodziki itd. Wybiorę trzy najłatwiejsze do napisania gry, a na początku programu zrobię menu wyboru gry w którym będzie możliwość dokonania wyboru za pomocą kursora, myszy. Zrobię również możliwość zapisywania swoich rekordów. Jeśli chodzi o grę "samochodziki", to myślałem, żeby zrobić ją dla dwojga graczy. Jak już zacznę coś pisać to się tutaj odezwę. Nieraz jeszcze poproszę pewnie was o pomoc :)

A jednak zabieram się za czat :D Taki dla 10 osób. Na dysku sieciowym zapisywany będzie plik tekstowy, do którego będą zapisywane wiadomości, a co 2sekundy ekran będzie czyszczony, a następnie będzie otwierany plik tekstowy, z którego zaraz potem będzie wypisywana cała jego zawartość.
Nie wiem właśnie, czy zrobić to w ten sposób:
VAR
t:text;
a:char;

BEGIN
clrscr;
assign(t, 'c:\plik1.txt');
reset(t);
REPEAT
read(t,a);
write(a);
UNTIL EOF(t);
close(t);
delay(3000);
END.
Czy może znacie jakiś łatwiejszy??

0

Witam :)
Wziąłem się za pisanie LanChatu!
Chciałbym pokazać Wam kod który napisałem, oraz chciałbym Was prosić o sprawdzenie tego kodu. Za wszelkie podpowiedzi i pomoce będę baaardzo wdzięczny :)
Aha, jeszcze jedno pytanie. Czy w funkcji FUNKCJA można wywołać funkcję FUNKCJA? Przykład poniżej w programie: Funkcja "Menu1".

Program LanChat;

USES CRT;
var
nick:string;

function Menu1(NICK,Kolor:string):string;
var
y:char;

BEGIN
clrscr;
y:=readkey;
IF y=#27 then
   BEGIN
   Writeln('Chcesz wyjsc z programu? T/N');
   IF (y='T') OR (y='t') THEN halt;
   IF (y='N') OR (y='n') THEN Menu1; {Czy to będzie działać?}
   end;
writeln('Wpisz swoj NickName i nacisnij ENTER');
readln(NICK);
clrscr;
if y=#27 then Menu1; {Tak samo to}
writeln('Jaki kolor Nicku wybierasz? (Podaj angielska nazwe koloru)');
readln(Kolor);
Menu2;
END;

Procedure Menu2;
var
y:char;

BEGIN
clrscr
y:=readkey;
writeln('1. Stworz i dolacz do hosta.');
writeln('2. Dolacz do hosta.');
writeln('3. Wyczysc archiwum.');
writeln;
writeln('Aby powrocic do poprzedniego Menu, nacisnij Esc');
IF y=#27 THEN Menu1;
IF (y='1') or (y='2') THEN CHAT;
IF y='3' THEN KASUJ;
END;

FUNCTION CHAT(sciezka:string):string;
var
sciezka:string;
txt:text;
a,y:char;
tekst:string;

BEGIN
writeln('Podaj pelna sciezke do pliku *.txt');
readln(sciezka);
Assign(txt, 'sciezka');
REPEAT
clrscr;
reset(txt);
           REPEAT
           read(txt,a);
           write(a);
           UNTIL EOF(txt);
           {Tutaj musialoby byc cos, co ustawialoby kursor(miejsce od ktorego zaczynamy pisac) pod tekstem w pliku, aby byl porzadek}
readln(txt, tekst);
y:=readkey;

UNTIL (y=#27);
END;

PROCEDURE KASUJ;
var
sciezka:string;
txt:text;
y:char;

BEGIN
y:=readkey;
IF y=#27 then Menu2;
writeln('Podaj pelna sciezke do pliku *.txt: ');
readln(sciezka);
assign(txt, sciezka);
rewrite(txt);
END;

;

Proszę o pomoc!:)

0

w Pascalu jeżeli chcesz "w funkcji FUNKCJA wywołać funkcję FUNKCJA" musisz użyć nawiasów, czyli:

IF (y='T') OR (y='t') THEN halt;
IF (y='N') OR (y='n') THEN Menu1(); {Tu musi być Menu1() zamiast Menu1}
end;
 

Jeżeli używasz nazwy funkcji bez nawiasów to możesz jej przypisać to co funkcja ma zwrócić.
</del>

Nie zamykasz plików.

Zapoznaj się z instrukcją case, zamiast pisać:

IF y=#27 THEN Menu1;
IF (y='1') or (y='2') THEN CHAT;
IF y='3' THEN KASUJ; 

Odsuwaj od lewej krawędzi ekranu wszystko co jest pomiędzy begin i end, ale NIE przesuwając begin i end.

Nie ma głównej procedury , więc nie wiem jak do końca jak wszystko będzie wyglądać, ale już widać kilka błędów w strukturze programu:

  1. Dlaczego w procedurze KASUJ wywołujesz Menu2?
    2)W procedurze Menu1 najpierw pytasz się czy wyjść z programu, a potem prosisz o podanie nicka i koloru.
    3)W procedurze Menu1 pytasz się czy wyjść z programu jeżeli użytkownik wciśnie escape, natomiast w Menu2 wysyłasz użytkownika do Menu1 gdzie musi wcisnąć escape po raz drugi.
    4)Rekurencja nie zadziała tutaj tak jakbyś chciał, żeby działała.

Ogólnie widać pewien chaos w Twoim kodzie. Najlepiej będzie jeżeli usiądziesz sobie z kartką papieru z dala od komputera i rozrysujesz jak ma wyglądać menu, co poszczególne opcje mają robić i do jakich podmenu prowadzić. Postaraj się, aby wyszło z tego ładne drzewo, a nie jakiś graf.

0

w Pascalu jeżeli chcesz "w funkcji FUNKCJA wywołać funkcję FUNKCJA" musisz użyć nawiasów, czyli:

Nie w Turbo Pascalu, ten nie pozwala na użycie pustych nawiasów do wywołania funkcji.

Ale wywołanie rekurencyjne po to by wrócić na początek to zły pomysł. To się robi pętlą while albo until.

0
  1. Ponieważ może ktoś omyłkowo wejdzie w funkcję Kasuj i wtedy ma możliwość cofnięcia się do Menu2.

W takim razie źle to robisz, ponieważ po wciśnięciu Esc program przejdzie do Menu2, ale kiedy Menu2 się skończy (np. użytkownik wciśnie 5) to program wróci do procedury KASUJ. Ogólnie wygląda na to, że nie wiesz do końca jak ten kod będzie się wykonywał. Przeanalizuj ten kod i zobacz jak się będzie wykonywał.

Program aa;

procedure b; forward;

procedure a;
begin
  writeln('a1');
  b;
  writeln('a2');
end;

procedure b;
c:char;
begin
  writeln('Wpisz a');
  readln(c);
  if c='a' then
    a;
  writeln('b2');
end;

BEGIN
  a;
END.
 
  1. Program zapyta czy użytkownik chce wyjść dopiero po naciśnięcie Esc.

Zasadniczo jedna procedura powinna odpowiadać za jedną rzecz w programie. Czyli powinny być osobne procedury do pobierania nicku i koloru, do kasowania, do wychodzenia etc. Wtedy Twój kod będzie się łatwo czytało i jeżeli w którymś miejscu będziesz chciał coś zmienić pójdzie Ci to znacznie łatwiej.

  1. Użytkownik będąc w Menu2 może chcieć cofnąć się do Menu1 a nie od razu wyłączać program.

Źle cofasz się do Menu1, patrz punkt 1.

Więc jak to zrobić? Dlaczego stosowanie tutaj rekurencji to zły pomysł? Nie zadziała?

Zadziała, ale nie tak jakbyś tego chciał. Najlepiej zrobisz, jeżeli sam się przekonasz, metodą prob i błędów, dlaczego jest to zły pomysł.

Na razie chcę by to działało. Później będę to wszystko upiększał, skracał kod.

Podejście "Na razie chcę aby działało" jest tutaj BARDZO złym podejściem. Twój problem polega na tym, że popełniłeś błędy na etapie projektowania programu i im dłużej będziesz się tego trzymał tym trudniej będzie Ci to później naprawić. Na razie projekt jest malutki, ale jak się troszkę rozrośnie, lub odejdziesz od niego na tydzień to przestaniesz go ogarniać. Zrób jak napisałem. Usiądź z kartką papieru i na spokojnie narysuj jak ma wyglądać menu, jakie mają być opcje i co po wybraniu każdej z nich ma się dziać (przejście do podmenu, uruchomienie jakiejś funkcjonalności), bo póki co to Twój kod jest bardzo chaotyczny.

0

Witam :) Czy program napisany na tej strukturze będzie działał? W sensie czy kolejność wykonywania funkcji\procedur jest prawidłowa?
Procedura1:
Podaj nick
P2:
Podaj kolor nicku
P3:
Menu (P4\P5\P6)
P4:
Stwórz plik txt
P5:
Dołącz do pliku txt
P6:
Usuń plik txt
P7:
Czat
P8:
Wyjście (t\n - if i=t then halt\if i=n then P1);

P1->if i=#27 then P8
|
*
P2->if i=#27 then P1
|
*
P3->if i=#27 then P2


opcje do wyboru w P3:
P4->P7->if i=#27 then P3
P5->P7->if i=#27 then P3
P6->P7->if i=#27 then P3


0

Cały czas nie rozumiesz jak wywołują się i działają procedury. Spójrz co się stanie jak zrobisz tak jak proponujesz:
P3->P4->P7-> #27 ->P3->P4->P7-> #27 ->P3->P4->P7-> #27 ->P3->P4->P7-> #27 ->P3->P4->P7-> #27 ->P3->P4->P7-> #27 ->P3->P4->P7-> #27 ->P3->P4->P7-> #27 ->P3->P4->P7-> #27 ->P3->P4->P7-> #27 ->...
i tak w nieskończoność. W końcu skończy Ci się pamięć.
Powinieneś wywoływać procedury według schematu:

P3
P3->P4
P3->P4->P7
P3->P4->P7-> #27  //po wciśnięciu Esc wracamy z powrotem tą samą drogą
P3->P4
P3

Procedura P7 nie powinna wywoływać żadnej innej. Powinna się po prostu skończyć, czyli wyglądać mniej więcej tak:

procedure P7;
var
  c:char;
begin
  c:='';
  while c<> #27 do
  begin
    c:=readkey;
    RÓB COŚ TAM Z CZATEM
  end;
end;

procedure P4;
begin
  STWÓRZ JAKIŚ PLIK I PRZYGOTUJ GO W JAKIŚ SPOSÓB
  P7; //przejście do czatu
end;

procedure P3;
var
  c:char;
begin
  while c<> #27 do
  begin
     c:=readkey;
     case c of
     begin
       '1' : P4;  //W to miejsce wrócimy jak wyjdziemy z procedury P7 i pójdziemy dalej, czyli kolejny raz przez pętlę.
     end;
  end;
end;

Tak samo z P8, dlaczego z P8 przechodzisz do P1 jak użytkownik nie będzie chciał wyjść z programu? W tym wypadku należy wrócić do miejsca w którym wcisnął Esc.

Sam podział na procedury wygląda dobrze, tylko czy aby na pewno potrzebne są dwie osobne na ustawienie nicka i koloru? Te dwie rzeczy są tak blisko z sobą powiązane, że można je umieścić w jednej procedurze, użytkownik i tak będzie ustawiał kolor i nicka naraz.

0

Nie rozumiem dlaczego to nie może działać tak: :( HELP!!!

procedure wyjście;
Begin
 writeln('Wyjsc? t\n')
 c:=readkey;
 IF c=t then halt;
 If c=n then P1;
End;

procedure P1;
Begin
 c:=readkey;
 IF c=#27 then wyjście;
 writeln('Podaj nick')
 ...
 wr('Podaj kolor');
 ...
end;

procedure P2;
Begin
 i:=readkey;
 if i=#27 then P1;
 writeln('1. Stworz czat');
 writeln('2. Dolacz do...');
 writeln('3. Usun...');
 c:=readkey;
 if (c=1) or (c=2) then P3;
 if c=3 then P4;
End;

Procedure P3;
BEGIN
 c:=readkey;
 if c=#27 then P2;
 {Tworzenie pliku txt}
 P5;
End;

Procedure P4;
Begin
 c:=readkey;
 if c=#27 then P2;
 {Usuwanie pliku txt}
 P2;
End;

Procedure P5;
Begin
 REPEAT
 c:=readkey;
 {pisanie wiadomości}
 {zapis wiadomości}
 {odczyt wiadomości}
 Until c=#27;
 P2;
End;


0

Skompiluj i uruchom poniższy program. Zobacz co się dzieje. Ten kod robi dokładnie to samo co twój, tylko ma 2 procedury zamiast ośmiu, nie pyta użytkownika o to co chce wybrać (wybiera za niego) i nie wypisuje nic.

Program aa;
 
procedure P4; forward;
 
procedure P3;
begin
  P4;
end;
 
procedure P4;
begin
  P3;
end;
 
BEGIN
  a;
END.
 

Kod zakończy się jakim Stack overflow error lub czymś podobnym. Twój kod robi DOKŁADNIE to samo, tylko wolniej, bo będziesz się po drodze pytał o coś użytkownika i coś wypisywał, ale dla wywołań funkcji nie ma to znaczenia. Jeżeli tego nie rozumiesz to ja już nie będę w stanie Ci pomóc.

0

A czy teraz, dobrze robię?

uses crt;

procedure menu1;
var
nick,kolor:string;

BEGIN
     writeln('Wpisz swoj nick i nacisnij enter.');
     readln(nick);
     clrscr;
     writeln('Wpisz kolor swojego nicku (angielskie nazwy)');
     readln(kolor);
     Menu2;
END;

Procedure Menu2;
var
i:char;

BEGIN
     writeln('1. Stworz czat.');
     writeln('2. Dolacz do czatu.');
     writeln('3. Usun czat.');
     case i of
     1: tworzenie;
     2: dolacz;
     2: usuwanie;
END;

Procedure tworzenie;
var
t:text;
sciezka:string;

BEGIN
     clrscr;
     writeln('Podaj sciezke dostepu do pliku *.txt');
     readln(sciezka);
     assign(t, sciezka);
     rewrite(t);
     close(t);
     czat;
END;

Procedure dolacz;
var
sciezka:string;

BEGIN
     writeln('Podaj sciezke dostepu do pliku *.txt');
     readln(sciezka);
     czat;
END;

Procedure Usuwanie;
var
t:text;
sciezka:string;

BEGIN
     writeln('Podaj sciezke do pliku *.txt aby usunac jego zawartosc:');
     readln(sciezka);
     assign(t: sciezka);
     rewrite(t);
     close(t);
END;

Procedure czat;
var
t:text;
Assign(t, sciezka);
Reset(t);

Itd...

0

Ty nadal nie ogarniasz podstaw. Po pierwsze: masz beznadziejne formatowanie kodu. Po drugie: aby Pascal zobaczył jakąś funkcję czy procedurę musi on być albo w sekcji interface innego modułu dodango do uses albo być nad procedurą czy funkcją wykorzystującą ją. Poczytaj też o słowie kluczowym forward w Delphi oraz Pascalu.

0

Okej już działa:

uses crt;
VAR
sciezka,nick,kolor:string;
z:char;

procedure menu1(var nick,kolor:string);

BEGIN
     writeln('Wpisz swoj nick i nacisnij enter.');
     readln(nick);
     clrscr;
     writeln('Wpisz kolor swojego nicku (angielskie nazwy)');
     readln(kolor);
END;

Procedure tworzenie(var sciezka:string);
var
t:text;


BEGIN
     clrscr;
     writeln('Podaj sciezke dostepu do pliku *.txt');
     readln(sciezka);
     assign(t, sciezka);
     rewrite(t);
     close(t);
END;

Procedure dolacz(var sciezka:string);


BEGIN
     writeln('Podaj sciezke dostepu do pliku *.txt');
     readln(sciezka);
END;

Procedure Usuwanie(var sciezka:string);
var
t:text;

BEGIN
     writeln('Podaj sciezke do pliku *.txt aby usunac jego zawartosc:');
     readln(sciezka);
     assign(t, sciezka);
     erase(t);
     close(t);
END;

Procedure czat(var sciezka,nick,kolor:string);
var
t:text;
i:char;
tekst:string;

BEGIN
     
     Assign(t, sciezka);
     REPEAT
     reset(t);
     REPEAT
     readln(t, tekst);
     writeln(tekst);
     UNTIL EOF(t);
     close(t);
     i:=readkey;
     Append(t);
     readln(tekst);
     writeln(t, nick, ':', tekst);
	clrscr;
     UNTIL i=#27;
     halt;
end;

BEGIN
	clrscr;
     menu1(nick,kolor);
     writeln('1. Stworz czat.');
     writeln('2. Dolacz do czatu.');
     writeln('3. Usun czat.');
     z:=readkey;
     IF z='1' then
     BEGIN
          tworzenie(sciezka);
          czat(sciezka,nick,kolor);
     END;
     IF z='2' then
     BEGIN
          dolacz(sciezka);
          czat(sciezka,nick,kolor);
     END;

END.

Teraz muszę tylko go podkoloryzować :)

0
uses crt,dos;
VAR
sciezka,nick,j:string;
kolor:char;
z:char;
label start,wyjdz;

procedure wyjscie(var j:string);


BEGIN
     clrscr;
     writeln('Czy napewno chcesz wyjsc z programu? [T\N]');

     END;
procedure menu1(var nick:string; kolor:char);

BEGIN
     writeln('Wpisz swoj nick i nacisnij enter.');
     readln(nick);
     clrscr;
     writeln('wybierz kolor swojego nicku');

     writeln(' 1  - niebieski');
     writeln(' 2  - zielony');
     writeln(' 3  - turkusowy');
     writeln(' 4  - czerwony');
     readln(kolor);

END;

Procedure tworzenie(var sciezka:string);
var
t:text;


BEGIN
     clrscr;
     writeln('Podaj sciezke dostepu do pliku *.txt');
     readln(sciezka);
     assign(t, sciezka);
     rewrite(t);
     close(t);
END;

Procedure dolacz(var sciezka:string);


BEGIN
     clrscr;
     writeln('Podaj sciezke dostepu do pliku *.txt');
     readln(sciezka);
END;

Procedure Usuwanie;
var
sciezka:string;
t:text;

BEGIN
     clrscr;
     writeln('Podaj sciezke do pliku *.txt aby go usunac:');
     readln(sciezka);
     assign(t, sciezka);
     erase(t);
END;


Procedure czat(var sciezka,nick:string; kolor:char);
var
t:text;
i:char;
tekst:string;



BEGIN
     clrscr;
     Assign(t, sciezka);
     REPEAT
     reset(t);
     REPEAT
     readln(t, tekst);
     writeln(tekst);
     UNTIL EOF(t);
     close(t);
     i:=readkey;
     Append(t);
     readln(tekst);
     If kolor=1 then textcolor(1);
     If kolor=2 then textcolor(2);
     If kolor=3 then textcolor(3);
     If kolor=4 then textcolor(4);
     write(t, nick, ':');
     textcolor(15);
     writeln(t, tekst);
	clrscr;

     UNTIL i=#27;
end;

BEGIN

	clrscr;
     menu1(nick, kolor);
     clrscr;
     start:
     writeln('1. Stworz czat.');
     writeln('2. Dolacz do czatu.');
     writeln('3. Usun czat.');
     writeln;
     writeln('4. Autorzy.');
     writeln('5. Wyjdz z programu.');
     z:=readkey;
     IF z='1' then
     BEGIN
          tworzenie(sciezka);
          czat(sciezka,nick,kolor);
          goto start;
     END;
     IF z='2' then
     BEGIN
          dolacz(sciezka);
          czat(sciezka,nick,kolor);
          goto start;
     END;
     IF z='3' then
     BEGIN
          usuwanie;
          clrscr;
          GOTO start;
     end;
     IF z='4' then
     BEGIN
          clrscr;
          gotoxy(35,5);
          textcolor(5);
          write('Lan');
          textcolor(4);
          gotoxy(38,5);
          write('Czat');
          textcolor(15);
          gotoxy(20,6);
          writeln('Jakub Budny: Efekty Audio-Wizualne');
          gotoxy(20,7);
          write('Marcin "Dyzio" Dobrowolski: LanCzat');
          readln;
          clrscr;
          goto start;
     end;

     IF z='5' then
        BEGIN
             wyjdz:
             wyjscie(j);
             j:=readkey;
             if j='t' then exit;
             if j='n' then
             BEGIN
                  clrscr;
                  goto start;
             end;
             IF (j<>'t') and (j<>'n') then
             begin
                  goto wyjdz;
             end;
         end;

END.

To jest aktualny kod mojego programu. Chcę zrobić tak, aby użytkownik mógł wybrać kolor swojego nicku, ale nie działa mi gdy używam textcolor. Macie może inny pomysł?

0

Nie koloruje tylko w przypadku nicków? Jeśli tak to chyba tu jest błąd:

Zmień:

procedure menu1(var nick:string; kolor:char);

Na:

procedure menu1(var nick:string; var kolor:char);
0

Zmień

If kolor=1 then textcolor(1);
If kolor=2 then textcolor(2);
If kolor=3 then textcolor(3);
If kolor=4 then textcolor(4);

na:

if (kolor in [1 .. 4]) then
  textcolor(kolor);

Styl wielbłądzi się kłania;

PS: Weź pod uwagę ten blok:

IF z='1' then
     BEGIN
          tworzenie(sciezka);
          czat(sciezka,nick,kolor);
          goto start;
     END;
     IF z='2' then
     BEGIN
          dolacz(sciezka);
          czat(sciezka,nick,kolor);
          goto start;
     END;
     IF z='3' then
     BEGIN
          usuwanie;
          clrscr;
          GOTO start;
     end;
     IF z='4' then
     BEGIN
          clrscr;
          gotoxy(35,5);
          textcolor(5);
          write('Lan');
          textcolor(4);
          gotoxy(38,5);
          write('Czat');
          textcolor(15);
          gotoxy(20,6);
          writeln('Jakub Budny: Efekty Audio-Wizualne');
          gotoxy(20,7);
          write('Marcin "Dyzio" Dobrowolski: LanCzat');
          readln;
          clrscr;
          goto start;
     end;
 
     IF z='5' then
        BEGIN
             wyjdz:
             wyjscie(j);
             j:=readkey;
             if j='t' then exit;
             if j='n' then
             BEGIN
                  clrscr;
                  goto start;
             end;
             IF (j<>'t') and (j<>'n') then
             begin
                  goto wyjdz;
             end;
         end;

Pięć razy stosujesz if z = 'X' then; Zamień if na case Ord(z) of; Poczytaj o kodach ASCII i wyłącz CapsLock;

0

Okej, wszystko działa tak jak chcę, tylko jest jeden najważniejszy problem. Program musi działać tak, że z pliku wypisywana na ekran jest ostatnia linijka z pliku, jeśli taka została do niego dopisana. I tak w kółko, dopóki użytkownik nie zacznie czegoś pisać na klawiaturze i nie wiem jak to zrobić.

Procedure czat(var sciezka,nick:string);
var
t:text;
i:char;
tekst:string;
Const
  dni:array[0..6] of string=('Niedz','Pon','Wto','Sro','Czw','Pia','Sob');  {1}
Var
 rok,mies,dzien,dztyg:word;
  godz,min,sek,sek100:word;

BEGIN
     clrscr;
     Assign(t, sciezka);
     REPEAT
     reset(t);
     REPEAT
     readln(t, tekst);
     writeln(tekst);
     UNTIL EOF(t);
     close(t);
     i:=readkey;
     Append(t);
     readln(tekst);
     GetDate(rok,mies,dzien,dztyg);
     Write(t,dni[dztyg],'  ',dzien,'-',mies,'-',rok,' ');
     GetTime(godz,min,sek,sek100);
     Write(t,godz,':',min,':',sek,':',sek100,' ');
     writeln(t,'~', nick, ':');
     writeln(t, tekst);
     clrscr;
     UNTIL i=#27;
end;

Myślałem żeby zrobić to na zasadzie:
REPEAT
REPEAT
wypisywanie tekstu;
if keypressed then break;
UNTIl jakiś tam nigdy nie spełniony warunek;
wpisywanie do pliku;
UNTIL #27;

Ale i tak mi nie działało... Proszę pomóżcie :( Koleś od programowania powiedział, że program jest na ocenę NDST ponieważ nie działa jak czat. Tzn. nie wypisuje na ekran OD RAZU wiadomości którą napisał drugi użytkownik.

0

od 1,5h realizowałem swój pomysł (na "odświeżanie" wiadomości) na który wpadłem wracając ze szkoły który i tak nie zadziałał.
Miało to działać mniej więcej tak:
repeat
readln(t, tekst);
REPEAT
IF length(tekst)>dlugosc THEN
BEGIN
REPEAT
wypisywanie na ekran tekstu;
UNTIL EOF(t);
dlugość
END;
UNTIL keypressed;
zapisywanie tekstu do pliku;
UNTIL #27;

Proszę, pomóżcie!!!

0

uff przeczytałem wszystko...
I teraz zadam ważne pytanie czy sprawdziłeś najważniejsze mianowicie czy w TP dostaniesz się do zasobu sieci lan? Jeśli nie program nie ma sensu.
TP pisany był dla DOS'u od tamtego czasu systemy bardzo się zmieniły i nie pchał bym się na twoim miejscu w obsługę myszki, graficznych trybów a'la 13h, gdzie bez wstawek asm'a nic nie zrobisz. Jak zauważyłeś konsola działa nieco inaczej niż okienka...
albo pracuje użytkownik, albo pracuje komputer jeśli przekażesz użytkownikowi prawo do wpisywania to program "zawiesza się" do czasu naciśnięcia klawisza i w tym czasie nie możesz sprawdzić np. czy zawartość pliku się zmieniła.
Dlatego sprawdzenie zawartości pliku możesz zrobić tylko i wyłącznie po tym gdy user naciśnie np. enter a w tym czasie zawartość pliku zmieni się 100-krotnie i pojawią się tzw. lagi.

IMO zły pomysł na progekt dla laika jakim niewątpliwie jesteś zwłaszcza w TP, który narzuca znaczne ograniczenia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1