Sprawdzanie znaku na żywo w konsoli

Odpowiedz Nowy wątek
2015-01-14 23:02
0

Czy istnieje możliwość odczytania znaku w konsoli<ort> ,</ort> podając X i Y ?
Program wczytuje do konsoli na bieżąco znaki z pliku tekstowego<ort> ,</ort> ale dochodzą inne<ort> ,</ort> w zależności od ingerencji <ort>urzytkownika</ort>. Najbardziej mi zależy<ort> ,</ort> aby sprawdzał<ort> ,</ort> czy jest "< >(różna)" od ' ' czyli spacji. powiem<ort> ,</ort>że jest to prosta gierka i XY będzie pobierany z położenia ludzika<ort> ,</ort> a dalsza część algorytmu będzie opisywała całego ludzika z O,|,/,. Procedura będzie sprawdzała<ort> ,</ort> czy w planszy (zbiorze znaków specjalnych czcionki Terminal)przed ludzikiem jest ścianka. Dałbym sobie z tym radę<ort> ,</ort> tylko to odczytywanie znaku w punkcie XY. Procedura wczytująca opiera się na kojarzeniu plik<ort> ,</ort> i poleceniu readln(plik ,String);

edytowany 3x, ostatnio: ŁF, 2015-01-16 21:32

Pozostało 580 znaków

2015-01-14 23:10
1
  1. Zrób tablicę w pamięci zawierającą to co wyświetlasz na ekran, sprawdzaj w tablice.
  2. http://msdn.microsoft.com/en-[...]op/ms684965%28v=vs.85%29.aspx

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-14 23:13
1

Chyba źle się do tego zabierasz; Jeśli dobrze zrozumiałem, to współrzędne ścian nigdzie nie są przechowywane, a Ty potrzebujesz sprawdzać co się znajduje w danym miejscu na ekranie konsoli; Nie powinieneś tego robić - dane o planszy musisz gdziesz przechowywać, najlepiej w macierzy dwuwymiarowej i do niej się odnosić, przy wykrywaniu kolizji; A ekran to ekran - ma jedynie wyświetlać obraz;

Opisany wyżej sposób zastosowałem w swojej (niedokończonej) grze SnakeASCII, dość dobrze się to obsługuje i działa wystarczająco szybko, by nie trzeba było narzekać.


Pozostało 580 znaków

2015-01-15 08:46
0

Niby są przechowywane w pliku tekstowym jako "rysunek' , ALE położenie jako tylko znaki i program musiałby odczytywać je na bieżąco. Warto chyba jednak załadować ten rysuneczek do pamięci. gracz przesuwa planszę w prawo czy w lewo w menu , a algorytm usuwa odpowiednią ilość spacji lub je dodaje na początku każdej linii. Naciśnięcie klawisza J powoduje wyświetlenie za każdym cyklem pętli while(rysowanie planszy ,readkey) w pierwszej linijce danych takich jak życie , punkty , oraz pó. XY ludzika ,numer muzyki. To dodaje automatycznie jedną linijkę do współrzędnych .
Pytanie 2 : Jak programowo włączyć tryb pełnoekranowy [Alt] + [enter].
Pytanie 3 : Jak zmienić (i czy się da ?) rozmiar czcionki w bieżącym okienku
Pytanie 4 : Czy da się stworzyć timer w konsoli? Chciałbym , aby działał jako przerwanie (poruszanie przeciwnikiem ,etc...);
Stosuję bibliotekę CRT z Pascala.

Łomatko... Przed przecinkiem nie stawia się spacji, tak jak i przed żadnym znakiem interpunkcyjnym poza nawiasem otwierającym i myślnikiem. - ŁF 2015-01-16 21:33

Pozostało 580 znaków

2015-01-15 15:40
1

Niby są przechowywane w pliku tekstowym jako "rysunek' , ALE położenie jako tylko znaki i program musiałby odczytywać je na bieżąco.

