Perl: Zgaduj Zgadula

Autor: Arkadiusz Tobiasz 5 listopada 2008

Tym razem chciałbym zaprezentować mały skrypcik, który wykonałem na języki skryptowe. Skrypt napisany jest w perlu i nazywa się Zgaduj Zgadula. Jest to gra, która polega na odgadnięciu przez gracza losowo wybranej przez komputer liczby całkowitej z przedziału <1,100>. Gracz ma 10 prób, a po każdej z nich komputer sprawdza czy podano właściwą liczbę, jeśli nie na ekranie pojawia się podpowiedź czy odgadywana liczba jest większa czy mniejsza.

Zasady gry:

  • liczba rund max 10,
  • przy każdej kolejnej rundzie w znaku zachęty pojawia się napis: Runda x, gdzie x to numer kolejnej rundy,
  • po zakończeniu rozgrywki wyświetla się komunikat z pytaniem, czy użytkownik chce jeszcze raz zagrać, po wybraniu opcji „Tak” skrypt wykonuje się ponownie,
  • program sprawdza czy użytkownik podaje poprawne dane wejściowe (czy wyrażenie jest liczbą oraz czy liczba jest z przedziału <0,100>),
  • wprowadzony jest prosty system rejestracji, który zapisuje nick do pliku, a jeżeli ktoś już podał nick użyty, to odczytuje sumę punktów z wszystkich rozgrywek jakie stoczyła osoba o tym nicku,
  • wprowadzony jest prosty system punktacji, po odgadnięciu liczby użytkownik dostaje 11-x punktów, gdzie x to numer rundy, w której liczba została odgadnięta,
  • punkty zapisywane są do pliku i sumowane z wszystkich rozgrywek.

Warunki korzystania ze skryptu:

  • Skrypty są rozpowszechniane na licencji GPL.
  • Jedynym warunkiem ich użytkowania jest nieusuwanie żadnych danych umożliwiających identyfikację autora skryptu.
  • Możesz wykorzystywać fragmenty ich kodu we własnych projektach oraz dowolnie modyfikować.

Kod skryptu wygląda tak:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#!/usr/bin/perl

# Autor skryptu: Arkadiusz Tobiasz
# www: http://www.tobiasz.org
# blog: http://www.blog.tobiasz.org
# mail: arek@tobiasz.org
#
# Skrypty są rozpowszechniane na licencji GPL.
# Jedynym warunkiem ich użytkowania jest nieusuwanie żadnych danych umożliwiających identyfikację autora skryptu.
# Możesz wykorzystywać fragmenty ich kodu we własnych projektach oraz dowolnie modyfikować.


use strict;
use warnings;

my $range = 100;  # przedzial liczb do wylosowania
my $random_number;  # wylosowana liczba
my $rund = 1;   # numer rundy
my $runds = 10;   # ilosc rund
my $play = 1;   # gra wlaczona
my $again = 0;    # czy uzytkownik chce grac jeszcze raz
my $number;     # liczba wybrana przez uzytkownika
my $register = 0; # czy zarejestrowany

my $name;   # nazwa uzytkownika
my $result;   # wynik podczas gry
my $points;   # liczba punktow
my $nick;

print "Podaj nick:\n";
chomp($name = <STDIN>);
print "--------------------------------\n";

open(top10, "top10.txt" ) || die "Nie można otworzyć pliku!";

while( <top10> )
{
  chomp;
    ($nick, $points) =split( /;;/ );

  if($nick eq $name)
  {
    print "Witaj $name!\n";
    print "Liczba punktow: $points\n";
    print "Powodzenia w grze!\n";
    $register = 1;
  }
 

}
close( top10 );
if($register == 0)
{
  print "Witaj $name!\n";
  print "Wlasnie zostales zarejestrowany.\n";
  print "Obecnie masz 0 punktow.\n";
  print "Powodzenia w grze!\n";
  open (top10, ">>top10.txt") or die "Nie można otworzyć pliku: $!";
  print top10 "$name;;0\n";
  close(top10);
  $points = 0;
}

print "--------------------------------\n";

while($play == 1) {
 
  $random_number = int(rand($range) + 1); # losowanie liczby z przedzialu

  while($rund < 11) {
   
    do
    {
      do
                        {
                                print "Podaj liczbe z przedzialu <0,100>:\n";
                                print "Rudna $rund: ";
                                chomp($number = <STDIN>);
                        }
                        until($number > 0 && $number < 100);

    }
    until($number =~ /^[+-]?\d+$/);   #sprawdzenie czy wyrazenie jest liczba

    if($number == $random_number)
    {
      print "Brawo udalo Ci sie odgadnac liczbe w $rund rundzie!\n";
     
      $result = 11 - $rund;
     
      print "Zdobyles $result punktow!\n";
     
      $result = $result + $points;
      print "W sumie masz $result punktow.\n";


      open (top10, "<top10.txt") or die "Nie można otworzyć pliku: $!";
      open (top10_new, ">top10_new.txt") or die "Nie można otworzyć pliku: $!";
      while( <top10> )
      {
        chomp;
        ($nick, $points) =split( /;;/ );
        if ($nick eq $name)
        {
          print top10_new "$name;;$result\n";
        } else {
          print top10_new "$nick;;$points\n";
        }
       
     
      }
      close(top10);
      close(top10_new);
      unlink("top10.txt");
      rename("top10_new.txt", "top10.txt");

      $rund = 11;
      print "--------------------------------\n";
    }
    else
    {
      $runds = $runds - 1;
 
      if($number > $random_number)
        {
     
        print "Wylosowana liczba jest mniejsza od podanej!\n";
        print "Pozostalo Ci jeszcze $runds prob.\n";
        print "--------------------------------\n";
      }
   
      if($number < $random_number)
      {
        print "Wylosowana liczba jest wieksza od podanej!\n";
        print "Pozostalo Ci jeszcze $runds prob.\n";
        print "--------------------------------\n";
      }
    }

    $rund++;
  }
 
  print "Czy chcesz zagrac jeszcze raz? [t/n]\n";
  chomp($again = <STDIN>);
 
  if($again eq "t" || $again eq "T")
  {
    $play = 1;
    $rund = 1;
    $runds = 10;
    $points = $result;
  }
  else
  {
    $play = 0;
  }
  print "--------------------------------\n";
}

Spakowana paczka ze skryptem:

komentarze 2

  1. RobertG napisał(a):

    IMHO gdybyś podzielił kod skryptu na procedury byłby znacznie bardziej czytelny.

  2. Arkadiusz Tobiasz napisał(a):

    Masz rację, może kiedyś go przerobię 😉

Odpowiedz

 

Arkadiusz Tobiasz student Akademii Ekonomicznej im. Karola Adamieckiego w Katowicach na specjalnościach informatyka ekonomiczna oraz rachunkowość. Więcej...

jQuery Validation i funkcja remote

Jakiś czas temu zwrócił się do mnie użytkownik z problemem. Chodzi o to, że korzysta on z pluginu walidacji jQuery, […]

Zend Framework: integracja z Uploadify

W tym wpisie postaram się przedstawić Wam w jaki sposób zintegrować skrypt Uploadify z Zend Frameworkiem. Dzięki temu będziemy mogli […]

Javascript: Czasowe wyświetlanie reklamy

Czasami chcemy, aby na pewnym elemencie naszej strony wyświetlała się reklama przez jakiś czas, a następnie zniknęła. W tym wpisie […]

Linux: backup wszystkich baz danych MySQL

Swego czasu pisałem o tym jak z poziomu konsoli można szybko i przyjemnie zrobić backup bazy MySQL. Wszystko jest ładnie […]