BÀN PHÍM VÀ MÀN HÌNH
Bài 3.2. Bộ Tú lơ khơ
Lập chương trình hiển thị trên màn hình các quân bài Tú lơ khơ gồm Rô, Cơ, Pích, Nhép theo quy định quân A mang mã số 1 và có 1 hình đơn vị, các quân mã số i từ 2 đến 10 có i hình đơn vị, các quân J, Q và K lần lượt có 11, 12 và 13 hình đơn vị tương ứng. Hình đơn vị gồm bốn loại kí tự có mã ASCII tương ứng như sau:
(Rô) : #4, (Cơ) : #3, (Pích): #6, (Nhép): #5.
8 A Q
8 A Q Ba quân bài Tú lơ khơ
Gợi ý
Trước hết ta cần thống nhất một số quy định sau:
Quân bài được vẽ bằng một màu M tùy chọn.
Nếu là quân Rô hoặc Cơ ta đặt màu chữ là đỏ (RED), với các quân Pích và Nhép ta đặt màu chữ là đen (BLACK).
Mỗi quân bài có hai thuộc tính là loại (Rô, Cơ, Pích hoặc Nhép) và mã số. Mã số của quân A là 1, J là 11, Q là 12 và K là 13. Các quân còn lại mang mã số từ 2 đến 10 ứng với số ghi trên quân bài đó.
Trên nền các quân bài J, Q và K không vẽ hình người mà vẽ số lượng hình đơn vị (Rô, Cơ, Pích hoặc Nhép) tương ứng với mã số của quân đó.
Để bố trí số lượng hình đơn vị trên mỗi quân bài cho cân đối ta cần 5 dòng. Thủ tục Dong(q:char;s:string;x,y:byte) vẽ 5 dòng chứa hình đơn vị loại q, bắt đầu tính từ toạ độ (x, y) ứng với vị trí góc trên trái của quân bài trên màn hình, theo dấu hiệu ghi trong xâu mẫu s. Thí dụ, lời gọi với xâu mẫu s = '20302' sẽ vẽ 5 dòng thể hiện cho quân mang mã số 7 thuộc loại v (Rô, Cơ, Pích hoặc Nhép) như sau:
1. Dòng thứ nhất có 2 kí tự v.
2. Dòng thứ hai có 0 kí tự v tức là để trống.
3. Dòng thứ ba có 3 kí tự v.
4. Dòng thứ tư có 0 kí tự v tức là để trống.
5. Dòng thứ năm có 2 kí tự v.
Vì trong xâu mẫu s tổng cộng có 2 + 3 + 2 = 7 kí tự v nên quân bài mang mã số 7.
procedure Dong(v: char;s: string;x,y: byte);
var i: byte;
begin
x := x+3; y := y+TY;
for i := 1 to 5 do begin
gotoxy(x,y);
case s[i] of
'1': write(BL,BL,v,BL,BL);
'2': write(v,BL,BL,BL,v);
'3': write(v,BL,v,BL,v);
end;
y := y+TY;
end;
end;
Các mẫu dòng s được tính toán trước và khởi trị như sau:
MauDong: array[1..13] of string[5] =
('00100', '01010', '10101', '20002', '20102', '20202', '20302', '21212', '30303', '22222',
'22322', '23232', '23332');
Ta dễ dàng nhận ra có tất cả 13 mẫu dòng ứng với 13 mã số 1(A), 2,..., 10, 11(J), 12(Q) và 13(K). Tóm lại mẫu dòng thứ i cho ta phương thức vẽ i hình đơn vị trên quân bài mang mã số i. Mỗi mẫu dòng được biểu diễn qua một xâu 5 kí tự.
Các thủ tục điều khiển màn hình có ý nghĩa như sau:
gotoxy(x,y): Chuyển con trỏ màn hình đến cột x dòng y.
TextColor(c): Đặt màu c cho nét chữ. Thí dụ, kể từ sau khi gặp lệnh TextColor(BLACK) các kí tự xuất hiện trên màn hình sẽ có nét màu đen,
TextBackGround(m): Đặt màu m cho nền chữ. Thí dụ, kể từ sau khi gặp lệnh TextBackGround(WHITE) các kí tự sẽ được viết trên nền trắng.
textattr: Biến hệ thống có giá trị 1 byte, tính từ phải qua trái, 4 bit đầu tiên (gọi là các bit thấp) tạo thành một số nguyên thể hiện màu cho nét chữ, 4 bit tiếp theo (gọi là các bit cao) thể hiện màu cho nền chữ. Thí dụ phép gán textattr:=7 sẽ được nhận giá trị nhị phân là (0000)(0111) và do đó hệ thống sẽ đặt màu nét chữ là 7 (màu trắng) và màu nền chữ là 0 (màu đen). Như vậy phép gán trên tương đương với tổ hợp của hai lệnh TextColor và TextBackGround.
Lệnh write(a:m) hiển thị đơn vị dữ liệu a với độ rộng m vị trí. Nếu chiều dài dữ liệu của a nhỏ hơn m thì hệ thống tự động điền thêm dấu cách cho đủ m vị trí. Nếu chiều dài dữ liệu của a lớn hơn m thì hệ thống hiển thị đủ vị trí cho a. Thí dụ, lệnh write(BL:20)sẽ hiển thị 20 dấu cách trên màn hình.
Vì màn hình trong hệ điều hành Windows có độ phân giải cao, khác với màn hình văn bản trong DOS nên thủ tục VeBai được cài đặt với tham số điều khiển Kieu quy định kiểu của hệ điều hành. Kieu = Wind sẽ hiển thị bộ bài trong chế độ Windows, Kieu = DOS sẽ hiển thị bộ bài trong chế độ màn hình DOS. Hai kiểu chỉ khác nhau ở một giá trị cần khởi trị cho vài tham số, cụ thể là:
Kích thước quân bài. Nếu coi mỗi quân bài như một hình chữ nhật thì DX là chiều rộng, DY là chiều dài.
Độ giãn dòng TX. Khi hiển thị trên màn hình Windows thì ta để cách hai dòng, TX = 2, ngược lại, trên màn hình DOS ta đặt TX = 1.
Bảng dưới đây mô tả các tham số cần khởi trị cho hai môi trường WINDOWS và DOS.
WINDOWS DOS
DX 9 9
DY 12 6
TX 2 1
Các tham số kích thước quân bài DX DY và độ giãn cách
dòng TX
trong môi trường WINDOWS và DOS.
(* Pascal *)
uses crt;
const
CO = #3; RO = #4; NHEP = #5; PIC = #6;
WIND = 1; DOS = 2; BL = #32;
DX: byte = 9;
DY: byte = 12; {kich thuoc quan bai}
TY: byte = 2;
MauDong: array[1..13] of string[5] = ('00100', '01010', '10101', '20002', '20102',
'20202', '20302', '21212', '30303', '22222', '22322', '23232', '23332');
Nhan: array[1..13] of string[2]
= ('A','2','3','4','5', '6','7','8',‟9', 10', 'J','Q','K');
procedure Dong(q: char;s: string;x,y: byte); tự viết {---
Ve nen mau M cho quan bai tai vi tri goc tren trai (x,y) ---}
procedure Nen(M,x,y: byte);
var i: byte;
begin
TextBackGround(M);
for i:= 0 to DY do begin
gotoxy(x+1,y+i);
write(BL:DX);
end;
end;