Chodzi właśnie o to, aby dane o ścianach i obiektach trzymać co najmniej w jednej macierzy; Dzięki temu ekran będzie służył jedynie do wyświetlania i nie będziesz musiał tracić czasu; A wszelkie operacje będą wykonywane w pamięci, więc będą szybkie;

Jeżeli Twoja plansza może być większa niż okno konsoli, to dodatkowo polecam skorzystać z dwóch zmiennych liczbowych, które określać będą lewy i górny offset; Z tych offsetów będzie korzystać procedura rysująca obiekty na ekranie, aby dokładnie wiedzieć który fragment mapy narysować w konsoli;

gracz przesuwa planszę w prawo czy w lewo w menu , a algorytm usuwa odpowiednią ilość spacji lub je dodaje na początku każdej linii.

Lepiej by było podać kod, niż go opisywać; Poważnie - opis niewiele daje, bo nie jest tak precyzyjny, jak kod;

Naciśnięcie klawisza J powoduje wyświetlenie za każdym cyklem pętli while(rysowanie planszy ,readkey) w pierwszej linijce danych takich jak życie , punkty , oraz pó. XY ludzika ,numer muzyki.

Tylko pamiętaj o tym, aby odrysowywać jedynie te fragmenty ekranu, które tego wymagają; Rysowanie po konsoli jest potwornie wolne, więc nie przerysowuj całego ekranu, bo będzie to trwało zbyt długo; W swojej grze przerysowuję dosłownie kilka znaków na całym ekranie w każdej klatce, więc całość działa bardzo płynnie - sam też tak powinieneś zrobić;

Pytanie 2 : Jak programowo włączyć tryb pełnoekranowy [Alt] + [enter].

Można zasymulować wciśnięcie tych klawiszy; Zobacz tutaj;

Pytanie 3 : Jak zmienić (i czy się da ?) rozmiar czcionki w bieżącym okienku

Fontu, nie czcionki; Zobacz tutaj - ja tego jeszcze nie testowałem, więc w razie czego dopytuj @vpiotr;

Pytanie 4 : Czy da się stworzyć timer w konsoli? Chciałbym , aby działał jako przerwanie (poruszanie przeciwnikiem ,etc...);
Stosuję bibliotekę CRT z Pascala.

Da się w bardzo prosty sposób, i to nawet kilka, działających "jednocześnie" :]

Za dużo było by tłumaczenia jak na post, więc pobierz sobie archiwum SnakeASCII_full_source.zip i zobacz jak to jest zaimplementowane; Klasa pojedynczego timera znajduje się w module Timer.pp, a używana jest w klasie TGame z modułu Game.pp; Zobacz jak główna pętla w metodzie TGame.Play używa tych dwóch liczników;

Ogólnie chodzi o to, że główna pętla zamraża program w każdej iteracji na 40ms; W każdej iteracji zostają także wywołane metody Step w dwóch timerach; Każdemu timerowi nadawana jest ilość klatek do odliczenia - im więcej klatek (więcej razy 40ms), tym dłużej trzeba czekać na odliczenie pełnego interwału; Aby sprawdzić, czy dany licznik doliczył już zadaną ilość klatek, należy skorzystać z metody ItsTime i jeśli zwróci True - można wykonać jakąś akcję;

Takich timerów możesz obsługiwać w jednej pętli i 20, a program nadal będzie jedno-wątkowy; To jest sposób podpatrzony z konstrukcji starych gier na Pegasusa - jest bardzo prosty do zrealizowania i dla prostej gry wystarczy;


edytowany 1x, ostatnio: furious programming, 2015-01-15 15:41

Pozostało 580 znaków

2015-01-16 09:24
0

Podaję kod odpowiedzialny za centrowanie :
-Korzysta on z procedury LOAD(deklarowana ręcznie) -odczytuje ona zawartość dokumentu aż do pustej lini (repeat i UNTIL):
PROCEDURA WCZYTUJACA- LOAD:

  procedure Load;
 var
  Plik : TextFile;  // nowa zmienna
  S : String;
