This commit is contained in:
Михаил Капелько
2024-05-22 22:49:22 +03:00
parent 0f1843af1c
commit d46fb6bb76
7 changed files with 225 additions and 33 deletions

View File

@@ -44,7 +44,7 @@ class Controller:
def set(self, fieldName, value):
c = copy.deepcopy(self.context)
setattr(c, fieldName, value)
c.setField(fieldName, value)
c.recentField = fieldName
self.queue.append(c)
self.processQueue()

View File

@@ -5,6 +5,7 @@ from llm import *
#
# Conditions:
# 1. `e`, `exit`, `q`, or `quit` was entered
# 2. Victory has just been reported
@llm_by_value
def cli_exit(
c: memory_Context
@@ -22,6 +23,33 @@ def cli_exit(
c.recentField = "exit"
return c
#}
if (
c.recentField == "outputVictory"
):
c.exit = True
c.recentField = "exit"
return c
#}
c.recentField = "none"
return c
#}
# Ask user to go on
#
# Conditions:
# 1. Items have just matched and there are still items left to select
@llm_by_value
def cli_goOn(
c: memory_Context
) -> memory_Context:
if (
c.recentField == "outputMatchedItems" and
len(c.hiddenItems) != len(c.playfieldItems)
):
c.outputGoOn = "Go on:"
c.recentField = "outputGoOn"
return c
#}
c.recentField = "none"
return c
#}
@@ -47,6 +75,9 @@ def cli_greetUser(
#}
# Ask user to select second item to have a pair of selected items
#
# Conditions:
# 1. Single item has just been selected
@llm_by_value
def cli_promptSecondItemSelection(
c: memory_Context
@@ -64,6 +95,9 @@ def cli_promptSecondItemSelection(
#}
# Report matched items
#
# Conditions:
# 1. Items were hidden (i.e., they matched)
@llm_by_value
def cli_reportMatchedItems(
c: memory_Context
@@ -71,7 +105,7 @@ def cli_reportMatchedItems(
if (
c.recentField == "hiddenItems"
):
c.outputMatchedItems = "Items matched! Go on:"
c.outputMatchedItems = "Items matched!"
c.recentField = "outputMatchedItems"
return c
#}
@@ -79,6 +113,21 @@ def cli_reportMatchedItems(
return c
#}
# Report victory
@llm_by_value
def cli_reportVictory(
c: memory_Context
) -> memory_Context:
if (
c.recentField == "victory"
):
c.outputVictory = "VICTORY! The game is over now"
c.recentField = "outputVictory"
return c
#}
c.recentField = "none"
return c
#}
# Select item
#
@@ -133,23 +182,22 @@ def cli_showHelp(
return c
#}
## Report mismatched items
#@llm_by_value
#def cli_shouldReportMismatchedItems(
# c: cli_Context
#) -> cli_Context:
# if (
# c.recentField == "cMemory" and
# c.cMemory.recentField == "mismatchedItems"
# ):
# c.outputMatchedItems = "Wrong! Try again:"
# c.recentField = "outputMismatchedItems"
# return c
# #}
# c.recentField = "none"
# return c
##}
#
# Report mismatched items
@llm_by_value
def cli_reportMismatchedItems(
c: memory_Context
) -> memory_Context:
if (
c.recentField == "mismatchedItems"
):
c.outputMismatchedItems = "Wrong! Try again:"
c.recentField = "outputMismatchedItems"
return c
#}
c.recentField = "none"
return c
#}
## Report selection of invalid item ids
##
## Conditions:

View File

@@ -30,6 +30,46 @@ def cli_test_exit_exit(
return "ERR: cli_exit_e"
#}
def cli_test_exit_victory(
) -> str:
c = memory_createContext()
c.playfieldSize = 2
c.recentField = "playfieldSize"
c = memory_generateConstPlayfield(c)
# Match the first pair of tiles.
c.input = "1"
c.recentField = "input"
c = cli_selectItem(c)
c = memory_selectItem(c)
c.input = "2"
c.recentField = "input"
c = cli_selectItem(c)
c = memory_selectItem(c)
c = memory_hideMatchingItems(c)
# Match the second pair of tiles.
c.input = "3"
c.recentField = "input"
c = cli_selectItem(c)
c = memory_selectItem(c)
c.input = "4"
c.recentField = "input"
c = cli_selectItem(c)
c = memory_selectItem(c)
c = memory_hideMatchingItems(c)
c = memory_detectVictory(c)
c = cli_reportVictory(c)
c = cli_exit(c)
if (
c.recentField == "exit"
):
return "OK: cli_exit_victory"
#}
return "ERR: cli_exit_victory"
#}
def cli_test_exit_q(
) -> str:
c = memory_createContext()
@@ -58,6 +98,34 @@ def cli_test_exit_quit(
return "ERR: cli_exit_quit"
#}
def cli_test_goOn(
) -> str:
c = memory_createContext()
c.playfieldSize = 2
c.recentField = "playfieldSize"
c = memory_generateConstPlayfield(c)
# Match the first pair of items.
c.input = "1"
c.recentField = "input"
c = cli_selectItem(c)
c = memory_selectItem(c)
c.input = "2"
c.recentField = "input"
c = cli_selectItem(c)
c = memory_selectItem(c)
c = memory_hideMatchingItems(c)
c = cli_reportMatchedItems(c)
c = cli_goOn(c)
if (
c.recentField == "outputGoOn"
):
return "OK: cli_goOn"
#}
return "ERR: cli_goOn"
#}
def cli_test_greetUser(
) -> str:
c = memory_createContext()
@@ -112,6 +180,30 @@ def cli_test_reportMatchedItems(
return "ERR: cli_reportMatchedItems"
#}
def cli_test_reportMismatchedItems(
) -> str:
c = memory_createContext()
c.playfieldSize = 2
c.recentField = "playfieldSize"
c = memory_generateConstPlayfield(c)
c.input = "1"
c.recentField = "input"
c = cli_selectItem(c)
c = memory_selectItem(c)
c.input = "3"
c.recentField = "input"
c = cli_selectItem(c)
c = memory_selectItem(c)
c = memory_detectMismatchedItems(c)
c = cli_reportMismatchedItems(c)
if (
c.recentField == "outputMismatchedItems"
):
return "OK: cli_reportMismatchedItems"
#}
return "ERR: cli_reportMismatchedItems"
#}
def cli_test_selectItem(
) -> str:
c = memory_createContext()
@@ -155,6 +247,44 @@ def cli_test_showHelp_help(
return "ERR: cli_showHelp_help"
#}
def cli_test_reportVictory(
) -> str:
c = memory_createContext()
c.playfieldSize = 2
c.recentField = "playfieldSize"
c = memory_generateConstPlayfield(c)
# Match the first pair of tiles.
c.input = "1"
c.recentField = "input"
c = cli_selectItem(c)
c = memory_selectItem(c)
c.input = "2"
c.recentField = "input"
c = cli_selectItem(c)
c = memory_selectItem(c)
c = memory_hideMatchingItems(c)
# Match the second pair of tiles.
c.input = "3"
c.recentField = "input"
c = cli_selectItem(c)
c = memory_selectItem(c)
c.input = "4"
c.recentField = "input"
c = cli_selectItem(c)
c = memory_selectItem(c)
c = memory_hideMatchingItems(c)
c = memory_detectVictory(c)
c = cli_reportVictory(c)
if (
c.recentField == "outputVictory"
):
return "OK: cli_reportVictory"
#}
return "ERR: cli_reportVictory"
#}
#def cli_test_shouldReportIvalidItemSelection_outOfBoundsMin(
#) -> str:

View File

@@ -4,8 +4,8 @@ from memory_test import *
from Controller import *
import sys
print(memory_test_deselectMismatchedItems())
print(memory_test_deselectMismatchedItems_itemTwice())
print(memory_test_detectMismatchedItems())
print(memory_test_detectMismatchedItems_itemTwice())
print(memory_test_detectVictory())
print(memory_test_generateConstPlayfield())
print(memory_test_hideMatchingItems())
@@ -15,24 +15,31 @@ print(memory_test_selectItem_3x())
print(cli_test_exit_e())
print(cli_test_exit_exit())
print(cli_test_exit_victory())
print(cli_test_exit_q())
print(cli_test_exit_quit())
print(cli_test_goOn())
print(cli_test_greetUser())
print(cli_test_showHelp_h())
print(cli_test_showHelp_help())
print(cli_test_selectItem())
print(cli_test_promptSecondItemSelection())
print(cli_test_reportMatchedItems())
print(cli_test_reportMismatchedItems())
print(cli_test_reportVictory())
ctrl = Controller(memory_createContext())
ctrl.registerFunction(cli_exit)
ctrl.registerFunction(cli_goOn)
ctrl.registerFunction(cli_greetUser)
ctrl.registerFunction(cli_promptSecondItemSelection)
ctrl.registerFunction(cli_reportMatchedItems)
ctrl.registerFunction(cli_reportMismatchedItems)
ctrl.registerFunction(cli_reportVictory)
ctrl.registerFunction(cli_selectItem)
ctrl.registerFunction(cli_showHelp)
ctrl.registerFunction(memory_deselectMismatchedItems)
ctrl.registerFunction(memory_detectMismatchedItems)
ctrl.registerFunction(memory_detectVictory)
ctrl.registerFunction(memory_generateConstPlayfield)
ctrl.registerFunction(memory_hideMatchingItems)
@@ -40,7 +47,7 @@ ctrl.registerFunction(memory_selectItem)
def printOutput(c):
if c.recentField.startswith("output"):
print(getattr(c, c.recentField))
print(c.field(c.recentField))
ctrl.registerCallback(printOutput)
#ctrl.registerCallback(lambda c: print(f"ИГР App.dbg ctx: '{c}'"))
ctrl.registerFieldCallback("exit", lambda c: sys.exit(0))

View File

@@ -1,14 +1,14 @@
from memory_Context import *
from llm import *
# Deselect mismatched items
# Detect mismatched items
#
# Conditions:
# 0. Two items has just been selected
# 1. The same item has been selected twice
# 2. Selected items are of different groups
@llm_by_value
def memory_deselectMismatchedItems(
def memory_detectMismatchedItems(
c: memory_Context
) -> memory_Context:
if not (

View File

@@ -4,11 +4,13 @@ class memory_Context:
self.hiddenItems = []
self.input = ""
self.mismatchedItems = []
self.outputGoOn = ""
self.outputGreeting = ""
self.outputHelp = ""
self.outputMatchedItems = ""
self.outputMismatchedItems = ""
self.outputPromptSelection = ""
self.outputVictory = ""
self.playfieldItems = {}
self.playfieldSize = 0
self.recentField = "none"
@@ -16,6 +18,11 @@ class memory_Context:
self.selectedItems = []
self.victory = False
def field(self, fieldName):
return getattr(self, fieldName)
def setField(self, fieldName, value):
setattr(self, fieldName, value)
def __repr__(self):
return self.__str__()

View File

@@ -1,7 +1,7 @@
from memory import *
from memory_Context import *
def memory_test_deselectMismatchedItems(
def memory_test_detectMismatchedItems(
) -> str:
c = memory_createContext()
c.playfieldSize = 2
@@ -17,7 +17,7 @@ def memory_test_deselectMismatchedItems(
c = memory_selectItem(c)
# Detect mismatching.
c = memory_deselectMismatchedItems(c)
c = memory_detectMismatchedItems(c)
# See if the two selected items do not match.
if (
@@ -26,12 +26,12 @@ def memory_test_deselectMismatchedItems(
c.mismatchedItems[0] == 0 and
c.mismatchedItems[1] == 2
):
return "OK: memory_deselectMismatchedItems"
return "OK: memory_detectMismatchedItems"
#}
return "ERR: memory_deselectMismatchedItems"
return "ERR: memory_detectMismatchedItems"
#}
def memory_test_deselectMismatchedItems_itemTwice(
def memory_test_detectMismatchedItems_itemTwice(
) -> str:
c = memory_createContext()
c.playfieldSize = 2
@@ -47,7 +47,7 @@ def memory_test_deselectMismatchedItems_itemTwice(
c = memory_selectItem(c)
# Detect mismatching.
c = memory_deselectMismatchedItems(c)
c = memory_detectMismatchedItems(c)
# See if the two selected items do not match.
if (
@@ -55,9 +55,9 @@ def memory_test_deselectMismatchedItems_itemTwice(
len(c.mismatchedItems) == 1 and
c.mismatchedItems[0] == 0
):
return "OK: memory_deselectMismatchedItems_itemTwice"
return "OK: memory_detectMismatchedItems_itemTwice"
#}
return "ERR: memory_deselectMismatchedItems_itemTwice"
return "ERR: memory_detectMismatchedItems_itemTwice"
#}
def memory_test_detectVictory(