λοι κάποτε θα είχαμε παίξει το φιδάκι. Το κλασσικό αυτό επιτραπέζιο παιχνίδι, που για να τερματίσεις πρέπει να φτάσεις στο τετράγωνο με τον αριθμό 100, περνώντας από 9 φίδια που σε κατεβάζουν μερικά έως και πολλά τετράγωνα κάτω και τις σκάλες που μπορούν να σε κάνουν νικήσεις πολύ εύκολα.

Το πρόγραμμα έχει φτιαχτεί σε c++ με την βοήθεια κλάσεων. Ο κώδικας φαίνεται παρακάτω και επιπλέον δίνεται για κατέβασμα το ίδιο το πρόγραμμα compiled. Η εργασία έγινε για την σχολή και είπα να την ανεβάσω και εδώ.

Μπορείτε να παίξετε το φιδάκι σε Windows από το binary αρχείο.

header.h

class fidaki{
 unsigned short int *fidia;
 unsigned short int *skales;
 unsigned short int *Cpos;
public:
 fidaki(unsigned short int);
 ~fidaki();
 unsigned short int checkFor(unsigned short int,unsigned short int*) const;
 void UpPos(unsigned short int, unsigned short int);
 unsigned short int GetPos(unsigned short int) const;
 unsigned short int RollDice(void) const;
};
 
class userInterface{
 std::string *NaSu;
 unsigned short int players;
 unsigned short int *PlayRound;
public:
 userInterface(unsigned short int);
 ~userInterface();
 void NextRound(void);
 unsigned short int WhoPlays(void) const;
 unsigned short int PlayBy2(void) const;
 void GetName(unsigned short int) const;
 void GetNaSus(void);
 void AnnPlayer(void) const;
};
 
bool CkSp(std::string);
void starting(void);
unsigned short int sanitizePls(void);
void theend(void);

main.cpp

#include <iostream>

#include <string>

#include <cstdlib>

#include <ctime>

#include "header.h"

userInterface::userInterface(const unsigned short int pls) {
  players = pls;
  try {
    NaSu = new std::string[2 * players];
    PlayRound = new unsigned short int[2];
  } catch (std::bad_alloc & ba) {
    std::cerr << "bad_alloc caught: " << ba.what() << std::endl;
  }
  PlayRound[0] = 1;
  PlayRound[1] = 0;
}

userInterface::~userInterface() {
  delete[] NaSu;
  delete[] PlayRound;
}

void userInterface::NextRound(void) {
  if (PlayRound[0] == players) {
    PlayRound[0] = 1;
    PlayRound[1] = 0;
  } else {
    PlayRound[0] += 1;
    PlayRound[1] += 2;
  }
  std::cout << "Patise enter gia ton epomeno paikti..\n\n" << std::endl;
  std::cin.get();
}

unsigned short int userInterface::WhoPlays(void) const {
  return PlayRound[0];
}

unsigned short int userInterface::PlayBy2(void) const {
  return PlayRound[1];
}

void userInterface::GetName(unsigned short int pl) const {
  pl -= 1;
  std::cout << NaSu[pl * 2] << " ";
  std::cout << NaSu[pl * 2 + 1];
}

void userInterface::GetNaSus(void) {
  unsigned short int counter = 1;
  std::cout << "Kathe paiktis prepei na dinei prwta to onoma kai meta to epwnimo tou." << std::endl;
  for (unsigned short int i = 0; i < (2 * players); i += 2) {
    std::cout << "\nPaikti " << counter << " dwse to onoma sou: ";
    std::cin >> NaSu[i];
    std::cout << "Twra dwse to epwnimo sou: ";
    std::cin >> NaSu[i + 1];
    while (CkSp(NaSu[i]) || CkSp(NaSu[i + 1])) {
      std::cout << "\nKapoio lathos egine. Prospathise ksana to onoma: ";
      std::cin >> NaSu[i];
      std::cout << "\nTwra dwse to epinomo: ";
      std::cin >> NaSu[i + 1];
    }
    counter++;
  }
  std::cout << "\n";
}

void userInterface::AnnPlayer(void) const {
  std::cout << "Einai h seira toy paikti " << NaSu[PlayRound[1]] << " " << NaSu[PlayRound[1] + 1] << std::endl;
}