begin
writeln('');
 // otworz plik
  AssignFile(Plik, plansza);
  Reset(Plik);

    repeat // petla
      Readln(Plik, S); // odczytaj plik
    writeln(horizontal+S); // dodaj linie ;-komentarz
    until S = ''; // jeżeli napotkasz na pusta linie zakończ działanie pętli
  CloseFile(Plik); // zamknij plik
   end;

Procedura USTAWIAJĄCA ŚRODEK(ręcznie):

 procedure modyf;
begin
while z<>'x' do
begin
crt.ClrScr;
SetConsoleTitle('TEXTMAN -Ustawienia');
{
//-------------TRYB PRŁNOEKRANOWY ALT + ENTER-----
 PostMessage(GetStdHandle(STD_OUTPUT_HANDLE), KF_ALTDOWN, 0, 0);
  PostMessage(GetStdHandle(STD_OUTPUT_HANDLE), 256, 0,integer(#13));
  PostMessage(GetStdHandle(STD_OUTPUT_HANDLE), 257, 0, integer(#13));
 PostMessage(GetStdHandle(STD_OUTPUT_HANDLE), KF_UP, 0, 0);
 PostMessage(GetStdHandle(STD_OUTPUT_HANDLE),  18, 0, 0); }
//------------------------------------------------
writeln('MODYFIKACJA GRY');
writeln('1.Centrowanie POZIOME');
writeln('Nacisnij prawy lub lewy klawisz.Ustaw środek');
crt.TextColor(11);
writeln('<- -> ,Q-podglad, X-koniec');
writeln('Ustawienia jakości obrazu : Z -niska jakość V -wysoka jakość');
crt.TextColor(12);
writeln(horizontal+'Ĺ');
Z:=crt.ReadKey;
crt.TextColor(7);
if z='q' then begin load; readkey; end;

if length(horizontal)<79 then if z='M' then horizontal:=horizontal+' '; //prawo dodaj spacje
if z='K' then Delete(horizontal, length(horizontal)-1, 1); //lewo  -usuń ostatni znak
if z='z' then crt.LowVideo;
if z='v' then crt.HighVideo;
end;
Z:=' '; //resetuj ,aby ostatni znak to nie x
end;

ostatnim znakiem nie może być po zakończeniu X , bo wtedy dojdzie do zakończenia gry.Dzięki temu cofamy się tylko z bieżących ustawień.
Zmienna horizontal (string) przechowuje łańcuch -spacje ,które dodawane są na początku lini menu , planszy , etc...

edytowany 1x, ostatnio: programista97, 2015-01-16 12:45

Pozostało 580 znaków

2015-01-16 13:19
0

Ok ! Mam już jeden problem z głowy : tryb pełnoekranowy , jak widać miałem dobry tok myślenia -symulacja wciśnięcia klawiszy (kawałek błędnego kodu oznaczony jako komentarz) Wystarczyło :

        keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
        keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN, 0), 0, 0);
        keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN, 0), KEYEVENTF_KEYUP, 0);
        keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0); 

DZIĘKI ! Aplikacja waży już sobie ok 400 KB :-) . Opanowałem kolorowanie pojedynczych znaków za pomocą CRTka , oddtwarzanie dźwięków WAW (rozszerzenie zmienione na MUS dla niepoznaki ) ,stworzę jeszcze z dwa zegary , nauczę przeciwnika iść w kierunku mnie (sprawdzanie pozycji mnie , wroga i ewentualna korekcja przez +1 / -1 XY)
Ma ktoś jeszcze pomysł , jak rozwiązać problem strzelania pociskami ? Nie chodzi tutaj czym , czy zmiana koloru , prosta animacja tylko o to jak tworzyć nowe zaraz po wystrzeleniu , żeby usser nie miał nad nim już kontroli. Lot jego to chyba na timerze trzeba zrobić , bo nie ma jak.

