From e4296187eeffc36c95308d3d315d44adc948433c Mon Sep 17 00:00:00 2001 From: praticamentetilde Date: Mon, 1 Jan 2018 14:14:05 +0100 Subject: [PATCH] Server funzionante --- gamedata.c | 40 ++++++++++++++++++++++++++++++++++------ gamedata.h | 3 +++ server.c | 19 ++++++++++++++----- 3 files changed, 51 insertions(+), 11 deletions(-) diff --git a/gamedata.c b/gamedata.c index 8dd668b..b6fe8ed 100644 --- a/gamedata.c +++ b/gamedata.c @@ -15,9 +15,11 @@ gamedata_t* gamedata_new() { perror("gamedata malloc() creation error: "); } + srand(time(NULL)); + self->chf = 0; - self->bitto = 500; - self->flour = 200; + self->bitto = 200; + self->flour = 400; self->pizzoccheri = 0; self->chf_unit = 0.5; return self; @@ -33,11 +35,11 @@ void gamedata_print_status(gamedata_t *self, FILE* out) { fprintf(out, "UNIT PRICE %.02f CHF, PROFIT %.02f CHF\n", self->chf_unit, self->chf); } -#define Q_BITTO_FOR_PIZZOCCHERO 1 -#define Q_FLOUR_FOR_PIZZOCCHERO 2 +#define Q_BITTO_UNIT 1 +#define Q_FLOUR_UNIT 2 bool gamedata_make_pizzoccheri(gamedata_t *self, unsigned int q) { - int q_flour = q * Q_FLOUR_FOR_PIZZOCCHERO; - int q_bitto = q * Q_BITTO_FOR_PIZZOCCHERO; + int q_flour = q * Q_FLOUR_UNIT; + int q_bitto = q * Q_BITTO_UNIT; if(self->flour < q_flour || self->bitto < q_bitto) { return false; @@ -75,3 +77,29 @@ bool gamedata_buy_flour(gamedata_t *self, unsigned int q) { self->flour += q; return true; } + +unsigned int gamedata_sell_pizzoccheri(gamedata_t *self) { + if(self->pizzoccheri == 0) { + return 0; + } + + int sold = 5 * (-self->chf_unit + 1 + 2 * (double)rand() / (double)RAND_MAX); + + if(sold <= 0) { + return 0; + } + if(sold > self->pizzoccheri) { + sold = self->pizzoccheri; + } + + self->pizzoccheri -= sold; + self->chf += sold * self->chf_unit; + + return sold; +} + +bool gamedata_set_unit_price(gamedata_t *self, double price) { + if(price < 0) return false; + self->chf_unit = price; + return true; +} diff --git a/gamedata.h b/gamedata.h index 8feaf9a..1e5308e 100644 --- a/gamedata.h +++ b/gamedata.h @@ -4,6 +4,7 @@ #include #include #include +#include typedef struct _gamedata gamedata_t; @@ -13,5 +14,7 @@ extern bool gamedata_buy_bitto(gamedata_t*, unsigned int); extern bool gamedata_buy_flour(gamedata_t*, unsigned int); extern void gamedata_print_status(gamedata_t*, FILE*); extern bool gamedata_make_pizzoccheri(gamedata_t*, unsigned int); +extern unsigned int gamedata_sell_pizzoccheri(gamedata_t*); +extern bool gamedata_set_unit_price(gamedata_t*, double); #endif diff --git a/server.c b/server.c index 8889c6b..3b0f7df 100644 --- a/server.c +++ b/server.c @@ -86,22 +86,31 @@ int main(int argc, char** argv) { double d; } arg1; - if(sscanf(command, "MAKE %u\n", &(arg1.u)) == 1) { + if(sscanf(command, "make %u\n", &(arg1.u)) == 1) { bool status = gamedata_make_pizzoccheri(curr_data, arg1.u); fprintf(out, status ? "OK Made.\n" : "KO 1 Insufficient resources.\n"); } - else if(sscanf(command, "BUY BITTO %u", &(arg1.u)) == 1) { + else if(prefix("sell", command)) { + unsigned int sold = gamedata_sell_pizzoccheri(curr_data); + fprintf(out, "OK %d sold.\n", sold); + } + else if(sscanf(command, "set price %lf\n", &(arg1.d)) == 1) { + bool status = gamedata_set_unit_price(curr_data, arg1.d); + fprintf(out, status ? "OK The price of one pizzocchero is now at %.02lf CHF.\n" + : "KO %.02lf CHF is not a valid price.\n", arg1.d); + } + else if(sscanf(command, "buy bitto %u", &(arg1.u)) == 1) { bool status = gamedata_buy_bitto(curr_data, arg1.u); fprintf(out, status ? "OK Purchased.\n" : "KO 2 Insufficient funds\n"); } - else if(sscanf(command, "BUY FLOUR %u", &(arg1.u)) == 1) { + else if(sscanf(command, "buy flour %u", &(arg1.u)) == 1) { bool status = gamedata_buy_flour(curr_data, arg1.u); fprintf(out, status ? "OK Purchased.\n" : "KO 3 Insufficient funds\n"); } - else if(prefix("STATUS", command)) { + else if(prefix("status", command)) { gamedata_print_status(curr_data, out); } - else if(prefix("EXIT", command)) { + else if(prefix("exit", command)) { fprintf(out, "OK Closing...\n"); break; }