Lập trình trò chơi tính điểm quân đôminô trong Pascal
2020-08-09T10:06:52-04:00
2020-08-09T10:06:52-04:00
https://sachgiai.com/Tin-hoc/lap-trinh-tro-choi-tinh-diem-quan-domino-trong-pascal-13466.html
https://sachgiai.com/uploads/news/2020_07/lap-trinh-pascal.jpg
Sách Giải
https://sachgiai.com/uploads/sach-giai-com-logo.png
Chủ nhật - 09/08/2020 10:05
Cho 1 quân đôminô trên bàn và một số quân đôminô. Một người chơi một trò chơi sau đây:
- Người đó lần lượt gắn các quân đôminô vào quân đã có sẵn ban đầu.
- Người đó được gọi là thắng cuộc nếu tổng các số điểm của các quân còn lại là nhỏ nhất trong tất cả cách lắp.
- Hãy lập trình để máy chơi được trò chơi trên và luôn thắng cuộc.
■ Hướng dẫn:
- Đây là trò chơi một người, thuật toán chủ yếu là vét cạn các cách đi có thể để tổng số điểm còn lại đạt giá trị nhỏ nhất.
- Ta dùng thủ tục đệ qui Find (trai, phai: byte) để có thể quay lui khi vét cạn.
Thủ tục này thể hiện bằng PASCAL như sau:
{$M65520,0,0}
PROGRAM BAILAM3;
USES CRT;
TYPE Conco=Record
x,y: Byte;
co: set of byte;
End;
VAR i,j,m,1m,1maxphai,1maxtrai,1minphai,lmintrai: Integer;
sigma,max,min: longint;
domino: array[1..100 of conco;
luutrai,luuphai,kqmaxtrai,kqmaxphai,kqmintrai,kqminphai: array[1.. 100] og byte;
flag: set of byte;
ch:char;
tarn: set of byte;
trai,phai,demtrai,demphai: Byte;
oknhap: boolean;
PROCEDURE KEU;
BEGIN
Sound(1305);
Delay(300);
Nosound;
END;
PROCEDURE FIND (trai,phai: Byte);
VAR j : integer;
found: boolean;
BEGIN
found : = false;
For j : = 1 to 1m do
If j in flag then
With domino[j] do
Begin
If (trai in co) then
Begin
found : = true;
sigma : = sigma-x-y;
flag: = flag-[j]
demtrai : = demtrai+1;
luutrai[demtrai] : = j;
If (trai=x) then Find(y,phai)
Else Find(x,phai);
demtrai: = demtrai-1;
sigma: = sigma+x+y;
flag: = flag+[j];
End;
If (phai in co) then
Begin
found: = true;
flag : = flag-[j];
sigma: = sigma-x-y;
demphai: = demphai+1;
luuphai[demphai] : = j;
If (phai=x) then find (trai,y);
Else find(trai,x);
demphai : = demphai-1;
sigma : = sigma+x+y;
flag : = flag+[j];
End;
End;
If (not found) then
Begin
If (sigma>max) then
begin
max: = sigma;
1maxphai : = demphai;
1maxtrai : = demtrai
kqmaxtrai : = luutrai;
kqmaxphai : = luuphai;
end;
If (sigmacmin) then
begin
min : = sigma;
1minphai : = demphai;
1mintrai : = demtrai;
kqmintrai : = luutrai
kqminphai : = luuphai;
end;
End;
END;
PROCEDURE XUAT;
BEGIN
Repeat
clrscr;
writeln(’Menu’);
Writeln(‘1. Xem dap so cau 2');
Writeln('2. Xem dap so cau 3');
Writeln('3. quit');
Repeat
ch : = readkey;
Until ch in; [‘1’..’3’]
Case ch of
'1' : begin
For i : = 1mintrai down to 1 do
With domino[kqmintrai[i] do
begin
write(x',’,y,'->');
end;
For i : = 1 to 1minphai do
With domino[kqminphai[i]] do
begin
write(x,',',y,'->');
end;
Gotoxy(where-2,wherey);Writeln(' ');
Writeln(‘So diem con lai la',min) ;
readln;
end;
'2' : begin
For i: = 1maxtrai down to 1 do
With domino[kqmaxphai[i]] do
begin
write(x,',',y,’->');
end;
Gotoxy(where-2,wherey);Writeln(' ');
Writeln(‘So diem con lai la',max);
readln;
end;
end;
Until ch=’3';
END;
PROCEDURE DOING;
BEGIN
clrscr;
Writeln(Nhap vao cap i0 j0');
Readln(trai phai);
If (((trai-m)*(trai)>0) or ((phai-m)*(phai)>0)) then
begin
keu;
Writeln(‘Nhap bay ba');
Readin;
exit;
end;
tam : = [trai,phai];
i: = 0;
Repeat
i : = i + 1;
Until (domino[i].co=tam);
demphai : = 1;
demtrai : = 0;
flag : = flag-[i];
luuphai[1]: = i;
sigma: = sigma-domino[i].x-domino[i].y;
Writeln(‘Wait me a few minutes long’);
max : = 0;
min : = 2147483647;
Find(trai,phai);
xuat;
readln
END;
PROCEDURE NHAP;
VAR s : string;
error : integer;
BEGIN
Writeln(‘Nhap m');
Readln(s);
Val(s,m,error);
If (error< >0) then
begin
Writeln(‘Kieu so sai.Nhap lai');
Readin;
exit;
end;
Writeln(‘Cong thuc tinh so hinh chu nhat la To hop C(m+1), 2+m+1=(m+1)*(m+2)/2');
1m : = (m+1)*(m+2) div 2;
Writeln(‘Va so do bang',1m);
oknhap : = true;
flag : = [1..1m];
1m : = 0;
sigma : = 0;
For i : = 0 to m do
For j : = i to m do
begin
1m: = lin+1;
sigma: = sigma+i+j;
domino[1m].x : = i;
domino[1m].y: = j;
domino[1m].co: = [i,j];
end;
Oknhap : = true;
readln;
END;
BEGIN
oknhap : = false;
Repeat
clrscr;
writeln(’Menu’);
Writeln(1. Cau 1');
Writeln('2. Can 2 & 3');
Writeln('3. quit');
Repeat
ch: = readkey;
Until ch in ['1'..'3'];
Case ch of
'1' : Nhap;
'2' : If oknhap then Doing
Else.
keu;
end;
Until ch='3';
END.