From 1d8d5650c48899136cdcc169633101ba100ed1b4 Mon Sep 17 00:00:00 2001 From: Lendemor Date: Sun, 25 Oct 2015 20:12:14 +0100 Subject: [PATCH] added basic janken module --- app/app.pro | 8 +++-- app/janken.cpp | 81 ++++++++++++++++++++++++++++++++++++++++++++ app/janken.h | 29 ++++++++++++++++ app/jankenmodule.cpp | 53 +++++++++++++++++++++++++++++ app/jankenmodule.h | 21 ++++++++++++ app/main.cpp | 16 +++++++++ app/poilaumodule.cpp | 1 + 7 files changed, 207 insertions(+), 2 deletions(-) create mode 100644 app/janken.cpp create mode 100644 app/janken.h create mode 100644 app/jankenmodule.cpp create mode 100644 app/jankenmodule.h diff --git a/app/app.pro b/app/app.pro index 433edfa..ec01c22 100644 --- a/app/app.pro +++ b/app/app.pro @@ -16,7 +16,9 @@ SOURCES = main.cpp \ poilaumodule.cpp \ fourasmodule.cpp \ riddles.cpp \ - todomodule.cpp + todomodule.cpp \ + jankenmodule.cpp \ + janken.cpp HEADERS += \ regismodule.h \ @@ -25,4 +27,6 @@ HEADERS += \ poilaumodule.h \ fourasmodule.h \ riddles.h \ - todomodule.h + todomodule.h \ + jankenmodule.h \ + janken.h diff --git a/app/janken.cpp b/app/janken.cpp new file mode 100644 index 0000000..42579e9 --- /dev/null +++ b/app/janken.cpp @@ -0,0 +1,81 @@ +#include "janken.h" + +Janken::Janken() +{ + nb_played = NB_COUPS; + memset(played,1,sizeof(int)*NB_COUPS); + std::srand(time(NULL)); +} + +bool Janken::hasPlayed(QString msg){ + if(msg.compare(QString("Pierre")) == 0){ + last_move = PIERRE; + return true; + }else if(msg.compare(QString("Feuille")) == 0){ + last_move = FEUILLE; + return true; + }else if(msg.compare(QString("Ciseaux")) == 0){ + last_move = CISEAUX; + return true; + } + return false; +} + +void Janken::updateKnowledge(){ + played[last_move] += 1; + nb_played += 1; +} + +int Janken::pickMove() +{ + if (hasUniqueSolution()){ + bot_move = getSolution(); + return bot_move; + }else{ + bot_move = rand()%Move::NB_COUPS; + return bot_move; + } +} + +bool Janken::hasUniqueSolution(){ + int nb_solution = 0; + float ratio, solution = 0.f; + for(int i = 0;i < NB_COUPS; i++){ + ratio = played[i]/nb_played; + if (ratio > solution){ + solution = ratio; + nb_solution = 1; + }else if(ratio == solution){ + nb_solution++; + } + } + + if (nb_solution == 1) + return true; + else + return false; +} + +int Janken::getSolution(){ + int solution; + float ratio, best_ratio = 0; + for(int i = 0;i < NB_COUPS; i++){ + if ((ratio = played[i]/nb_played) > best_ratio){ + best_ratio = ratio; + solution = i; + } + } + return (solution + 1) % NB_COUPS; +} + +QString Janken::getWinner() +{ + QString winner; + if(bot_move == (last_move+1)%NB_COUPS) + winner = QString("You lose!"); + else if (bot_move == last_move) + winner = QString("Tch.. that's a draw."); + else + winner= QString("... ... You win ... ..."); + return winner; +} diff --git a/app/janken.h b/app/janken.h new file mode 100644 index 0000000..ac52637 --- /dev/null +++ b/app/janken.h @@ -0,0 +1,29 @@ +#ifndef JANKEN_H +#define JANKEN_H + +#include "module.h" + + +enum Move{ + PIERRE,FEUILLE,CISEAUX,NB_COUPS +}; + +class Janken +{ +private: + int bot_move; + int last_move; + int nb_played; + int played[Move::NB_COUPS]; + +public: + Janken(); + bool hasPlayed(QString msg); + void updateKnowledge(); + int pickMove(); + bool hasUniqueSolution(); + int getSolution(); + QString getWinner(); +}; + +#endif // JANKEN_H diff --git a/app/jankenmodule.cpp b/app/jankenmodule.cpp new file mode 100644 index 0000000..ca83f30 --- /dev/null +++ b/app/jankenmodule.cpp @@ -0,0 +1,53 @@ +#include "jankenmodule.h" + +#include "message.h" +#include "janken.h" + +JankenModule::JankenModule() +{ + playing = false; + jk = new Janken(); +} + +bool JankenModule::messageHandler(Message msg) +{ + if(msg.command.compare(QString("PRIVMSG"), Qt::CaseInsensitive) != 0 || !msg.target.contains(getChan())) + return false; + + if(msg.args.compare("!janken") == 0) + { + answer = say(" Pon !"); + playing = true; + return true; + } + + if(msg.args.compare("!stopjanken") == 0) + { + playing = false; + return false; + } + + if(playing && jk->hasPlayed(msg.args)){ + int move = jk->pickMove(); + switch(move){ + case PIERRE: + answer=say(QString("Pierre\n")) + say(jk->getWinner()) ; + break; + case FEUILLE: + answer=say(QString("Feuille\n"))+ say(jk->getWinner()); + break; + case CISEAUX: + answer=say(QString("Ciseaux\n"))+ say(jk->getWinner()); + break; + }; + jk->updateKnowledge(); + playing = false; + return true; + } + return false; +} + +QString JankenModule::getName() +{ + return "janken"; +} diff --git a/app/jankenmodule.h b/app/jankenmodule.h new file mode 100644 index 0000000..ef33487 --- /dev/null +++ b/app/jankenmodule.h @@ -0,0 +1,21 @@ +#ifndef JANKENMODULE_H +#define JANKENMODULE_H + +#include "module.h" + +class Janken; + +class JankenModule : public Module +{ +private: + bool playing; + Janken* jk; +public: + JankenModule(); + + virtual bool messageHandler(Message msg); + virtual QString getName(); + +}; + +#endif // JANKENMODULE_H diff --git a/app/main.cpp b/app/main.cpp index 1ff4c98..dc910cc 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -1,3 +1,5 @@ +#include + #include "botapp.h" #include "module.h" #include "message.h" @@ -7,6 +9,9 @@ #include "poilaumodule.h" #include "fourasmodule.h" #include "todomodule.h" +#include "jankenmodule.h" +// +#include "janken.h" class HelloWorldModule : public Module { @@ -37,6 +42,17 @@ int main(int argc, char *argv[]) app.addModule(new SparrowModule()); app.addModule(new PoilAuModule()); app.addModule(new FourasModule()); + app.addModule(new JankenModule()); //app.addModule(new TodoModule()); return app.exec(); + + /* Janken jk = Janken(); + QString str; + jk.hasPlayed("Pierre"); + int a = jk.pickMove(); + switch(a){ + case PIERRE: + std::cerr << QString("Pierre").toStdString() << std::endl; + break; + }*/ } diff --git a/app/poilaumodule.cpp b/app/poilaumodule.cpp index 0ff41e5..5b8b093 100644 --- a/app/poilaumodule.cpp +++ b/app/poilaumodule.cpp @@ -8,6 +8,7 @@ enum{VOY_A, VOY_E, VOY_I, VOY_O, VOY_U, VOY_ET, VOY_AI, VOY_OU, VOY_IN, VOY_ON, bool PoilAuModule::messageHandler(Message msg) { + if (msg.args.startsWith("!")) return false; if(!isReady) return false; if(msg.command.compare(QString("PRIVMSG"), Qt::CaseInsensitive) != 0)