Преглед изворни кода

Updated: sqlite db, fixed is_rank, is_deck.

is_suit.  Played with delays when dealing the
cards.  Don't bother with positioning the cursor,
you can't see it clearly.
Steve Thielemann пре 4 година
родитељ
комит
a8b15dd63a
7 измењених фајлова са 115 додато и 23 уклоњено
  1. 8 9
      CMakeLists.txt
  2. 45 0
      db.cpp
  3. 20 0
      db.h
  4. 5 4
      deck.cpp
  5. 5 2
      deck.h
  6. 2 1
      grind.sh
  7. 30 7
      main.cpp

+ 8 - 9
CMakeLists.txt

@@ -8,7 +8,7 @@ project(spaceace
 ###########
 if (NOT CMAKE_BUILD_TYPE)
   ## set default to Debug
-  set(CMAKE_BUILD_TYPE Debug)  # override with -DCMAKE_BUILD_TYPE=Release
+  set(CMAKE_BUILD_TYPE RelWithDebInfo)  # override with -DCMAKE_BUILD_TYPE=Release
   message("==> CMAKE_BUILD_TYPE empty. Changing it to Debug.")
 else()
   message("==> CMAKE_BUILD_TYPE == ${CMAKE_BUILD_TYPE}.")
@@ -28,11 +28,6 @@ set(CMAKE_CXX_EXTENSIONS ON)
 
 add_subdirectory(door++)
 
-# hahaha.  Why am I not surprised to see glog not wanting to work AT ALL.
-#
-# add_subdirectory(glog)
-# find_package (glog 0.5.0 REQUIRED)
-
 file(GLOB IMAGES
     ansi/*.ans
 )
@@ -45,7 +40,11 @@ add_custom_command(
     WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
 )
 
-# add_executable(space-ace main.cpp deck.cpp images.h glog::glog)
-add_executable(space-ace main.cpp deck.cpp images.h)
-target_link_libraries(space-ace door++ pthread)
+set(SQLITECPP_RUN_CPPCHECK OFF CACHE BOOL "" FORCE)
+set(SQLITECPP_RUN_CPPLINT OFF CACHE BOOL "" FORCE)
+add_subdirectory(SQLiteCpp)
+
+
+add_executable(space-ace main.cpp deck.cpp db.h db.cpp images.h)
+target_link_libraries(space-ace door++ pthread SQLiteCpp sqlite3 dl)
 

+ 45 - 0
db.cpp

@@ -0,0 +1,45 @@
+#include "db.h"
+
+#include <SQLiteCpp/VariadicBind.h>
+#include <iostream>
+
+DBData::DBData(void)
+    : db("space-data.db", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE) {
+  init();
+}
+
+// DBData::DBData(void) : sql(std::string(DB_CONNECT_STRING)) {}
+
+DBData::~DBData() {}
+
+void DBData::init(void) {
+  db.exec("CREATE TABLE IF NOT EXISTS \
+settings(username TEXT, setting TEXT, value TEXT, \
+PRIMARY KEY(username, setting));");
+}
+
+std::string DBData::getSetting(const std::string &user,
+                               const std::string &setting,
+                               std::string ifMissing) {
+  SQLite::Statement query(
+      db, "SELECT value FROM settings WHERE username=? AND setting=?");
+  query.reset();
+  query.bind(1, user);
+  query.bind(2, setting);
+  if (query.executeStep()) {
+    std::string value = query.getColumn(0);
+    return value;
+  };
+  return ifMissing;
+}
+
+void DBData::setSetting(const std::string &user, const std::string &setting,
+                        const std::string &value) {
+  SQLite::Statement stmt(
+      db, "REPLACE INTO settings(username, setting, value) VALUES(?,?,?);");
+  stmt.reset();
+  stmt.bind(1, user);
+  stmt.bind(2, setting);
+  stmt.bind(3, value);
+  stmt.exec();
+}

+ 20 - 0
db.h

@@ -0,0 +1,20 @@
+#ifndef DB_H
+#define DB_H
+
+#include <SQLiteCpp/SQLiteCpp.h>
+
+class DBData {
+  SQLite::Database db;
+  void init(void);
+
+public:
+  DBData();
+  virtual ~DBData();
+
+  std::string getSetting(const std::string &user, const std::string &setting,
+                         std::string ifMissing);
+  void setSetting(const std::string &user, const std::string &setting,
+                  const std::string &value);
+};
+
+#endif

+ 5 - 4
deck.cpp

@@ -40,8 +40,9 @@ Deck::~Deck() {
   backs.clear();
 }
 
-int Deck::is_suit(int c) { return c / 13; }
-int Deck::is_rank(int c) { return c % 13; }
+int Deck::is_deck(int c) { return c / 52; }
+int Deck::is_suit(int c) { return (c % 52) / 13; }
+int Deck::is_rank(int c) { return (c % 52) % 13; }
 
 char Deck::rank_symbol(int c) {
   const char symbols[] = "A23456789TJQK";
@@ -309,7 +310,7 @@ int levels[4] = {3, 6, 9, 10};
   }
 }
 
-std::vector<int> card_shuffle(std::seed_seq &seed, int decks) {
+cards card_shuffle(std::seed_seq &seed, int decks) {
   std::mt19937 gen;
 
   // build deck of cards
@@ -326,7 +327,7 @@ std::vector<int> card_shuffle(std::seed_seq &seed, int decks) {
   return deck;
 }
 
-std::vector<int> card_states(int decks) {
+cards card_states(int decks) {
   // auto states = std::unique_ptr<std::vector<int>>(); // (decks * 52, 0)>;
   std::vector<int> states;
   states.assign(decks * 52, 0);

+ 5 - 2
deck.h

@@ -18,6 +18,8 @@ int suit(int c);  // suit
 int rank(int c);  // rank
  */
 
+typedef std::vector<int> cards;
+
 class Deck {
 private:
   door::ANSIColor cardback;
@@ -28,6 +30,7 @@ private:
   door::Panel *back_of(int level);
   int is_rank(int c);
   int is_suit(int c);
+  int is_deck(int c);
   void init(void);
   char rank_symbol(int c);
   std::string suit_symbol(int c);
@@ -69,6 +72,6 @@ void cardgo(int pos, int space, int h, int &x, int &y, int &level);
  * @param decks
  * @return vector<int>
  */
-std::vector<int> card_shuffle(std::seed_seq &seed, int decks = 1);
+cards card_shuffle(std::seed_seq &seed, int decks = 1);
 
-std::vector<int> card_states(int decks = 1);
+cards card_states(int decks = 1);

+ 2 - 1
grind.sh

@@ -1,6 +1,7 @@
 #!/bin/bash
 
-valgrind -v --log-file=grind.log build/space-ace -l -u grinder
+# valgrind -v --log-file=grind.log build/space-ace -l -u grinder
+valgrind -v --leak-check=full --show-leak-kinds=all --log-file=grind.log build/space-ace -l -u grinder
 
 
 tail grind.log

+ 30 - 7
main.cpp

@@ -7,6 +7,7 @@
 #include <random>
 #include <string>
 
+#include "db.h"
 #include "deck.h"
 /*
 
@@ -397,11 +398,25 @@ int main(int argc, char *argv[]) {
 
   door::Door door("space-ace", argc, argv);
   // door << door::reset << door::cls << door::nl;
-  door::ANSIColor ac(door::COLOR::YELLOW, door::ATTR::BOLD);
+  // door::ANSIColor ac(door::COLOR::YELLOW, door::ATTR::BOLD);
+  // door::ANSIColor mb(door::COLOR::MAGENTA, door::ATTR::BLINK);
 
-  door::ANSIColor mb(door::COLOR::MAGENTA, door::ATTR::BLINK);
+  // door << mb << "Does this work?" << door::reset << door::nl;
 
-  door << mb << "Does this work?" << door::reset << door::nl;
+  DBData spacedb;
+
+  // spacedb.init();
+
+  std::string setting = "last_play";
+  std::string user = door.username;
+  std::string value;
+  std::string blank = "<blank>";
+  value = spacedb.getSetting(user, setting, blank);
+
+  door << door::reset << "last_play: " << value << door::nl;
+  std::this_thread::sleep_for(std::chrono::seconds(2));
+  value = return_current_time_and_date();
+  spacedb.setSetting(user, setting, value);
 
   // https://stackoverflow.com/questions/5008804/generating-random-integer-from-a-range
 
@@ -560,13 +575,19 @@ int main(int argc, char *argv[]) {
   int off_y = (my - 9) / 2;
 
   std::seed_seq s1{2021, 2, 27, 1};
-  std::vector<int> deck1 = card_shuffle(s1, 1);
-  std::vector<int> state = card_states();
+  cards deck1 = card_shuffle(s1, 1);
+  cards state = card_states();
 
+  // I tried setting the cursor before the delay and before displaying the card.
+  // It is very hard to see / just about useless.  Not worth the effort.
   for (int x = 0; x < 28; x++) {
     int cx, cy, level;
-    std::this_thread::sleep_for(std::chrono::milliseconds(75));
+
     cardgo(x, space, height, cx, cy, level);
+    // This is hardly visible.
+    // door << door::Goto(cx + off_x - 1, cy + off_y + 1);
+    std::this_thread::sleep_for(std::chrono::milliseconds(75));
+
     c = d.back(level);
     c->set(cx + off_x, cy + off_y);
     door << *c;
@@ -580,9 +601,11 @@ int main(int argc, char *argv[]) {
   for (int x = 18; x < 28; x++) {
     int cx, cy, level;
     // usleep(1000 * 20);
-    std::this_thread::sleep_for(std::chrono::milliseconds(200));
+
     state.at(x) = 1;
     cardgo(x, space, height, cx, cy, level);
+    // door << door::Goto(cx + off_x - 1, cy + off_y + 1);
+    std::this_thread::sleep_for(std::chrono::milliseconds(200));
 
     c = d.card(deck1.at(x));
     c->set(cx + off_x, cy + off_y);