Witam. Nie mam pewności co do odpowiedzi na pytania dot. działania gry (pokera) napisanej w JavaScript.
Byłbym wdzięczny za sprawdzenie (i ewentualnie poprawienie odpowiedzi) :)
Moje odp. (niektórych brak) wyglądają następująco:
- Jaką funkcje pełni zmienna tally?
odp. ? - W jakim celu stworzono funkcję numsort?
odp. W celu porównania liczb dla sort() - O jaką właściwość zostaje wzbogacony element DOM img (id=”card3”) po wykonaniu funkcji InitGame?
odp. Obsługa zdarzenia? - Jaka jest wartośc składników obiektu deck[21] po wykonaniu pętli for – linia 24 *.js
odp. Dec[21] = 8h - Na czym polega działanie instrukcji for –linia 34 *.js
odp. Tasowanie kart (poprzez zamiane dwóch losowych kart przy użyciu zmiennej pomocniczej) - Na czym polega sens wykonania funkcji Score – linia 31 *.js
odp. Do zerowania wyniku (np. gdy nowa gra) - Co jest skutkiem wykonania instrukcji nexti.src = deck[nextcard+1].fname() – linia 45 *.js
odp. Wstępnie załaduje następny obraz - Wyjaśnij co jest skutkiem kliknięcia na linki o napisie „zacznij od nowa”, skoro właściwośc href tego linku jest równa href=”#”?
odp. Wywołanie zdarzenia OnClick powodującego uruchomienie funkcji InitGame - Dlaczego występuje reakcja na kliknięcie „miejsca na karte” na planszy?
odp. Ponieważ jest ustawiona reakcja na zdarzenie? - Jakie jest znaczenie lini thiscard = (e.target) ? e.target: e.scrElement; ? –linia 55
**odp. Sprawdza które pole zostało kliknięte (target mozilla / e.srcElement IE) ** - Co jest skutkiem działania instrukcji pos=thiscard.id.substring(4) dla kliknięcia na 2 rzedzie 2 karty na planszy?
odp. Pos = 7 - Jaką role pełni tablica board, a jaką deck?
odp. Board reprezentuje plansze przechowując 25 elementów Card, tablica deck symuluje talie kart - Jakie jest znaczenie (w jaki sposób jest zmieniana i wykorzystywana) zmienna nextcard?
zmieniana przez inkrementacje (++), wskazuje na następną karte - Do czego służy funkcja fname?
odp. Generuje nazwe pliku obrazu wg Card - Do przechowywania jakich informacji służy zmienna thiscard, a do jakich zmienna drawcard?
odp. Thiscard – obecna carda, drawcard – następna karta - Jaką rolę pełni zmienna nexti? Do przechowywania obiektów jakiego typu służy?
odp. Praktycznie? Żadną, teoretycznie służy do przechowywania obrazów - Jakie parametry przekazywane są do funkcji zliczającej ilość punktów w rzędzie?
odp. board[r], board[r+1], board[r+2], board[r+3], board[r+4],”row”, gdzie x to nr wiersza
ORAZ board[r], board[r+5], board[r+10], board[r+15], board[r+20],”col”, gdzie x to nr kolumny - W jakim przypadku funkcja AddScore nie wykonuje obliczeń, tylko „od razu” zwraca w wyniku 0?
odp. Jeżeli jest pusty rząd (kolumna olbo wiersz) zwraca 0 - Dlaczego stwierdzenie „strita” i „pokera królewskiego” odbywa się w różny sposób?
odp. W stricie karty muszą być ułożone po kolei, natomiast w pokerze królewskim muszą to być 10,K,Q,K,A - W jaki sposób odbywa się stwierdzenie „pokera”
odp. Jeżeli jest strit AND (&&) kolor == true to jest wtedy poker - Jakie merytoryczne znaczenie posiada instrukcja for –linia 161
odp. ? - W jaki sposób odbywa się stwierdzenie ‘trójki’?
odp. Jeżeli three – true znaczy to że jest trójka - W jaki sposób odbywa się stwierdzenie „fula”? jakiego typu są zmienne tree i pairs?
odp. jeżeli three AND pairs == 1 (true) znaczy to, że jest FUL - Jakim elementem DOM jest ‘obj’? – linia 102
odp. - W jakich wypadkach wywoływana jest funkcja InitGame?
odp. po załadowaniu strony lub poprzez kliknięcie „zacznij od nowa” (zdarzenie OnClick) - Co oznacza zapis nexti=New Image(53,68)?
Odp. Tworzenie nowego obiektu IMAGE - Co jest warunkiem zakończenia gry?
odp. Wszystkie 25 pól muszą być zapełnione - W jaki sposób zmieniamy napisy wewnątrz odnośnika?
Odp. nazwa_obiektu.InnerHTML=””; - Jakiego typu jest zmienna flush i co ona robi?
odp. Jest to zmienna typu BOOL’enaowskiego, oznacza KOLOR-FLUSH
30. W jaki sposób dotrzeć do obiektu DOM o znanym identyfikatorze?
odp. dokument.getElementById(nazwa_obiektu).
KOD *.JS
// zmienne globalne
var tally = new Array(14)
var nextcard = 1;
var nexti = new Image(53,68);
// porównanie liczbowe dla sort()
function numsort(a, b) {
return a - b;
}
//function InitGame() {
if (!document.getElementById) return;
stat=document.getElementById("status");
stat.innerHTML="Next Card";
nextcard = 1;
// tablica dla zawartości planszy
board = new Array(26);
for (i=1; i<26; i++) {
board[i] = new Card(0,"x");
obj=document.getElementById("card"+i);
obj.src = "blank.gif";
obj.onclick = PlaceCard;
}
// zapełnij talię (na razie uporządkowaną)
deck = new Array(53);
for (i=1; i<14; i++) {
deck[i] = new Card(i,"c");
deck[i+13] = new Card(i,"h");
deck[i+26] = new Card(i,"s");
deck[i+39] = new Card(i,"d");
}
// oczyść wyniki
Score();
// tasuj karty
n = Math.floor(100 * Math.random() + 200);
for (i=1; i<n; i++) {
c1 = Math.floor(52*Math.random() + 1);
c2 = Math.floor(52*Math.random() + 1);
temp = deck[c2];
deck[c2] = deck[c1];
deck[c1] = temp;
}
// odkryj pierwszą kartę na ekranie
next=document.getElementById("dcard");
next.src = deck[nextcard].fname();
// wstępnie załaduj następny obraz
nexti.src = deck[nextcard+1].fname();
obj=document.getElementById("newgame")
obj.onclick=InitGame;
} // koniec InitGame
// połóż kartę na planszy w miejscu kliknięcia
function PlaceCard(e) {
if (!e) var e = window.event;
// które pole planszy zostało kliknięte?
thiscard = (e.target) ? e.target: e.srcElement;
pos = thiscard.id.substring(4);
if (board[pos].suit != "x") {
return;
}
drawcard=document.getElementById("dcard");
thiscard.src = deck[nextcard].fname();
drawcard.src = "blank.gif";
board[pos] = deck[nextcard];
nextcard++;
Score();
// Koniec gry?
if (nextcard > 25) {
EndGame();
}
else {
drawcard.src = deck[nextcard].fname();
// buforuj obraz następnej karty w talii na stole
nexti = new Image(53,68);
nexti.src = deck[nextcard+1].fname();
}
}
// sprawdź ukończone wiersze i wyświetl wyniki
function Score() {
score=document.getElementById("totalscore");
totscore = 0;
// wiersze
for (x=0; x<5; x++) {
r = x * 5 + 1;
a = AddScore(board[r],board[r+1],board[r+2],board[r+3],board[r+4],"row"+x);
totscore += a;
}
// kolumny
for (x=0; x<5; x++) {
r = x + 1;
a = AddScore(board[r],board[r+5],board[r+10],board[r+15],board[r+20],"col"+x);
totscore += a;
}
// przekątne
a = AddScore(board[5],board[9],board[13],board[17],board[21],"diag1")
totscore += a;
a = AddScore(board[1],board[7],board[13],board[19],board[25],"diag2")
totscore += a;
score.firstChild.nodeValue = totscore;
}
// sprawdź układy kart
function AddScore(c1,c2,c3,c4,c5,scorebox) {
obj=document.getElementById(scorebox);
straight = false;
flush = false;
royal = false;
pairs = 0;
three = false;
// tablica sortowana dla wygody
nums = new Array(5);
nums[0] = c1.num;
nums[1] = c2.num;
nums[2] = c3.num;
nums[3] = c4.num;
nums[4] = c5.num;
nums.sort(numsort);
// bez wyniku, jeśli rząd nie jest pełny
if (c1.num == 0 || c2.num == 0 || c3.num == 0
|| c4.num == 0 || c5.num == 0) {
obj.innerHTML="";
return 0;
}
// kolor
if (c1.suit == c2.suit && c2.suit == c3.suit
&& c3.suit == c4.suit && c4.suit == c5.suit) {
flush = true;
}
// strit
if (nums[4] - nums[3] == 1
&& nums[3] - nums[2] == 1
&& nums[2] - nums[1] == 1
&& nums[1] - nums[0] == 1) {
straight = true;
}
// poker królewski (10, J, Q, K, A)
if (nums[1] == 10 && nums[2] == 11 && nums[3] == 12
&& nums[4] == 13 && nums[0] == 1) {
straight = true;
royal = true;
}
// Poker królewski, poker, strit, kolor
if (straight && flush && royal) {
obj.innerHTML="Poker królewski<br>250";
return 250;
}
if (straight && flush) {
obj.innerHTML="Poker<br>50";
return 50;
}
if (straight) {
obj.innerHTML="Strit<br>4";
return 4;
}
if (flush) {
obj.innerHTML="Kolor<br>5"
return 5;
}
// tablica tally jest odliczeniem dla każdej wartości karty
for (i=1; i<14; i++) {
tally[i] = 0;
}
for (i=0; i<5; i++) {
tally[nums[i]] += 1;
}
for (i=1; i<14; i++) {
// kareta
if (tally[i] == 4) {
obj.innerHTML="Kareta<br>25";
return 25;
}
if (tally[i] == 3) three = true;
if (tally[i] == 2) pairs += 1;
}
// full
if (three && pairs == true) {
obj.innerHTML="Full<br>8";
return 8;
}
// dwie pary
if (pairs == 2) {
obj.innerHTML="Dwie pary<br>2";
return 2;
}
// trójka
if (three) {
obj.innerHTML="Trójka<br>3";
return 3;
}
// ledwie para
if (pairs == 1) {
obj.innerHTML="Para<br>1";
return 1;
}
// nic
obj.innerHTML="Bez punktów<br>0";
return 0;
// koniec AddScore()
}
// koniec gry - ostateczny wynik
function EndGame() {
stat=document.getElementById("status");
stat.innerHTML="<b>Koniec gry</b>";
}
// wygeneruj nazwę pliku obrazu wg obiektu Card
function fname() {
return this.num + this.suit + ".gif";
}
// konstruktor obiektów Card
function Card(num,suit) {
this.num = num;
this.suit = suit;
this.fname = fname;
}
// funkcje obsługi zdarzeń do rozpoczęcia gry
window.onload=InitGame;
KOD HTML:
<html>
<head>
<title>Poker-samotnik</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">
<script language="JavaScript" type="text/javascript"
src="pokersol.js">
</script>
<link rel="stylesheet" type="text/css" href="pokersol.css">
</head>
<body>
<table>
<tr>
<td colspan="2"><h1>Poker-samotnik</h1></td>
<td> <img id="card1" src="blank.gif" height="68" width="53"> </td>
<td> <img id="card2" src="blank.gif" height="68" width="53"> </td>
<td> <img id="card3" src="blank.gif" height="68" width="53"> </td>
<td> <img id="card4" src="blank.gif" height="68" width="53"> </td>
<td> <img id="card5" src="blank.gif" height="68" width="53"></td>
<td class="score" id="row0"> </td>
</tr>
<tr>
<td> <img id="dcard" border="0"
src="blank.gif" height="68" width="53"></td>
<td> </td>
<td> <img id="card6" src="blank.gif" height="68" width="53"></td>
<td> <img id="card7" src="blank.gif" height="68" width="53"></td>
<td> <img id="card8" src="blank.gif" height="68" width="53"></td>
<td> <img id="card9" src="blank.gif" height="68" width="53"></td>
<td> <img id="card10" src="blank.gif" height="68" width="53"></td>
<td class="score" id="row1"> </td>
</tr>
<tr>
<td valign="top" id="status">Następna karta</td>
<td> </td>
<td> <img id="card11" src="blank.gif" height="68" width="53"></td>
<td> <img id="card12" src="blank.gif" height="68" width="53"></td>
<td> <img id="card13" src="blank.gif" height="68" width="53"></td>
<td> <img id="card14" src="blank.gif" height="68" width="53"></td>
<td> <img id="card15" src="blank.gif" height="68" width="53"></td>
<td class="score" id="row2"> </td>
</tr>
<tr>
<td id="total"> <b>Całkowity wynik:</b>
<div id="totalscore">0</div></td>
<td> </td>
<td> <img id="card16" src="blank.gif" height="68" width="53"></td>
<td> <img id="card17" src="blank.gif" height="68" width="53"></td>
<td> <img id="card18" src="blank.gif" height="68" width="53"></td>
<td> <img id="card19" src="blank.gif" height="68" width="53"></td>
<td> <img id="card20" src="blank.gif" height="68" width="53"></td>
<td class="score" id="row3"> </td>
</tr>
<tr>
<td> <a id="newgame" href="#"><b>Zacznij od nowa</b></a></td>
<td> </td>
<td> <img id="card21" border=0 src="blank.gif" height=68 width=53></td>
<td> <img id="card22" border=0 src="blank.gif" height=68 width=53></td>
<td> <img id="card23" border=0 src="blank.gif" height=68 width=53></td>
<td> <img id="card24" border=0 src="blank.gif" height=68 width=53></td>
<td> <img id="card25" border=0 src="blank.gif" height=68 width=53></td>
<td class="score" id="row4"> </td>
</tr>
<tr>
<td> </td>
<td class="score" id="diag1"> </td>
<td class="score" id="col0"> </td>
<td class="score" id="col1"> </td>
<td class="score" id="col2"> </td>
<td class="score" id="col3"> </td>
<td class="score" id="col4"> </td>
<td class="score" id="diag2"> </td>
</table>
</body>
</html>