Deck deck =
new
Deck();
Bây gi vi c đ t các ph
ng th c thu c v các đ i t
ng
ờ ệ ặ
ươ
ứ
ộ ề
ố ượ Deck vào trong l i đ nh nghĩa l p
ờ ị
ớ Deck là h p
ợ
lý. Khi xem xét nh ng ph
ng th c mà ta đã vi t cho đ n gi , d th y m t ng c viên đó
ữ
ươ
ứ
ế
ế
ờ ễ ấ
ộ ứ
ử
là printDeck (M c
ụ 13.7). Sau đây là dáng v c a nó, đ c vi t l i đ ho t đ ng v i
ẻ ủ
ượ
ế ạ ể
ạ ộ
ớ Deck:
public static void
printDeck(Deck deck) {
for
(
int
i = 0; i < deck.cards.length; i++) {
Card.printCard(deck.cards[i]);
}
}
M t s thay đ i là ki u c a tham s , t
ộ ự
ổ
ể ủ
ố ừ Card[] sang Deck.
Thay đ i th hai là ta không còn dùng đ
c
ổ
ứ
ượ deck.length đ l y chi u dài c a m ng, b i gi đây
ể ấ
ề
ủ
ả
ở
ờ
deck đã
là m t đ i t
ng
ộ ố ượ Deck, ch không ph i m t m ng. Nó ch a m t m ng, nh ng nó không ph i là m ng.
ứ
ả
ộ
ả
ứ
ộ
ả
ư
ả
ả
B i v y ta ph i vi t
ở ậ
ả
ế deck.cards.length đ k t xu t đ c m ng t đ i t ng
ể ế
ấ ượ
ả
ừ ố ượ Deck r i l y chi u dài c a
ồ ấ
ề
ủ
m ng này.
ả
V i lý do t
ng t , ta ph i dùng
ớ
ươ
ự
ả
deck.cards[i] đ truy c p m t ph n t c a m ng, thay vì ch vi t
ể
ậ
ộ
ầ ử ủ
ả
ỉ ế deck[i].
S thay đ i cu i cùng là vi c kích ho t
ự
ổ
ố
ệ
ạ printCard ph i nói rõ r ng
ả
ằ printCard đ c đ nh nghĩa trong
ượ ị
l p
ớ Card.
14.2 Tráo bài
Trong ph n l n các trò ch i bài tây, b n c n ph i tráo c bài; nghĩa là x p bài theo m t tr t t ng u
ầ ớ
ơ
ạ ầ
ả
ỗ
ế
ộ
ậ ự
ẫ
nhiên. M c 12.6
Ở ụ
ta đã th y cách phát sinh s ng u nhiên, song th t không d th y cách áp d ng đ
ấ
ố
ẫ
ậ
ễ ấ
ụ
ể
tráo c bài.
ỗ
M t kh năng là mô ph ng cách con ng
i tráo bài, th
ng là chia c bài làm đôi r i ch n bài đan xen
ộ
ả
ỏ
ườ
ườ
ỗ
ồ
ọ
t t ng ph n. B i ng
i th
ng không th tráo chính xác theo cách này đ
c, nên sau ch ng 7 l n l p
ừ ừ
ầ
ở
ườ
ườ
ể
ượ
ừ
ầ ặ
l i thao tác thì c bài d
ng nh đã hoàn toàn ng u nhiên. Song m t ch
ng trình máy tính thì l i có
ạ
ỗ
ườ
ư
ẫ
ộ
ươ
ạ
đ c đi m luôn tr n bài th t hoàn h o nên k t qu s không th t ng u nhiên. Th c t là, sau 8 l n tr n,
ặ
ể
ộ
ậ
ả
ế
ả ẽ
ậ
ẫ
ự ế
ầ
ộ
máy s làm cho c bài v nguyên tr ng. B n có th xem thông tin thêm
ẽ
ỗ
ề
ạ
ạ
ể
ở http://en.wikipedia.org/wiki/Faro_shuffle.
M t thu t toán tr n bài h p lý h n là trong m i l n duy t ch l t m t lá bài, và m i l n l p thì ch n l y
ộ
ậ
ộ
ợ
ơ
ỗ ầ
ệ
ỉ ậ
ộ
ỗ ầ ặ
ọ ấ
hai lá bài r i đ i ch chúng.
ồ ổ
ỗ
Sau đây là phác th o cách ho t đ ng c a thu t toán này. Đ phác h a ch
ng trình, tôi k t h p câu l nh
ả
ạ ộ
ủ
ậ
ể
ọ
ươ
ế ợ
ệ
Java v i ngôn ng nói, mà đôi khi đ
c g i là
ớ
ữ
ượ ọ
gi mã
ả
:
for
(
int
i = 0; i < deck.cards.length; i++) {
// chọn một số nằm giữa 1 và deck.cards.length-1
// đổi chỗ lá bài thứ i và lá bài ngẫu nhiên được chọn
}
Đi u hay gi mã là nó th
ng làm rõ nh ng ph
ng th c nào mà b n s p c n có. Trong tr
ng h p
ề
ở ả
ườ
ữ
ươ
ứ
ạ ắ ầ
ườ
ợ
này, ta c n m t th nh
ầ
ộ
ứ
ư randomInt, đ ch n m t s nguyên ng u nhiên gi a
ể ọ
ộ ố
ẫ
ữ low và high,
và swapCards đ nh n vào hai ch s r i đ i ch hai lá bài v trí các ch s đó.
ể
ậ
ỉ ố ồ ổ
ỗ
ở ị
ỉ ố