197 lines
5.0 KiB
C++
197 lines
5.0 KiB
C++
|
#include <iostream>
|
||
|
#include <vector>
|
||
|
#include <algorithm>
|
||
|
#include <stdexcept>
|
||
|
|
||
|
using namespace std;
|
||
|
|
||
|
#include "tournament.h"
|
||
|
#include "restaurant.h"
|
||
|
#include "io.h"
|
||
|
|
||
|
ostream & operator<<(ostream & os, vector<restaurant> & v) {
|
||
|
for(auto i: v) {
|
||
|
os << i << endl;
|
||
|
}
|
||
|
return os;
|
||
|
}
|
||
|
|
||
|
ostream & operator<<(ostream & os, tournament & t){
|
||
|
os << "[";
|
||
|
for(unsigned int i = 0; i < t.restaurants.size(); i++) {
|
||
|
if(i == t.restaurants.size() - 1) {
|
||
|
os << t.restaurants[i];
|
||
|
}
|
||
|
else {
|
||
|
os << t.restaurants[i]<< " ,";
|
||
|
}
|
||
|
}
|
||
|
os << "]";
|
||
|
return os;
|
||
|
}
|
||
|
|
||
|
bool tournament::populate_restaurants(string filename) {
|
||
|
try {
|
||
|
restaurants = parse_file(filename);
|
||
|
return true;
|
||
|
}
|
||
|
catch(runtime_error e) {
|
||
|
cerr << e.what() << endl;
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool tournament::already_in(string name) {
|
||
|
for(unsigned int i = 0; i < restaurants.size(); i++) {
|
||
|
if(restaurants[i].name == name) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
void tournament::add_restaurants() {
|
||
|
string name;
|
||
|
int score = 0;
|
||
|
cout << "name" << endl;
|
||
|
cin.ignore();
|
||
|
getline(cin, name);
|
||
|
if(not already_in(name)) {
|
||
|
restaurants.push_back(restaurant(name, score));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void tournament::remove_restaurants() {
|
||
|
string name;
|
||
|
cout << "name" << endl;
|
||
|
cin.ignore();
|
||
|
getline(cin, name);
|
||
|
if(already_in(name)) {
|
||
|
for(unsigned int i = 0; i < restaurants.size(); i++) {
|
||
|
if(restaurants[i].name == name){
|
||
|
restaurants.erase(restaurants.begin() + i);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void tournament::shuffle() {
|
||
|
random_shuffle(restaurants.begin(), restaurants.end());
|
||
|
}
|
||
|
|
||
|
int round_counter(int current_size) {
|
||
|
int round;
|
||
|
if(current_size == 32) {
|
||
|
round = 5;
|
||
|
}
|
||
|
if(current_size == 16) {
|
||
|
round = 4;
|
||
|
}
|
||
|
else if(current_size == 8) {
|
||
|
round = 3;
|
||
|
}
|
||
|
else if(current_size == 4) {
|
||
|
round = 2;
|
||
|
}
|
||
|
else if(current_size == 2) {
|
||
|
round =1;
|
||
|
}
|
||
|
return round;
|
||
|
}
|
||
|
|
||
|
int match_counter(int current_size) {
|
||
|
int match;
|
||
|
if(current_size == 32) {
|
||
|
match = 16;
|
||
|
}
|
||
|
if(current_size == 16) {
|
||
|
match = 8;
|
||
|
}
|
||
|
else if(current_size == 8) {
|
||
|
match = 4;
|
||
|
}
|
||
|
else if(current_size == 4) {
|
||
|
match = 2;
|
||
|
}
|
||
|
else if(current_size == 2) {
|
||
|
match =1;
|
||
|
}
|
||
|
return match;
|
||
|
}
|
||
|
|
||
|
bool tournament::start_tournament(){
|
||
|
if(not verify_size()) {
|
||
|
cout << "not 2^n" << endl;
|
||
|
return false;
|
||
|
}
|
||
|
bool temp_bool = true;
|
||
|
bool tourn_running = true;
|
||
|
cin.ignore();
|
||
|
string name;
|
||
|
int match = match_counter(restaurants.size());
|
||
|
int round = round_counter(restaurants.size());
|
||
|
int current_round = 1;
|
||
|
vector<restaurant> temp_array;
|
||
|
while(tourn_running == true) {
|
||
|
int current_match = 1;
|
||
|
temp_bool = true;
|
||
|
cin.ignore();
|
||
|
for(unsigned int i = 0; i < restaurants.size(); i += 2) {
|
||
|
while(temp_bool == true) {
|
||
|
cout << "which restaurant: " << restaurants[i] << " or " << restaurants[i + 1] << endl;
|
||
|
cout << "match " << current_match << "/" << match << " Round "
|
||
|
<< current_round << "/" << round << endl;
|
||
|
getline(cin, name);
|
||
|
if(name == restaurants[i].name or name == restaurants[i + 1].name) {
|
||
|
if(name == restaurants[i].name) {
|
||
|
restaurants[i].score++;
|
||
|
temp_array.push_back(restaurants[i]);
|
||
|
losers.push_back(restaurants[i+1]);
|
||
|
}
|
||
|
else {
|
||
|
restaurants[i+1].score++;
|
||
|
temp_array.push_back(restaurants[i + 1]);
|
||
|
losers.push_back(restaurants[i]);
|
||
|
}
|
||
|
temp_bool = false;
|
||
|
current_match++;
|
||
|
}
|
||
|
else {
|
||
|
cout << "invalid response " << name << endl;
|
||
|
}
|
||
|
}
|
||
|
temp_bool = true;
|
||
|
}
|
||
|
while(temp_bool == true) {
|
||
|
for(unsigned int i = 0; i < temp_array.size(); i++) {
|
||
|
restaurants[i] = temp_array[i];
|
||
|
}
|
||
|
for(unsigned int i = 0; i < temp_array.size(); i++){
|
||
|
restaurants.pop_back();
|
||
|
}
|
||
|
if(restaurants.size() == 1) {
|
||
|
losers.push_back(restaurants[0]);
|
||
|
cout << "this is the winner " << restaurants[0] << endl;
|
||
|
restaurants = losers;
|
||
|
return true;
|
||
|
}
|
||
|
else {
|
||
|
cout << "next round of tournament" << endl;
|
||
|
temp_bool = false;
|
||
|
}
|
||
|
}
|
||
|
temp_array.clear();
|
||
|
match = match/2;
|
||
|
current_round++;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
bool tournament::verify_size() {
|
||
|
int r = restaurants.size();
|
||
|
if(r == 2 or r == 4 or r == 8 or r == 16 or r == 32 or r == 64) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|