@@ -44,7 +44,7 @@ class Controller: | |||||
def set(self, fieldName, value): | def set(self, fieldName, value): | ||||
c = copy.deepcopy(self.context) | c = copy.deepcopy(self.context) | ||||
setattr(c, fieldName, value) | |||||
c.setField(fieldName, value) | |||||
c.recentField = fieldName | c.recentField = fieldName | ||||
self.queue.append(c) | self.queue.append(c) | ||||
self.processQueue() | self.processQueue() |
@@ -5,6 +5,7 @@ from llm import * | |||||
# | # | ||||
# Conditions: | # Conditions: | ||||
# 1. `e`, `exit`, `q`, or `quit` was entered | # 1. `e`, `exit`, `q`, or `quit` was entered | ||||
# 2. Victory has just been reported | |||||
@llm_by_value | @llm_by_value | ||||
def cli_exit( | def cli_exit( | ||||
c: memory_Context | c: memory_Context | ||||
@@ -22,6 +23,33 @@ def cli_exit( | |||||
c.recentField = "exit" | c.recentField = "exit" | ||||
return c | 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" | c.recentField = "none" | ||||
return c | return c | ||||
#} | #} | ||||
@@ -47,6 +75,9 @@ def cli_greetUser( | |||||
#} | #} | ||||
# Ask user to select second item to have a pair of selected items | # Ask user to select second item to have a pair of selected items | ||||
# | |||||
# Conditions: | |||||
# 1. Single item has just been selected | |||||
@llm_by_value | @llm_by_value | ||||
def cli_promptSecondItemSelection( | def cli_promptSecondItemSelection( | ||||
c: memory_Context | c: memory_Context | ||||
@@ -64,6 +95,9 @@ def cli_promptSecondItemSelection( | |||||
#} | #} | ||||
# Report matched items | # Report matched items | ||||
# | |||||
# Conditions: | |||||
# 1. Items were hidden (i.e., they matched) | |||||
@llm_by_value | @llm_by_value | ||||
def cli_reportMatchedItems( | def cli_reportMatchedItems( | ||||
c: memory_Context | c: memory_Context | ||||
@@ -71,7 +105,7 @@ def cli_reportMatchedItems( | |||||
if ( | if ( | ||||
c.recentField == "hiddenItems" | c.recentField == "hiddenItems" | ||||
): | ): | ||||
c.outputMatchedItems = "Items matched! Go on:" | |||||
c.outputMatchedItems = "Items matched!" | |||||
c.recentField = "outputMatchedItems" | c.recentField = "outputMatchedItems" | ||||
return c | return c | ||||
#} | #} | ||||
@@ -79,6 +113,21 @@ def cli_reportMatchedItems( | |||||
return c | 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 | # Select item | ||||
# | # | ||||
@@ -133,23 +182,22 @@ def cli_showHelp( | |||||
return c | 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 | ## Report selection of invalid item ids | ||||
## | ## | ||||
## Conditions: | ## Conditions: | ||||
@@ -30,6 +30,46 @@ def cli_test_exit_exit( | |||||
return "ERR: cli_exit_e" | 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( | def cli_test_exit_q( | ||||
) -> str: | ) -> str: | ||||
c = memory_createContext() | c = memory_createContext() | ||||
@@ -58,6 +98,34 @@ def cli_test_exit_quit( | |||||
return "ERR: cli_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( | def cli_test_greetUser( | ||||
) -> str: | ) -> str: | ||||
c = memory_createContext() | c = memory_createContext() | ||||
@@ -112,6 +180,30 @@ def cli_test_reportMatchedItems( | |||||
return "ERR: cli_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( | def cli_test_selectItem( | ||||
) -> str: | ) -> str: | ||||
c = memory_createContext() | c = memory_createContext() | ||||
@@ -155,6 +247,44 @@ def cli_test_showHelp_help( | |||||
return "ERR: cli_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( | #def cli_test_shouldReportIvalidItemSelection_outOfBoundsMin( | ||||
#) -> str: | #) -> str: | ||||
@@ -4,8 +4,8 @@ from memory_test import * | |||||
from Controller import * | from Controller import * | ||||
import sys | 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_detectVictory()) | ||||
print(memory_test_generateConstPlayfield()) | print(memory_test_generateConstPlayfield()) | ||||
print(memory_test_hideMatchingItems()) | print(memory_test_hideMatchingItems()) | ||||
@@ -15,24 +15,31 @@ print(memory_test_selectItem_3x()) | |||||
print(cli_test_exit_e()) | print(cli_test_exit_e()) | ||||
print(cli_test_exit_exit()) | print(cli_test_exit_exit()) | ||||
print(cli_test_exit_victory()) | |||||
print(cli_test_exit_q()) | print(cli_test_exit_q()) | ||||
print(cli_test_exit_quit()) | print(cli_test_exit_quit()) | ||||
print(cli_test_goOn()) | |||||
print(cli_test_greetUser()) | print(cli_test_greetUser()) | ||||
print(cli_test_showHelp_h()) | print(cli_test_showHelp_h()) | ||||
print(cli_test_showHelp_help()) | print(cli_test_showHelp_help()) | ||||
print(cli_test_selectItem()) | print(cli_test_selectItem()) | ||||
print(cli_test_promptSecondItemSelection()) | print(cli_test_promptSecondItemSelection()) | ||||
print(cli_test_reportMatchedItems()) | print(cli_test_reportMatchedItems()) | ||||
print(cli_test_reportMismatchedItems()) | |||||
print(cli_test_reportVictory()) | |||||
ctrl = Controller(memory_createContext()) | ctrl = Controller(memory_createContext()) | ||||
ctrl.registerFunction(cli_exit) | ctrl.registerFunction(cli_exit) | ||||
ctrl.registerFunction(cli_goOn) | |||||
ctrl.registerFunction(cli_greetUser) | ctrl.registerFunction(cli_greetUser) | ||||
ctrl.registerFunction(cli_promptSecondItemSelection) | ctrl.registerFunction(cli_promptSecondItemSelection) | ||||
ctrl.registerFunction(cli_reportMatchedItems) | ctrl.registerFunction(cli_reportMatchedItems) | ||||
ctrl.registerFunction(cli_reportMismatchedItems) | |||||
ctrl.registerFunction(cli_reportVictory) | |||||
ctrl.registerFunction(cli_selectItem) | ctrl.registerFunction(cli_selectItem) | ||||
ctrl.registerFunction(cli_showHelp) | ctrl.registerFunction(cli_showHelp) | ||||
ctrl.registerFunction(memory_deselectMismatchedItems) | |||||
ctrl.registerFunction(memory_detectMismatchedItems) | |||||
ctrl.registerFunction(memory_detectVictory) | ctrl.registerFunction(memory_detectVictory) | ||||
ctrl.registerFunction(memory_generateConstPlayfield) | ctrl.registerFunction(memory_generateConstPlayfield) | ||||
ctrl.registerFunction(memory_hideMatchingItems) | ctrl.registerFunction(memory_hideMatchingItems) | ||||
@@ -40,7 +47,7 @@ ctrl.registerFunction(memory_selectItem) | |||||
def printOutput(c): | def printOutput(c): | ||||
if c.recentField.startswith("output"): | if c.recentField.startswith("output"): | ||||
print(getattr(c, c.recentField)) | |||||
print(c.field(c.recentField)) | |||||
ctrl.registerCallback(printOutput) | ctrl.registerCallback(printOutput) | ||||
#ctrl.registerCallback(lambda c: print(f"ИГР App.dbg ctx: '{c}'")) | #ctrl.registerCallback(lambda c: print(f"ИГР App.dbg ctx: '{c}'")) | ||||
ctrl.registerFieldCallback("exit", lambda c: sys.exit(0)) | ctrl.registerFieldCallback("exit", lambda c: sys.exit(0)) | ||||
@@ -1,14 +1,14 @@ | |||||
from memory_Context import * | from memory_Context import * | ||||
from llm import * | from llm import * | ||||
# Deselect mismatched items | |||||
# Detect mismatched items | |||||
# | # | ||||
# Conditions: | # Conditions: | ||||
# 0. Two items has just been selected | # 0. Two items has just been selected | ||||
# 1. The same item has been selected twice | # 1. The same item has been selected twice | ||||
# 2. Selected items are of different groups | # 2. Selected items are of different groups | ||||
@llm_by_value | @llm_by_value | ||||
def memory_deselectMismatchedItems( | |||||
def memory_detectMismatchedItems( | |||||
c: memory_Context | c: memory_Context | ||||
) -> memory_Context: | ) -> memory_Context: | ||||
if not ( | if not ( | ||||
@@ -4,11 +4,13 @@ class memory_Context: | |||||
self.hiddenItems = [] | self.hiddenItems = [] | ||||
self.input = "" | self.input = "" | ||||
self.mismatchedItems = [] | self.mismatchedItems = [] | ||||
self.outputGoOn = "" | |||||
self.outputGreeting = "" | self.outputGreeting = "" | ||||
self.outputHelp = "" | self.outputHelp = "" | ||||
self.outputMatchedItems = "" | self.outputMatchedItems = "" | ||||
self.outputMismatchedItems = "" | self.outputMismatchedItems = "" | ||||
self.outputPromptSelection = "" | self.outputPromptSelection = "" | ||||
self.outputVictory = "" | |||||
self.playfieldItems = {} | self.playfieldItems = {} | ||||
self.playfieldSize = 0 | self.playfieldSize = 0 | ||||
self.recentField = "none" | self.recentField = "none" | ||||
@@ -16,6 +18,11 @@ class memory_Context: | |||||
self.selectedItems = [] | self.selectedItems = [] | ||||
self.victory = False | self.victory = False | ||||
def field(self, fieldName): | |||||
return getattr(self, fieldName) | |||||
def setField(self, fieldName, value): | |||||
setattr(self, fieldName, value) | |||||
def __repr__(self): | def __repr__(self): | ||||
return self.__str__() | return self.__str__() | ||||
@@ -1,7 +1,7 @@ | |||||
from memory import * | from memory import * | ||||
from memory_Context import * | from memory_Context import * | ||||
def memory_test_deselectMismatchedItems( | |||||
def memory_test_detectMismatchedItems( | |||||
) -> str: | ) -> str: | ||||
c = memory_createContext() | c = memory_createContext() | ||||
c.playfieldSize = 2 | c.playfieldSize = 2 | ||||
@@ -17,7 +17,7 @@ def memory_test_deselectMismatchedItems( | |||||
c = memory_selectItem(c) | c = memory_selectItem(c) | ||||
# Detect mismatching. | # Detect mismatching. | ||||
c = memory_deselectMismatchedItems(c) | |||||
c = memory_detectMismatchedItems(c) | |||||
# See if the two selected items do not match. | # See if the two selected items do not match. | ||||
if ( | if ( | ||||
@@ -26,12 +26,12 @@ def memory_test_deselectMismatchedItems( | |||||
c.mismatchedItems[0] == 0 and | c.mismatchedItems[0] == 0 and | ||||
c.mismatchedItems[1] == 2 | 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: | ) -> str: | ||||
c = memory_createContext() | c = memory_createContext() | ||||
c.playfieldSize = 2 | c.playfieldSize = 2 | ||||
@@ -47,7 +47,7 @@ def memory_test_deselectMismatchedItems_itemTwice( | |||||
c = memory_selectItem(c) | c = memory_selectItem(c) | ||||
# Detect mismatching. | # Detect mismatching. | ||||
c = memory_deselectMismatchedItems(c) | |||||
c = memory_detectMismatchedItems(c) | |||||
# See if the two selected items do not match. | # See if the two selected items do not match. | ||||
if ( | if ( | ||||
@@ -55,9 +55,9 @@ def memory_test_deselectMismatchedItems_itemTwice( | |||||
len(c.mismatchedItems) == 1 and | len(c.mismatchedItems) == 1 and | ||||
c.mismatchedItems[0] == 0 | 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( | def memory_test_detectVictory( | ||||