fidaki::fidaki(unsigned short int pls) {
  try {
    fidia = new unsigned short int[18];
    skales = new unsigned short int[18];
    Cpos = new unsigned short int[pls];
  } catch (std::bad_alloc & ba) {
    std::cerr << "bad_alloc caught: " << ba.what() << std::endl;
  }
  skales[0] = 3;
  skales[1] = 25;
  skales[2] = 8;
  skales[3] = 34;
  skales[4] = 23;
  skales[5] = 41;
  skales[6] = 33;
  skales[7] = 49;
  skales[8] = 37;
  skales[9] = 67;
  skales[10] = 56;
  skales[11] = 78;
  skales[12] = 69;
  skales[13] = 87;
  skales[14] = 71;
  skales[15] = 91;
  skales[16] = 80;
  skales[17] = 99;
  fidia[0] = 18;
  fidia[1] = 6;
  fidia[2] = 36;
  fidia[3] = 14;
  fidia[4] = 44;
  fidia[5] = 20;
  fidia[6] = 52;
  fidia[7] = 30;
  fidia[8] = 61;
  fidia[9] = 42;
  fidia[10] = 72;
  fidia[11] = 24;
  fidia[12] = 92;
  fidia[13] = 48;
  fidia[14] = 94;
  fidia[15] = 63;
  fidia[16] = 98;
  fidia[17] = 57;
  for (int i = 0; i < pls; i++) {
    Cpos[i] = 0;
  }
}

fidaki::~fidaki() {
  delete[] skales;
  delete[] fidia;
  delete[] Cpos;
}

unsigned short int fidaki::checkFor(unsigned short int blk, unsigned short int * dice) const {
  std::cout << "Isoun sto block " << blk << std::endl;
  if ((blk + * dice) > 100) {
    blk = 100 - ( * dice - (100 - blk));
    std::cout << "Perases to 100. Pigaineis pisw sto " << blk << ". ";
  } else {
    blk += * dice;
  }

  for (unsigned short int i = 0; i < 17; i += 2) {
    if (skales[i] == blk) {
      blk = skales[i + 1];
      std::cout << "Epeses panw se skala. Pigaineis sto " << skales[i + 1] << std::endl;
    }
    if (fidia[i] == blk) {
      blk = fidia[i + 1];
      std::cout << "Epeses panw se fidi. Kateveneis sto " << fidia[i + 1] << std::endl;
    }
  }
  std::cout << "Eisai sto block " << blk << " ." << std::endl;
  return blk;
}

void fidaki::UpPos(unsigned short int blk, unsigned short int pl) {
  Cpos[pl - 1] = blk;
}

unsigned short int fidaki::GetPos(unsigned short int pl) const {
  return Cpos[pl - 1];
}

unsigned short int fidaki::RollDice(void) const {
  srand(static_cast < unsigned int > (time(0)));
  unsigned short int j = ((rand() % 11) + 2);
  std::cout << "Ta zaria eferan " << j << std::endl;
  return j;
}

int main() {
  starting();
  unsigned short int players = sanitizePls();
  fidaki engine(players);
  userInterface user(players);
  user.GetNaSus();
  bool wined = false;
  unsigned short int dice = 0;

  while (!wined) {
    user.AnnPlayer();
    dice = engine.RollDice();

    engine.UpPos(engine.checkFor(engine.GetPos(user.WhoPlays()), & dice), user.WhoPlays());

    if (engine.GetPos(user.WhoPlays()) == 100) {
      std::cout << "\n\nO paixtis ";
      user.GetName(user.WhoPlays());
      std::cout << " nikise!" << std::endl;
      wined = true;
    }
    if (!wined) user.NextRound();
    dice = 0;
  }
  theend();
  return 0;
}

unsigned short int sanitizePls(void) {
  unsigned short int pls = 0;
  std::cout << "Posoi paixtes tha paiksoun(2-6): ";
  std::cin >> pls;
  while (pls < 2 || pls > 6) {
    std::cout << "\n" << "Dwsate lathos arithmo. Prospathiste ksana: ";
    std::cin >> pls;
  }
  return pls;
}
bool CkSp(std::string str) {
  if (str == "") return true;
  if (str == " ") return true;
  if (str == "  ") return true;
  if (str == "   ") return true;
  return false;
}

void theend(void) {
  std::cout << std::endl;
  std::cout << "+-+-+-+-+ +-+-+-+-+" << std::endl;
  std::cout << "|G|a|m|e| |O|v|e|r|" << std::endl;
  std::cout << "+-+-+-+-+ +-+-+-+-+" << std::endl;
  std::cin.get();
}

void starting(void) {
  std::cout << "****************************" << std::endl;
  std::cout << " _____ _     _       _    _ " << std::endl;
  std::cout << "|  ___(_) __| | __ _| | _(_)" << std::endl;
  std::cout << "| |_  | |/ _` |/ _` | |/ / |" << std::endl;
  std::cout << "|  _| | | (_| | (_| |   <| |" << std::endl;
  std::cout << "|_|   |_|\\__,_|\\__,_|_|\\_\\_|" << std::endl;
  std::cout << "                            " << std::endl;
  std::cout << "****************************" << std::endl;
  std::cout << "Made by Mitropoylos Spiros 2013" << std::endl;
  std::cout << " www.eyrhka.gr - cont@eyrhka.gr " << std::endl << std::endl;
}