Morpion solitaire/Unicon: Difference between revisions

m
reorg code
m (→‎Interface, Parameters, Globals: mark deprecated legacy)
m (reorg code)
Line 23:
For more see: Morpion -h|-help
 
== CoreBasic Morpion RoutinesSolution ==
== Main and Core Game Play Procedures ==
<lang Unicon>link printf,strings,options
 
Line 199 ⟶ 200:
/MG.rseed := &random # seed for this game
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
 
procedure ScorefailWriteMoveLogHeader(MG);end #: dummy always failswrite common header </lang>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
Line 338 ⟶ 391:
end</lang>
 
=== Multigame Simulation and Monitoring Support ===
<lang Unicon>
procedure MultiMorphion(N,MG) #: Simulate N games using MG
Line 416 ⟶ 469:
end </lang>
 
=== Game Replayer ===
<lang Unicon>procedure ReplayMorpion() #: Handle recorded games
Replayer(M := ReadMoveLog(M_ReplayFile)) # read game and save data
Line 470 ⟶ 523:
end</lang>
 
=== Game Reader ===
<lang Unicon>procedure ReadMoveLog(MG) #: read move log wrapper
fprintf(M_Output,"Reading recorded game from: %s\n",M_ReplayFile)
Line 523 ⟶ 576:
end</lang>
 
=== GameDetailed 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
fprintf(M_Output,"Detailed Move Log\n")
Line 599:
end</lang>
 
=== Strategy Support ===
<lang Unicon># No useful examples at this time</lang>
 
procedure Scorefail(MG);end #: dummy always fails</lang>
 
{{libheader|Icon Programming Library}}
Anonymous user