mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-21 23:00:43 -08:00
Sudoku in pascal
This commit is contained in:
382
Sudoku/pascal/sudoku.pas
Normal file
382
Sudoku/pascal/sudoku.pas
Normal file
@@ -0,0 +1,382 @@
|
|||||||
|
program sudoku;
|
||||||
|
uses crt,strings;
|
||||||
|
type
|
||||||
|
short=1..9;
|
||||||
|
var
|
||||||
|
j,n,l,o,p,q,limk1,limk2,limi1,limi2:short;
|
||||||
|
ch:string[1];
|
||||||
|
x,y,no1,no2,i,s,k:integer;
|
||||||
|
b,t,v:boolean;
|
||||||
|
key,yn:char;
|
||||||
|
M:array [1..9,1..9] of string[1];
|
||||||
|
xy:array [1..2,1..81] of integer;
|
||||||
|
cht:array [1..6] of string[4];
|
||||||
|
label
|
||||||
|
theend,randoms,repeatative1,repeatative2,saisir,game;
|
||||||
|
begin
|
||||||
|
|
||||||
|
clrscr;
|
||||||
|
gotoxy(11,11);
|
||||||
|
write('*Welcome to Sudoku Game!*');
|
||||||
|
gotoxy(11,12);
|
||||||
|
write('(Press ENTER to start...)');
|
||||||
|
gotoxy(56,11);
|
||||||
|
write('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>');
|
||||||
|
gotoxy(56,12);
|
||||||
|
write('<27> <20>');
|
||||||
|
gotoxy(56,13);
|
||||||
|
write('<27> <20>');
|
||||||
|
gotoxy(56,14);
|
||||||
|
write('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>');
|
||||||
|
gotoxy(9,24);
|
||||||
|
write('All rights reserved to CrYmFoX 2016.');
|
||||||
|
gotoxy(10,22);
|
||||||
|
write('Created By Sameur Ben Hmouda.');
|
||||||
|
repeat
|
||||||
|
gotoxy(59,12);
|
||||||
|
yn:=readkey;
|
||||||
|
until yn=chr(13);
|
||||||
|
|
||||||
|
game:
|
||||||
|
|
||||||
|
clrscr;
|
||||||
|
|
||||||
|
|
||||||
|
writeln(' _____________________________________________________ ');
|
||||||
|
writeln('| | | | | | | | | |');
|
||||||
|
writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
|
||||||
|
writeln('| | | | | | | | | |');
|
||||||
|
writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
|
||||||
|
writeln('| | | | | | | | | |');
|
||||||
|
writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
|
||||||
|
writeln('| | | | | | | | | |');
|
||||||
|
writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
|
||||||
|
writeln('| | | | | | | | | |');
|
||||||
|
writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
|
||||||
|
writeln('| | | | | | | | | |');
|
||||||
|
writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
|
||||||
|
writeln('| | | | | | | | | |');
|
||||||
|
writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
|
||||||
|
writeln('| | | | | | | | | |');
|
||||||
|
writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
|
||||||
|
writeln('| | | | | | | | | |');
|
||||||
|
writeln('|_____|_____|_____|_____|_____|_____|_____|_____|_____|');
|
||||||
|
|
||||||
|
gotoxy(60,3);
|
||||||
|
write('+Instructions+');
|
||||||
|
gotoxy(57,5);
|
||||||
|
write('*Keys to move:');
|
||||||
|
gotoxy(58,6);
|
||||||
|
write('Up=Z / Down=S / Left=Q');
|
||||||
|
gotoxy(58,7);
|
||||||
|
write('/ Right=D.');
|
||||||
|
gotoxy(57,9);
|
||||||
|
write('*Enter numbers from');
|
||||||
|
gotoxy(58,10);
|
||||||
|
write('1 to 9 and press');
|
||||||
|
gotoxy(58,11);
|
||||||
|
write('"Space" to erase.');
|
||||||
|
gotoxy(57,13);
|
||||||
|
write('-----------------------');
|
||||||
|
gotoxy(57,15);
|
||||||
|
write('*Press "P" to exit.');
|
||||||
|
gotoxy(57,17);
|
||||||
|
write('-----------------------');
|
||||||
|
gotoxy(63,19);
|
||||||
|
write('Enjoy! ^-^');
|
||||||
|
|
||||||
|
repeatative2:
|
||||||
|
for k:=1 to 9 do
|
||||||
|
for i:=1 to 9 do
|
||||||
|
M[i,k]:=' ';
|
||||||
|
|
||||||
|
randomize;
|
||||||
|
for k:=1 to 9 do
|
||||||
|
begin
|
||||||
|
if k in [1..3] then
|
||||||
|
begin
|
||||||
|
limk1:=1;
|
||||||
|
limk2:=3;
|
||||||
|
end
|
||||||
|
else if k in [4..6] then
|
||||||
|
begin
|
||||||
|
limk1:=4;
|
||||||
|
limk2:=6;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
limk1:=7;
|
||||||
|
limk2:=9
|
||||||
|
end;
|
||||||
|
|
||||||
|
no2:=0;
|
||||||
|
repeatative1:
|
||||||
|
no2:=no2+1;
|
||||||
|
for i:=1 to 9 do
|
||||||
|
begin
|
||||||
|
if i in [1..3] then
|
||||||
|
begin
|
||||||
|
limi1:=1;
|
||||||
|
limi2:=3;
|
||||||
|
end
|
||||||
|
else if i in [4..6] then
|
||||||
|
begin
|
||||||
|
limi1:=4;
|
||||||
|
limi2:=6;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
limi1:=7;
|
||||||
|
limi2:=9
|
||||||
|
end;
|
||||||
|
|
||||||
|
no1:=0;
|
||||||
|
randoms:
|
||||||
|
no1:=no1+1;
|
||||||
|
str(random(9)+1,ch);
|
||||||
|
b:=true;
|
||||||
|
for j:=1 to 9 do
|
||||||
|
b:=b and (ch <> M[j,k]);
|
||||||
|
for l:=1 to 9 do
|
||||||
|
b:=b and (ch <> M[i,l]);
|
||||||
|
for p:=limk1 to limk2 do
|
||||||
|
for q:=limi1 to limi2 do
|
||||||
|
b:=b and (ch <> M[q,p]);
|
||||||
|
if b=true then
|
||||||
|
M[i,k]:=ch
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if no1=100 then
|
||||||
|
begin
|
||||||
|
for o:=1 to 9 do
|
||||||
|
M[o,k]:=' ';
|
||||||
|
if no2 <> 100 then
|
||||||
|
goto repeatative1
|
||||||
|
else
|
||||||
|
goto repeatative2
|
||||||
|
end;
|
||||||
|
goto randoms
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
for i:=1 to 38 do
|
||||||
|
begin
|
||||||
|
limi1:=random(9)+1;
|
||||||
|
limi2:=random(9)+1;
|
||||||
|
M[limi1,limi2]:=' ';
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
x:=4;
|
||||||
|
for k:=1 to 9 do
|
||||||
|
begin
|
||||||
|
y:=2;
|
||||||
|
for i:=1 to 9 do
|
||||||
|
begin
|
||||||
|
gotoxy(x,y);
|
||||||
|
write(M[i,k]);
|
||||||
|
y:=y+2
|
||||||
|
end;
|
||||||
|
x:=x+6
|
||||||
|
end;
|
||||||
|
|
||||||
|
s:=0;
|
||||||
|
for k:=1 to 9 do
|
||||||
|
for i:=1 to 9 do
|
||||||
|
if M[i,k] <> ' ' then
|
||||||
|
begin
|
||||||
|
s:=s+1;
|
||||||
|
xy[1,s]:=(k-1)*6+4;
|
||||||
|
xy[2,s]:=(i-1)*2+2;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
x:=28;
|
||||||
|
y:=10;
|
||||||
|
gotoxy(x,y);
|
||||||
|
saisir:
|
||||||
|
|
||||||
|
key:=readkey;
|
||||||
|
case key of
|
||||||
|
'z' : begin
|
||||||
|
gotoxy(2,22);
|
||||||
|
write(' ');
|
||||||
|
y:=y-2
|
||||||
|
end;
|
||||||
|
's' : begin
|
||||||
|
gotoxy(2,22);
|
||||||
|
write(' ');
|
||||||
|
y:=y+2
|
||||||
|
end;
|
||||||
|
'd' : begin
|
||||||
|
gotoxy(2,22);
|
||||||
|
write(' ');
|
||||||
|
x:=x+6
|
||||||
|
end;
|
||||||
|
'q' : begin
|
||||||
|
gotoxy(2,22);
|
||||||
|
write(' ');
|
||||||
|
x:=x-6
|
||||||
|
end;
|
||||||
|
'p' : goto TheEnd;
|
||||||
|
' ' : begin
|
||||||
|
gotoxy(2,22);
|
||||||
|
write(' ');
|
||||||
|
|
||||||
|
b:=false;
|
||||||
|
for k:=1 to 81 do
|
||||||
|
begin
|
||||||
|
str(xy[1,k],cht[1]);
|
||||||
|
str(xy[2,k],cht[2]);
|
||||||
|
cht[3]:=concat(cht[1],cht[2]);
|
||||||
|
str(x,cht[4]);
|
||||||
|
str(y,cht[5]);
|
||||||
|
cht[6]:=concat(cht[4],cht[5]);
|
||||||
|
b:=b or (cht[3]=cht[6]);
|
||||||
|
end;
|
||||||
|
if b=false then
|
||||||
|
begin
|
||||||
|
M[((y-2) div 2)+1,((x-4) div 6)+1]:=key;
|
||||||
|
gotoxy(x,y);
|
||||||
|
write(' ');
|
||||||
|
gotoxy(x,y);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
'1' .. '9' : begin
|
||||||
|
gotoxy(2,22);
|
||||||
|
write(' ');
|
||||||
|
b:=false;
|
||||||
|
for k:=1 to 81 do
|
||||||
|
begin
|
||||||
|
str(xy[1,k],cht[1]);
|
||||||
|
str(xy[2,k],cht[2]);
|
||||||
|
cht[3]:=concat(cht[1],cht[2]);
|
||||||
|
str(x,cht[4]);
|
||||||
|
str(y,cht[5]);
|
||||||
|
cht[6]:=concat(cht[4],cht[5]);
|
||||||
|
b:=b or (cht[3]=cht[6]);
|
||||||
|
end;
|
||||||
|
if ((x-4) div 6)+1 in [1..3] then
|
||||||
|
begin
|
||||||
|
limk1:=1;
|
||||||
|
limk2:=3;
|
||||||
|
end
|
||||||
|
else if ((x-4) div 6)+1 in [4..6] then
|
||||||
|
begin
|
||||||
|
limk1:=4;
|
||||||
|
limk2:=6;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
limk1:=7;
|
||||||
|
limk2:=9
|
||||||
|
end;
|
||||||
|
if ((y-2) div 2)+1 in [1..3] then
|
||||||
|
begin
|
||||||
|
limi1:=1;
|
||||||
|
limi2:=3;
|
||||||
|
end
|
||||||
|
else if ((y-2) div 2)+1 in [4..6] then
|
||||||
|
begin
|
||||||
|
limi1:=4;
|
||||||
|
limi2:=6;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
limi1:=7;
|
||||||
|
limi2:=9
|
||||||
|
end;
|
||||||
|
t:=true;
|
||||||
|
for j:=1 to 9 do
|
||||||
|
t:=t and (key <> M[j,((x-4) div 6)+1]);
|
||||||
|
for l:=1 to 9 do
|
||||||
|
t:=t and (key <> M[((y-2) div 2)+1,l]);
|
||||||
|
for s:=limk1 to limk2 do
|
||||||
|
for o:=limi1 to limi2 do
|
||||||
|
t:=t and (key <> M[o,s]);
|
||||||
|
|
||||||
|
|
||||||
|
if (b=false) and (t=true) then
|
||||||
|
begin
|
||||||
|
M[((y-2) div 2)+1,((x-4) div 6)+1]:=key;
|
||||||
|
gotoxy(x,y);
|
||||||
|
write(key);
|
||||||
|
gotoxy(x,y);
|
||||||
|
end;
|
||||||
|
if (b=false) and (t=false) then
|
||||||
|
if key=M[((y-2) div 2)+1,((x-4) div 6)+1] then
|
||||||
|
begin
|
||||||
|
gotoxy(x,y);
|
||||||
|
gotoxy(2,22);
|
||||||
|
write('#You already entered this number!#');
|
||||||
|
gotoxy(x,y);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
gotoxy(x,y);
|
||||||
|
gotoxy(2,22);
|
||||||
|
write('#The number you entered is not correct, try again#');
|
||||||
|
gotoxy(x,y);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
for i:=1 to 6 do
|
||||||
|
delete(cht[i],1,length(cht[i]));
|
||||||
|
|
||||||
|
case y of
|
||||||
|
0 : y:=2;
|
||||||
|
20 : y:=18;
|
||||||
|
end;
|
||||||
|
case x of
|
||||||
|
-2 : x:=4;
|
||||||
|
58 : x:=52;
|
||||||
|
end;
|
||||||
|
|
||||||
|
gotoxy(x,y);
|
||||||
|
|
||||||
|
v:=true;
|
||||||
|
for k:=1 to 9 do
|
||||||
|
for i:=1 to 9 do
|
||||||
|
v:=v and (M[i,k] <> ' ');
|
||||||
|
|
||||||
|
if v=false then
|
||||||
|
goto saisir
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
clrscr;
|
||||||
|
gotoxy(17,11);
|
||||||
|
write('Excellent! You have solved the puzzle!');
|
||||||
|
gotoxy(17,13);
|
||||||
|
write('Would you like to play again? (Y/N)... < >');
|
||||||
|
repeat
|
||||||
|
gotoxy(57,13);
|
||||||
|
yn:=readkey;
|
||||||
|
until (upcase(yn)='Y') or (upcase(yn)='N');
|
||||||
|
write(yn);
|
||||||
|
if upcase(yn)='Y' then
|
||||||
|
goto game
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
gotoxy(15,22);
|
||||||
|
write('You chose to quit the game, please press ENTER...');
|
||||||
|
repeat
|
||||||
|
gotoxy(64,22);
|
||||||
|
yn:=readkey;
|
||||||
|
until yn=chr(13);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
TheEnd:
|
||||||
|
clrscr;
|
||||||
|
gotoxy(20,16);
|
||||||
|
write('The game is over, please press ENTER... ');
|
||||||
|
repeat
|
||||||
|
gotoxy(59,16);
|
||||||
|
yn:=readkey;
|
||||||
|
until yn=chr(13);
|
||||||
|
|
||||||
|
end.
|
||||||
Reference in New Issue
Block a user