📄 guess.cpp
字号:
/******************************************************************* * * * guess.cpp * * * * This file is a part of the eXtremeDB source code * * Copyright (c) 2001-2007 McObject LLC * * All Rights Reserved * * * *******************************************************************/#include "guess.h"void input(char const* prompt, char* buf, size_t buf_size){ char* p; do { printf(prompt); *buf = '\0'; fgets(buf, (int)buf_size, stdin); p = buf + strlen(buf); } while (p <= buf+1); if (*(p-1) == '\n') { *--p = '\0'; }}bool askQuestion(char const* question) { char answer[MAX_STR_LENGTH]; input(question, answer, sizeof answer); return *answer == 'y' || *answer == 'Y';}Reference* GuessGame::whoIsIt(Reference* parent) { char animal[MAX_STR_LENGTH]; char difference[MAX_STR_LENGTH]; input("What is it ? ", animal, sizeof animal); input("What is a difference from other ? ", difference, sizeof difference); Record* animalNode = table->createRecord(trans); questionField->set(animalNode, String::create(animal)); Record* diffNode = table->createRecord(trans); questionField->set(diffNode, String::create(difference)); yesField->set(diffNode, table->getRID(animalNode)); noField->set(diffNode, parent); return table->getRID(diffNode);}Reference* GuessGame::dialog(Record* rec) { char question[MAX_STR_LENGTH+16]; sprintf(question, "May be %s (y/n) ? ", questionField->get(rec)->stringValue()->cstr()); if (askQuestion(question)) { Reference* yes = (Reference*)yesField->get(rec); if (yes->isNull()) { printf("It was very simple question for me...\n"); } else { Reference* clarify = dialog(yes->dereference()); if (clarify != NULL) { yesField->set(rec, clarify); rec->updateRecord(); } } } else { Reference* no = (Reference*)noField->get(rec); if (no->isNull()) { if (yesField->get(rec)->isNull()) { return whoIsIt(table->getRID(rec)); } else { noField->set(rec, whoIsIt(NULL)); rec->updateRecord(); } } else { Reference* clarify = dialog(no->dereference()); if (clarify != NULL) { noField->set(rec, clarify); rec->updateRecord(); } } } return NULL;}void GuessGame::loadMetadata(DataSource* source){ Iterator<Field>* fields = source->fields(); while (fields->hasNext()) { Field* f = fields->next(); String* name = f->name(); if (name->compare("yes") == 0) { yesField = f; } else if (name->compare("no") == 0) { noField = f; } else if (name->compare("question") == 0) { questionField = f; } } assert(yesField != NULL); assert(noField != NULL); assert(questionField != NULL); table = yesField->table();}void GuessGame::play(){ DataSource* result; Cursor* cursor; engine.open("guessdb", guessdb_get_dictionary(), DATABASE_SIZE, PAGE_SIZE, MAP_ADDRESS); while (askQuestion("Think of an animal. Ready (y/n) ? ")) { result = engine.executeQuery("select * from Guess for update"); if (table == NULL) { loadMetadata(result); } trans = result->currentTransaction(); cursor = result->records(); if (cursor->hasNext()) { cursor->next(); // first question is in record number 2 dialog(cursor->next()); } else { whoIsIt(NULL); } result->release(); } engine.close(); printf("End of the game\n");}GuessGame::GuessGame() { yesField = noField = questionField = NULL; table = NULL;}int main() { GuessGame game; game.play(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -