Odliczanie czasu w aplikacji konsolowej.

0

Witam.
Rozpoczynam przygodę z programowaniem i jako ćwiczenie mam do zrobienia grę polegającą na odgadywaniu haseł.
Żeby ta gra była trochę bardziej emocjonująca chciałbym ograniczyć możliwy czas na odpowiedź do powiedzmy 10 sekund.

Proszę o podpowiedź jak coś takiego można zrobić w aplikacji konsolowej możliwie jak najprostszymi metodami żeby osoba początkująca była w stanie to pojąć.

0

Wydaje mi się, że najprostszym rozwiązaniem będzie użycie Timer'a:

Timer t = new Timer(TimerCallback, null, 0, maxTimeForAnswer);

gdzie TimerCallback to metoda, która jest wywołana po upłynięciu czasu podanego w maxTimeForAnswer
W podanej metodzie TimerCallback możesz zamieścić na przykład komunikat o zakończeniu rozgrywki, o porażce.

EDIT:
Dorzucę jeszcze coś z dokumentacji: https://msdn.microsoft.com/en-us/library/2x96zfy7(v=vs.110).aspx

0

@Bartosz36 myślę, że problemem nie jest to jak odliczać czas tylko jak to wyświetlić w konsoli ;)

0

@hipekk: Racja, dzięki!
W takim razie proponuję ustawić Timer cyklicznie, by TimerCallback odpalał się co sekundę. W metodzie TimerCallback zamieścić wyświetlanie komunikatu w konsoli.
Problemem może być licznik odpalonych już Timer'ów <- coś, co pozwoli zliczyć, czy mamy już 10 wystąpień TimerCalback. Wtedy przerwanie rozgrywki.
Innym sposobem może być wykorzystanie dwóch Timer'ów: jeden na 10 sekund, a drugi cykliczny (co sekunda) <- Wtedy uniknie się licznika wystąpień.

0

@Bartosz36 to nadal nie ten problem ;).

W aplikacji okienkowej wrzucasz gdzieś label i on sobie odlicza (zmiana jego tekstu nie wpływa na wygląd pozostałych komponentów).
OP chce (tak mi się wydaje) żeby np. na górze ekranu był odliczany czas, a niżej było widoczne zadanie.

Mi jedyne co przychodzi do głowy to odświeżanie całości ekranu w każdym "obrocie" timera - nie jest to pewnie jedyne rozwiązanie dlatego go nie proponowałem ;)

0

@hipekk Nie masz racji. To jest ten problem. To co napisałeś:

żeby np. na górze ekranu był odliczany czas, a niżej było widoczne zadanie.

To nic innego, jak zastosowanie Timer'a, o którym pisałem. Tym bardziej, gdy piszesz:

Mi jedyne co przychodzi do głowy to odświeżanie całości ekranu w każdym "obrocie" timera

To też jak najbardziej to, co napisałem o zastosowanu Timer'a. Po prostu to, w jaki sposób OP wyświetli sobie ten czas i gdzie go sobie wyświetli, to już naprawdę szczegóły implementacji. A to zostawiam autorowi tematu, który jedyne o co prosił to:

Proszę o podpowiedź jak coś takiego można zrobić w aplikacji konsolowej

0
Bartosz36 napisał(a):

Po prostu to, w jaki sposób OP wyświetli sobie ten czas i gdzie go sobie wyświetli, to już naprawdę szczegóły implementacji.

No nie do końca, bo w aplikacji konsolowej to będzie największym problemem :)

1

Ale jaki problem... wystarczy zrobic klase monitor ktora sie komunikuje z consola i przygotowywuje tekst do wyswietlenia (Formatuje go) i mozesz postawiac co gdzie chcesz

nie wspomne ze zapewne jest jakas paczka ktora juz to robi

0

@fasadin kiedyś, (bardzo krótko) szukałem informacji jak zmienić konkretną linię (już wyświetloną) w konsoli i nie znalazłem rozwiązania (jednak tak jak mówię, nie przykładałem się za bardzo), a myślę że właśnie o to chodzi pytającemu.

1

Tak na bardzo szybko:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
using System.Threading.Tasks;

namespace ForP
{
    class Counter
    {
        private int count;
        private Timer timer = new Timer();

        public Counter(int count)
        {
            this.count = count;
        }

        public void Start()
        {
            Stop();
            timer.Interval = 1000;
            timer.Elapsed += (sender, e) =>
            {
                Console.SetCursorPosition(6, 6);
                Console.WriteLine("{0,2}", count--);
                if (count < 0)
                    timer.Stop();
            };
            timer.Start();
        }

        public void Stop()
        {
            timer.Stop();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var counter = new Counter(10);
            counter.Start();
            while (true) { }
        }
    }
}
0

Dawno temu w Pascalu to było proste -- uses Crt, a potem GoToXY... :)

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