RosettaCodeData/Task/2048/Maple/2048.maple

220 lines
7.6 KiB
Plaintext

macro(SP=DocumentTools:-SetProperty, GP=DocumentTools:-GetProperty);
G := module()
export reset,f,getname;
local a:=Matrix(4):
local buttonpress:="False";
local score:=0;
local highscoreM,highscore,hscore,hname,M,j,k,z,e,move,r,c,q,w,checklose,loss,matrixtotextarea;
getname:=proc();
hname:=GP("Name",value);
buttonpress:="True";
if score>hscore then
M:=Matrix(1, 2, [[score, hname]]):
ExportMatrix("this:///Score.csv",M);
reset();
else
reset();
end if;
end proc;
matrixtotextarea:=proc(m)
local m2,colors;
colors:=["White","Beige","LightGrey",ColorTools:-Color("RGB", [255/255, 127/255, 80/255]),ColorTools:-Color("RGB", [255/255, 99/255, 71/255]),ColorTools:-Color("RGB", [255/255, 69/255, 0/255]),ColorTools:-Color("RGB", [255/255, 0/255, 0/255]),ColorTools:-Color("RGB", [255/255, 215/255, 0/255]), ColorTools:-Color("RGB", [255/255, 255/255, 0/255]),ColorTools:-Color("RGB", [204/255, 204/255, 0/255]),ColorTools:-Color("RGB", [153/255, 153/255, 0/255]),ColorTools:-Color("RGB", [102/255, 102/255, 0/255]), ColorTools:-Color("RGB", [0/255, 0/255, 0/255])];
m2 := ArrayTools:-Reshape(m^%T, [16,1]):
SP(seq([cat("TextArea",i),value,m2[i+1,1]],i=0..15));
SP(seq(["Table1",fillcolor[(`if`(i+1<5,1,`if`(i+1<9 and i+1>4,2,`if`(i+1<13 and i+1>8,3, `if`(i+1<17 and i+1>12,4,1))))),(i mod 4)+1],`if`(m2[i+1,1]=0,colors[1],`if`(m2[i+1,1]=2,colors[2],`if`(m2[i+1,1]=4,colors[3],`if`(m2[i+1,1]=8,colors[4],`if`(m2[i+1,1]=16,colors[5],`if`(m2[i+1,1]=32,colors[6],`if`(m2[i+1,1]=64,colors[7],`if`(m2[i+1,1]=128,colors[8],`if`(m2[i+1,1]=256,colors[9],`if`(m2[i+1,1]=512,colors[10],`if`(m2[i+1,1]=1024,colors[11],`if`(m2[i+1,1]=2048,colors[12],`if`(m2[i+1,1]>2048,colors[13],"White")))))))))))))],i=0..15));
SP(seq([cat("TextArea",i),fillcolor,`if`(m2[i+1,1]=0,colors[1],`if`(m2[i+1,1]=2,colors[2],`if`(m2[i+1,1]=4,colors[3],`if`(m2[i+1,1]=8,colors[4],`if`(m2[i+1,1]=16,colors[5],`if`(m2[i+1,1]=32,colors[6],`if`(m2[i+1,1]=64,colors[7],`if`(m2[i+1,1]=128,colors[8],`if`(m2[i+1,1]=256,colors[9],`if`(m2[i+1,1]=512,colors[10],`if`(m2[i+1,1]=1024,colors[11],`if`(m2[i+1,1]=2048,colors[12],`if`(m2[i+1,1]>2048,colors[13],"White")))))))))))))],i=0..15),refresh);
SP(seq([cat("TextArea",i),fontcolor,`if`(m2[i+1,1]=0,colors[1],`if`(m2[i+1,1]=2,colors[13],`if`(m2[i+1,1]=4,colors[13],"White")))],i=0..15),refresh);
end proc:
reset:=proc();
highscoreM := Import("this:///Score.csv", output = Matrix);
hscore := highscoreM[1,1];
hname := highscoreM[1,2];
highscore:=sprintf("%s",cat(hscore,"\n",hname));
buttonpress:="False";
a:=Matrix(4, 4, [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]):
score:=0;
matrixtotextarea(a);
SP("Score/Lose",visible,true);
SP("Score/Lose",enabled,true);
SP("Score/Lose",caption,"Click an Arrow to begin.");
SP("Score",value,score);
SP("Highscore",value,highscore);
SP(seq([j, enabled, false], j in ["Name","Enter"]));
SP(seq([j, visible, false], j in ["Name","Enter"]));
SP(seq([j, enabled, true], j in ["Score","Highscore", seq(cat("Button",k),k=0..4)]));
SP(seq([j, visible, true], j in ["Score","Highscore", seq(cat("Button",k),k=0..4)]));
end proc;
checklose:=proc();
for q from 2 to 4 do
for w from 4 to 1 by -1 do
if a[q,w]=a[q-1,w] then
loss:="False";
return loss;
end if;
end do;
end do;
return loss;
end proc;
f:=proc(keypress);
SP("Score/Lose",visible,false);
SP("Score/Lose",enabled,false);
j := rand(1 .. 4);
k := rand(1 .. 4);
z := rand(1 .. 10);
e := 0;
move:=proc();
for q from 4 to 2 by -1 do
for w from 4 to 1 by -1 do
if a[q,w]=a[q-1,w] then
a[q-1,w]:=a[q-1,w]+a[q,w];
score:=score+a[q-1,w];
a[q,w]:=0;
if q-1>1 and a[q-2,w]=0 then
a[q-2,w]:=a[q-1,w];
a[q-1,w]:=0;
if q-2>1 and a[q-3,w]=0 then
a[q-3,w]:=a[q-2,w];
a[q-2,w]:=0;
end if;
end if;
elif q-1>1 and a[q,w]=a[q-2,w] and a[q-1,w]=0 then
a[q-2,w]:=a[q-2,w]+a[q,w];
score:=score+a[q-2,w];
a[q,w]:=0;
if q-2>1 and a[q-3,w]=0 then
a[q-3,w]:=a[q-2,w];
a[q-2,w]:=0;
end if;
elif q-2>1 and a[q,w]=a[q-3,w] and a[q-1,w]=0 and a[q-2,w]=0 then
a[q-3,w]:=a[q-3,w]+a[q,w];
score:=score+a[q-3,w];
a[q,w]:=0;
elif a[q-1,w]=0 then
a[q-1,w]:=a[q-1,w]+a[q,w];
a[q,w]:=0;
if q-1>1 and a[q-2,w]=0 then
a[q-2,w]:=a[q-1,w];
a[q-1,w]:=0;
if q-2>1 and a[q-3,w]=0 then
a[q-3,w]:=a[q-2,w];
a[q-2,w]:=0;
end if;
end if;
elif q-1>1 and a[q-2,w]=0 and a[q-1,w]=0 then
a[q-2,w]:=a[q-2,w]+a[q,w];
a[q,w]:=0;
if q-2>1 and a[q-3,w]=0 then
a[q-3,w]:=a[q-2,w];
a[q-2,w]:=0;
end if;
elif q-2>1 and a[q-3,w]=0 and a[q-1,w]=0 and a[q-2,w]=0 then
a[q-3,w]:=a[q-3,w]+a[q,w];
a[q,w]:=0;
end if;
end do;
end do;
end proc;
r := j();
c := k();
if keypress="Up" then
move();
elif keypress="Left" then
a:=LinearAlgebra:-Transpose(a);
move();
a:=LinearAlgebra:-Transpose(a);
elif keypress="Right" then
a := ArrayTools:-FlipDimension(LinearAlgebra:-Transpose(a),1);
move();
a := LinearAlgebra:-Transpose(ArrayTools:-FlipDimension(a,1));
elif keypress="Down" then
a := ArrayTools:-FlipDimension(a, 1);
move();
a := ArrayTools:-FlipDimension(a, 1);
end if;
if a[r, c] = 0 then
if z() > 3 then
a[r, c] := 2;
else;
a[r, c] := 4;
end if;
else
for q to 4 do
for w to 4 do
if a[q, w] <> 0 then;
e:=e+1;
end if;
end do;
end do;
if e = 16 then
loss:="True";
checklose();
a:=LinearAlgebra:-Transpose(a);
checklose();
a:=LinearAlgebra:-Transpose(a);
a := ArrayTools:-FlipDimension(LinearAlgebra:-Transpose(a),1);
checklose();
a := LinearAlgebra:-Transpose(ArrayTools:-FlipDimension(a,1));
a := ArrayTools:-FlipDimension(a, 1);
checklose();
a := ArrayTools:-FlipDimension(a, 1);
if loss="True" then
SP("Score/Lose",visible,"True");
SP("Score/Lose",enabled,"True");
SP("Score/Lose",caption,"You Lose!");
if score>hscore then
SP("Score/Lose",caption,"Highscore! Enter your name below!");
SP("Enter",caption,"Confirm");
SP(seq([j, enabled, true], j in ["Name","Enter","Score/Lose"]));
SP(seq([j, visible, true], j in ["Name","Enter","Score/Lose"]));
SP(seq([j, enabled, false], j in [seq(cat("Button",k),k=0..4)]));
SP(seq([j, visible, false], j in [seq(cat("Button",k),k=0..4)]));
if buttonpress="True" then
M:=Matrix(1, 2, [[score, hname]]):
ExportMatrix("this:///Score.csv",M);
buttonpress:="False";
reset();
end if;
else
SP("Score/Lose",caption,"Sorry, please try again.");
SP("Enter",caption,"Restart");
SP("Enter",visible,"True");
SP("Enter",enabled,"True");
SP(seq([j, enabled, false], j in [seq(cat("Button",k),k=0..4)]));
SP(seq([j, visible, false], j in [seq(cat("Button",k),k=0..4)]));
if buttonpress="True" then
buttonpress:="False";
reset();
end if;
end if;
end if;
else
e:=0;
while a[r, c] <> 0 do
r := j();
c := k();
end do;
if z() > 1 then
a[r, c] := 2;
else
a[r, c] := 4;
end if;
end if;
end if;
matrixtotextarea(a);
SP("Score",value,score,refresh);
return a;
end proc;
end module;
G:-reset();SP("Score/Lose",caption,"Click an Arrow to begin.");