Morpion solitaire/Unicon: Difference between revisions
Content added Content deleted
m (→Interface, Parameters, Globals: mark deprecated legacy) |
m (reorg code) |
||
Line 23: | Line 23: | ||
For more see: Morpion -h|-help |
For more see: Morpion -h|-help |
||
== |
== Basic Solution == |
||
== Main and Core Game Play Procedures == |
|||
<lang Unicon>link printf,strings,options |
<lang Unicon>link printf,strings,options |
||
Line 199: | Line 200: | ||
/MG.rseed := &random # seed for this game |
/MG.rseed := &random # seed for this game |
||
if MG.move := ?ScanGrid(MG).pool then return MG |
if MG.move := ?ScanGrid(MG).pool then return MG |
||
end</lang> |
|||
== Game Logging == |
|||
<lang Unicon>procedure WriteMoveLog(MG) #: write move log wrapper |
|||
if \M_GameSave then { |
|||
savegame := sprintf("Games/%s/%i-L%i",M_GameType,*MG.history,M_Limit) |
|||
if M_Limit ~= 1 then |
|||
savegame ||:= sprintf("(%i)",MG.count) |
|||
if \M_ReplayFile then { |
|||
fn := map(M_ReplayFile,"/\\","__") |
|||
fn ? (="Games/", savegame ||:= "-RF" || tab(find(".txt"))) |
|||
savegame ||:= "-RN" || (0 < \M_ReplayAfter) |
|||
} |
|||
savegame ||:= sprintf("_%s-%s-F%s.txt",deletec(&date,'/'),deletec(&clock,':'),M_GameFmt) |
|||
M_GameSave := savegame |
|||
fprintf(M_Output,WriteMoveLogHeader(MG)) # write header, game is saved |
|||
f := open(savegame,"w") | stop("Unable to open ",savegame," for writing") |
|||
fprintf(f,M_WriteGame(MG),M_Config) # call desired writer for output/save |
|||
close(f) |
|||
} |
|||
else |
|||
fprintf(M_Output,M_WriteGame(MG)) |
|||
end |
end |
||
procedure |
procedure WriteMoveLogHeader(MG) #: write common header comments |
||
return sprintf("#\n# Game Record for Morphion %s game of %i moves\n_ |
|||
# Date: %s\n# Saved: %s\n# &random: %i\n_ |
|||
# ReplayFile: %s (%s moves)\n#\n", |
|||
M_GameType,MG.score,&date,\M_GameSave|"* none *",MG.rseed, |
|||
\M_ReplayFile|"* none *",\M_ReplayAfter|"* all *") |
|||
end |
|||
procedure WriteMoveLogPS(MG) #: write pentasol style move log |
|||
l := WriteMoveLogHeader(MG) |
|||
l ||:= sprintf("# Pentasol compatible format\n#\n#\n_ |
|||
# Morpion Solitaire game\n#\n_ |
|||
# XXXX\n# X X\n# X X\n_ |
|||
# XXXR XXXX\n# X X\n# X X\n_ |
|||
# XXXX XXXX\n# X X\n# X X\n# XXXX\n#\n_ |
|||
# R = reference point\n_ |
|||
# List of moves starts with reference point (col,row)\n_ |
|||
# Lines are\n# (col,row) <direction> <+/-centerdist>\n_ |
|||
# distance to center is left side or top edge\n#\n") |
|||
l ||:= sprintf("(%i,%i)\n",4+MG.coff,4+MG.roff) |
|||
every l ||:= FormatMoveLogPS(MG,!MG.history) |
|||
return l || "#" |
|||
end |
|||
procedure FormatMoveLogPS(MG,m) #: format a PS move |
|||
d := if m.direction == "/" then m.move-3 else 3-m.move |
|||
return sprintf("(%i,%i) %s %s%d\n", |
|||
m.line[m.move,2]-m.coff+MG.coff,m.line[m.move,1]-m.roff+MG.roff, |
|||
m.direction,(d < 0,"-")|(d = 0,"")|"+",abs(d)) |
|||
end</lang> |
|||
== Extended Framework == |
|||
== Interface, Parameters, Globals == |
|||
=== Interface, Parameters, Globals === |
|||
<lang Unicon>global M_Strategy,M_Eval,M_Mvalid # Pluggable procedures |
<lang Unicon>global M_Strategy,M_Eval,M_Mvalid # Pluggable procedures |
||
Line 338: | Line 391: | ||
end</lang> |
end</lang> |
||
== Multigame Simulation and Monitoring Support == |
=== Multigame Simulation and Monitoring Support === |
||
<lang Unicon> |
<lang Unicon> |
||
procedure MultiMorphion(N,MG) #: Simulate N games using MG |
procedure MultiMorphion(N,MG) #: Simulate N games using MG |
||
Line 416: | Line 469: | ||
end </lang> |
end </lang> |
||
== Game Replayer == |
=== Game Replayer === |
||
<lang Unicon>procedure ReplayMorpion() #: Handle recorded games |
<lang Unicon>procedure ReplayMorpion() #: Handle recorded games |
||
Replayer(M := ReadMoveLog(M_ReplayFile)) # read game and save data |
Replayer(M := ReadMoveLog(M_ReplayFile)) # read game and save data |
||
Line 470: | Line 523: | ||
end</lang> |
end</lang> |
||
== Game Reader == |
=== Game Reader === |
||
<lang Unicon>procedure ReadMoveLog(MG) #: read move log wrapper |
<lang Unicon>procedure ReadMoveLog(MG) #: read move log wrapper |
||
fprintf(M_Output,"Reading recorded game from: %s\n",M_ReplayFile) |
fprintf(M_Output,"Reading recorded game from: %s\n",M_ReplayFile) |
||
Line 523: | Line 576: | ||
end</lang> |
end</lang> |
||
== |
=== Detailed Move Logging (for analysis) === |
||
<lang Unicon>procedure WriteMoveLog(MG) #: write move log wrapper |
|||
if \M_GameSave then { |
|||
savegame := sprintf("Games/%s/%i-L%i",M_GameType,*MG.history,M_Limit) |
|||
if M_Limit ~= 1 then |
|||
savegame ||:= sprintf("(%i)",MG.count) |
|||
if \M_ReplayFile then { |
|||
fn := map(M_ReplayFile,"/\\","__") |
|||
fn ? (="Games/", savegame ||:= "-RF" || tab(find(".txt"))) |
|||
savegame ||:= "-RN" || (0 < \M_ReplayAfter) |
|||
} |
|||
savegame ||:= sprintf("_%s-%s-F%s.txt",deletec(&date,'/'),deletec(&clock,':'),M_GameFmt) |
|||
M_GameSave := savegame |
|||
fprintf(M_Output,WriteMoveLogHeader(MG)) # write header, game is saved |
|||
f := open(savegame,"w") | stop("Unable to open ",savegame," for writing") |
|||
fprintf(f,M_WriteGame(MG),M_Config) # call desired writer for output/save |
|||
close(f) |
|||
} |
|||
else |
|||
fprintf(M_Output,M_WriteGame(MG)) |
|||
end |
|||
procedure WriteMoveLogHeader(MG) #: write common header comments |
|||
return sprintf("#\n# Game Record for Morphion %s game of %i moves\n_ |
|||
# Date: %s\n# Saved: %s\n# &random: %i\n_ |
|||
# ReplayFile: %s (%s moves)\n#\n", |
|||
M_GameType,MG.score,&date,\M_GameSave|"* none *",MG.rseed, |
|||
\M_ReplayFile|"* none *",\M_ReplayAfter|"* all *") |
|||
end |
|||
procedure WriteMoveLogPS(MG) #: write pentasol style move log |
|||
l := WriteMoveLogHeader(MG) |
|||
l ||:= sprintf("# Pentasol compatible format\n#\n#\n_ |
|||
# Morpion Solitaire game\n#\n_ |
|||
# XXXX\n# X X\n# X X\n_ |
|||
# XXXR XXXX\n# X X\n# X X\n_ |
|||
# XXXX XXXX\n# X X\n# X X\n# XXXX\n#\n_ |
|||
# R = reference point\n_ |
|||
# List of moves starts with reference point (col,row)\n_ |
|||
# Lines are\n# (col,row) <direction> <+/-centerdist>\n_ |
|||
# distance to center is left side or top edge\n#\n") |
|||
l ||:= sprintf("(%i,%i)\n",4+MG.coff,4+MG.roff) |
|||
every l ||:= FormatMoveLogPS(MG,!MG.history) |
|||
return l || "#" |
|||
end |
|||
procedure FormatMoveLogPS(MG,m) #: format a PS move |
|||
d := if m.direction == "/" then m.move-3 else 3-m.move |
|||
return sprintf("(%i,%i) %s %s%d\n", |
|||
m.line[m.move,2]-m.coff+MG.coff,m.line[m.move,1]-m.roff+MG.roff, |
|||
m.direction,(d < 0,"-")|(d = 0,"")|"+",abs(d)) |
|||
end</lang> |
|||
== Detailed Move Logging (for analysis) == |
|||
<lang Unicon>procedure PrintDetails(MG) #: print the log |
<lang Unicon>procedure PrintDetails(MG) #: print the log |
||
fprintf(M_Output,"Detailed Move Log\n") |
fprintf(M_Output,"Detailed Move Log\n") |
||
Line 599: | Line 599: | ||
end</lang> |
end</lang> |
||
== Strategy Support == |
=== Strategy Support === |
||
<lang Unicon># No useful examples at this time |
<lang Unicon># No useful examples at this time |
||
procedure Scorefail(MG);end #: dummy always fails</lang> |
|||
{{libheader|Icon Programming Library}} |
{{libheader|Icon Programming Library}} |