std::string RackoWorldStateFormatter::asString(const VecInt & gameHistory, WorldState & ws, const VecVecVecKey & kb) { ostringstream os; // Number of slot objects is (# slots per player)*2 + 1. (Extra 1 is "dealer"). // Integer division by two gives # slots per player. // unsigned slotCount = (unsigned) (proc->typeCardinalities[proc->typeNameIds["slot"]] / 2); unsigned slotCount = proc->itemCount("slot"); unsigned slotsPerPlayer = (slotCount - 1) / 2; // Subtract 1 for dealer; half of remaining are opponent's slots unsigned dealerSlotId = slotsPerPlayer; // Because slots are named d1 ... dn, dealer, u1, ... un; so dealer is in middle unsigned cardCount = proc->itemCount("card"); // os << "Racko World with " << slotCount << " slots and " << cardCount << " cards"; // os << " head id for 'at': " << proc->predicateId("at"); int atIndex = proc->predicateId("at"); int topIndex = proc->predicateId("top"); VecInt args(2, 0); int whoseTurn = ws.getWhoseTurn(); int minSlot = (whoseTurn == 2) ? 0 : dealerSlotId + 1; int oppMinSlot = (whoseTurn == 1) ? 0 : dealerSlotId + 1; os << "History\n"; for (unsigned m = slotCount + 1; m < gameHistory.size(); m++) { string oName; VecInt oArgs; proc->decodeOperator(gameHistory[m], oName, oArgs); if (oName == "swap-top") { if (oArgs[0] != whoseTurn) { os << "(Opponent) "; } int slotArg = getSlotArg(oArgs[3], slotsPerPlayer); os << "Swapped " << (oArgs[2] + 1) << " for " << (oArgs[4] + 1) << " into " << (char) (('A' + (slotArg))) << "\n"; } else if (oName == "swap-drawn") { if (oArgs[0] != whoseTurn) { os << "(Opponent) "; } int slotArg = getSlotArg(oArgs[2], slotsPerPlayer); os << "Swapped " << (oArgs[3] + 1) << " out of " << (char) (('A' + (slotArg))) << " for drawn "; if (oArgs[0] == whoseTurn) { os << (oArgs[4] + 1) << "\n"; } else { os << "card\n"; } } else if (oName == "pass") { if (oArgs[0] != whoseTurn) { os << "(Opponent) "; } os << "Discarded " << (oArgs[2] + 1) << "\n"; } else { // os << setw(3) << m << " " << oName << "\n"; } } os << "\n\n"; switch (whoseTurn) { case 0: // chance os << "Chance: "; args[1] = slotCount; // This will be the slot 'dealer' for (int c = 0; c < (int) (((((cardCount))))); c++) { args[0] = c; int index = ws.getIndex(args, atIndex); if (ws.getTruthValue(index) == KNOWN_TRUE) { os << " " << std::setw(3) << (c + 1); //" fact: " << proc->getFact(index); } } os << "\n"; break; case 1: case 2: os << "Current Player " << whoseTurn << "\n"; for (int s = minSlot; s < (int) ((((((minSlot + slotsPerPlayer)))))); s++) { os << " " << (char) (((((('A' + s - minSlot)))))) << ": "; //" fact: " << proc->getFact(index); args[1] = s; for (int c = 0; c < (int) (((((cardCount))))); c++) { args[0] = c; int index = ws.getIndex(args, atIndex); if (ws.getTruthValue(index) == KNOWN_TRUE) { os << std::setw(3) << (c + 1); //" fact: " << proc->getFact(index); } } os << "\n"; } if (false) for (int s = oppMinSlot; s < (int) ((((((oppMinSlot + slotCount)))))); s++) { os << " " << (char) (((((('A' + s - oppMinSlot)))))) << ": "; //" fact: " << proc->getFact(index); args[1] = s; for (int c = 0; c < (int) (((((cardCount))))); c++) { args[0] = c; int index = ws.getIndex(args, atIndex); if (ws.getTruthValue(index) == KNOWN_TRUE) { os << std::setw(3) << (c + 1); //" fact: " << proc->getFact(index); } } os << "\n"; } os << "\n"; break; } for (unsigned c = 0; c < cardCount; c++) { if (ws.getTruthValue(topIndex, c) == KNOWN_TRUE) { os << "Top: " << (c + 1) << "\n"; } } int drawnIndex = proc->predHeadTbl["drawn"]; for (unsigned c = 0; c < cardCount; c++) { for (unsigned ithDraw = 0; ithDraw < cardCount; ithDraw++) { if (ws.getTruthValue(drawnIndex, c, ithDraw) == KNOWN_TRUE) { os << "Drawn: " << (c + 1) << "\n"; } } } return os.str(); }
std::string BattleshipWorldStateFormatter::asString(const VecInt & gameHistory, WorldState & ws, const VecVecVecKey & kb) { ostringstream os; //os << "Battleship World with " << shipCount << " ships and " << gridPointsPerSide << " cards"; //os << " head id for 'at': " << proc->predHeadTbl["at"]; int occupiedIndex = proc->predHeadTbl["occupied"]; int guessedIndex = proc->predHeadTbl["guessed"]; unsigned gridPointsPerSide = proc->typeCardinalities[proc->typeNameIds["row"]]; //int atIndex = proc->predHeadTbl["at"]; VecInt args(2, 0); int whoseTurn = ws.getWhoseTurn(); int guessedFactIndex; int occupiedFactIndex; TruthState guessedTruthValue; TruthState occupiedTruthValue; switch (whoseTurn) { case 0: // chance os << "Chance: "; break; case 1: case 2: VecInt guessedPredicateArgs(3, 0); VecInt occupiedPredicateArgs(3, 0); os << "Player " << whoseTurn << "\n"; os << "Mine:\n"; occupiedPredicateArgs[0] = whoseTurn; guessedPredicateArgs[0] = 3 - whoseTurn; // Opponent's id for (unsigned r = 0; r < gridPointsPerSide; r++) { occupiedPredicateArgs[2] = (int) ((((r)))); guessedPredicateArgs[2] = (int) ((((r)))); for (unsigned c = 0; c < gridPointsPerSide; c++) { occupiedPredicateArgs[1] = (int) ((((c)))); occupiedFactIndex = proc->getIndex(occupiedPredicateArgs, occupiedIndex); occupiedTruthValue = ws.getTruthValue(occupiedFactIndex); guessedPredicateArgs[1] = (int) ((((c)))); guessedFactIndex = proc->getIndex(guessedPredicateArgs, guessedIndex); guessedTruthValue = ws.getTruthValue(guessedFactIndex); guessedPredicateArgs[1] = (int) ((((c)))); if (guessedTruthValue == KNOWN_TRUE) { if (occupiedTruthValue == KNOWN_TRUE) { os << "H"; } else { os << "M"; } } else { if (occupiedTruthValue == KNOWN_TRUE) { os << "1"; } else { os << "0"; } } //cout << "factIndex: " << factIndex << " <=> " << proc->getFact(factIndex) << std::endl; } os << "\n"; } os << "\n"; os << "Opponent:\n"; occupiedPredicateArgs[0] = 3 - whoseTurn; guessedPredicateArgs[0] = whoseTurn; // Opponent's id for (unsigned r = 0; r < gridPointsPerSide; r++) { occupiedPredicateArgs[2] = (int) ((((r)))); guessedPredicateArgs[2] = (int) ((((r)))); for (unsigned c = 0; c < gridPointsPerSide; c++) { occupiedPredicateArgs[1] = (int) ((((c)))); occupiedFactIndex = proc->getIndex(occupiedPredicateArgs, occupiedIndex); occupiedTruthValue = ws.getTruthValue(occupiedFactIndex); guessedPredicateArgs[1] = (int) ((((c)))); guessedFactIndex = proc->getIndex(guessedPredicateArgs, guessedIndex); guessedTruthValue = ws.getTruthValue(guessedFactIndex); guessedPredicateArgs[1] = (int) ((((c)))); if (guessedTruthValue == KNOWN_TRUE) { if (occupiedTruthValue == KNOWN_TRUE) { os << "H"; } else { os << "M"; } } else { //if (occupiedTruthValue == KNOWN_TRUE) { // os << "1"; //} else { os << "0"; //} } //cout << "factIndex: " << factIndex << " <=> " << proc->getFact(factIndex) << std::endl; } os << "\n"; } break; } return os.str(); }