Pozostało 580 znaków

2015-01-16 13:24
0

@programista97 - możesz pokazać zrzut tej gry? Bo póki co nie rozumiem w ogóle co chcesz osiągnąć; Czemu linie z pliku czytasz "na żywo", zamiast załadować sobie cały plik do pamięci?


3000 post - jak miło :> - furious programming 2015-01-16 13:25

Pozostało 580 znaków

2015-01-16 13:39
0

Tak wygląda całość : sorry za jakość. W kodzie jak zwykle muszę zrobić porządek. Na szczęście , po ostatnich waszych namowach nauczyłem się pisać w miarę czytelnie kod , więc poprawki będą dotyczyły tylko usunięcia poleceń "serwisowych"( sprawdzających coś , które nie działały , etc) oznaczonych jako komenty oraz zrobienie odpowiednich wcięć.
Na żywo miało wczytywać z dwóch powodów : plansze miały być potężne (Ile Microsoft Windows wierszy i kolumn dał), więc aby nie zapychać pamięci , dwa to modyfikacja w czasie gry : naciśnięcie klawisza , zrobienie jakiejś czynności miało modyfikować planszę ( tworzenie drzwi , przejść , nowych pomieszczeń czy nawet rysowanie planszy podczas gry. Obawiałem się ,że gdy ktoś będzie to odpalał na małej ilości pamięci , to może strasznie mulić

  • gg.jpg (0,07 MB) - ściągnięć: 99
edytowany 2x, ostatnio: programista97, 2015-01-16 13:55

Pozostało 580 znaków

2015-01-16 13:54
1

No i co teraz potrzebujesz zrobić z tym wczytywaniem linii z pliku?

[...] więc poprawki będą dotyczyły tylko usunięcia poleceń "serwisowych"( sprawdzających coś , które nie działały , etc) oznaczonych jako komenty [...]

Nie rób tego komentarzami, bo za dużo z tym roboty... Polecam zrobić sobie prosty mechanizm logowania "serwisowych" informacji do pliku tekstowego; W tych miejscach, w których chcesz podglądnąć jakieś dane, wstaw instrukcje wpisujące wymagane dane do pliku; Na końcu zdefiniuj sobie symbol, np.:

{$DEFINE DEBUG_GAME}

i dyrektywami $IFDEF obejmij te linijki, np.:

{$IFDEF DEBUG_GAME}
LogData('[Coords] X: ', intX, ', Y: ', intY);
{$ENDIF}

Gdzie instrukcja LogData dopisuje nową linijkę do pliku logu, a zmienne intX i intY to współrzędne jakiegoś obiektu;

Takich symboli możesz utworzyć więcej, aby móc logować informacje tylko danego typu; Dzięki temu będziesz mógł włączyć/wyłączyć dane logowanie za pomocą zaremowania lub odblokowania definicji;

W źródłach RTL i LCL jest sporo zaremowanych intrukcji DebugLn; Wiadome - można ręcznie odblokowywać/blokować pojedyncze wywołania, jednak aby to zrobić ze wszystkimi - trzeba znaleźć wszystkie wywołania i coś z nimi zrobić.


edytowany 2x, ostatnio: furious programming, 2015-01-16 13:56

Pozostało 580 znaków

2015-01-16 13:58
0

Nie mam takich chyba poleceń , co musiałbym włączać i wyłączać - zostały stare śmieci przykład : z próby wywołania fullscreena ,nie udało się to dodałem to jako komentarz , aby dwa razy nie pisać ,jak znajdę błąd. Ale metoda jest genialna ! Dzięki , kiedyś ją wykorzystam ! No ! Kod wygląda coraz lepiej. Teraz już widać zagnieżdżone procedury ,instrukcje warunkowe. jeszcze z 30 minut i będzie czytelny , jak Michał Anioł namalował (nie chodzi o tego troyana :-) )

edytowany 1x, ostatnio: programista97, 2015-01-16 14:16

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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