Skip to content
Browse files

cleaning up vector types

  • Loading branch information...
1 parent 1159353 commit defcdd77bbee18ab8c188b45b0497d1f2142ea16 @jsoffer committed Mar 24, 2012
Showing with 66 additions and 116 deletions.
  1. +66 −116 domino.cc
View
182 domino.cc
@@ -1,4 +1,4 @@
-#include <unistd.h>
+# include <unistd.h>
#include <time.h>
#include <stdlib.h>
@@ -21,102 +21,46 @@ using namespace std;
//#define next(x) ((x+PLAYERS-1)%PLAYERS)
#define next(x) ((x+1)%PLAYERS)
-set <pair <int,int> > * fichas();
-pair <int,int> escogefifo(set <pair <int,int> > xs);
-int inicial(set <pair <int,int> > * xs);
-pair <int,int> actualiza(pair <int,int> x);
+typedef pair <int,int> intpair;
+typedef set <intpair> pairset;
+typedef vector <intpair> pairvector;
+
+void * worker (void *);
+pairset * fichas();
+intpair actualiza(intpair);
+int inicial(pairset *);
int islocked();
+int points(pairset);
+
+intpair escogefifo(pairset);
+
+/* Syncronization */
sem_t * mutexes;
pthread_mutex_t jugando;
-int points(set <pair <int,int> > xs);
+
+/* Shared resources */
int fin = 0;
int score[PLAYERS] = {0};
-// mesa
-vector <pair <int,int> > mesa;
-pair <int,int> punta = pair <int,int>(N-1,N-1); // inicial, para pegar el (6,6) verdadero del primer jugador
+pairvector mesa;
+intpair punta = intpair (N-1,N-1); // inicial, para pegar el (6,6) verdadero del primer jugador
+
+/* Arguments passed to the thread */
typedef struct {
int x;
- set <pair <int,int> > * xs;
- pair <int,int> (*fnc)(set <pair <int,int> >);
+ pairset * xs;
+ intpair (*fnc)(pairset);
} param;
-void * worker (void * arg){
- int offset = ((param *) arg) -> x;
- set <pair <int,int> > mano = *(((param *) arg) -> xs);
-
- // recibe la función "escoger" como parámetro
- // para que cada hilo tenga su propio AI
- pair <int,int> (*escoge)(set<pair<int, int> >) = ((param *) arg) -> fnc;
-
- struct timespec espera = {0};
- espera.tv_nsec= (random() % 1000000000);
- //espera.tv_nsec = 324545633;
-
- while(1){
-
- sem_wait(mutexes + offset);
-
- if(!(random()%6)){sleep(1);}
-
- // región crítica (para multi-metahilos)
-
- pthread_mutex_lock(&jugando);
- if (fin || islocked()) {
- cout << "[" << punta.first << " " << punta.second << "]" << endl;
- score[offset] = points(mano);
- pthread_mutex_unlock(&jugando);
- sem_post(mutexes + next(offset));
- break;
- }
- nanosleep(&espera,NULL);
- cout << "player" << offset;
- if(mano.empty()){ // no debe suceder, 'fin' debe finalizar antes
- cout << " vacío\n";
- pthread_mutex_unlock(&jugando);
- sem_post(mutexes + next(offset));
- break;
- } else {
- cout << " [" << punta.first << " " << punta.second << "] ";
- pair <int,int> t = escoge(mano);
- //mano.pop_back(); // si t, mano = retira(mano,t); otro, pass
- if( punta.first == t.first ||
- punta.second == t.second ||
- punta.first == t.second ||
- punta.second == t.first) {
- mano.erase(t); // si 'escoge' no decide, no lo encuentra, y no retira
- mesa.push_back(t);
- // modificar 'punta'
- punta = actualiza(t);
- cout << " " << " (" << t.first << "," << t.second << ")\n";
- } else {
- cout << " jugador " << offset << " pasa. " << endl;
- }
-
- if(mano.empty()){
- fin = 1;
- pthread_mutex_unlock(&jugando);
- sem_post(mutexes + next(offset));
- break;
- }
- }
- pthread_mutex_unlock(&jugando);
- // fin región crítica
-
- sem_post(mutexes + next(offset));
- //sleep(1);
- }
-
- return NULL;
-}
+/* Entry point */
int main() {
int i;
- set <pair <int,int> > * players;
- set <pair <int,int> > :: iterator it;
+ pairset * players;
+ pairset :: iterator it;
mutexes = new sem_t [PLAYERS];
for(i = 0; i < PLAYERS; ++i){
@@ -166,19 +110,19 @@ int main() {
return 0;
}
-set <pair <int,int> > * fichas() {
+pairset * fichas() {
int i, j;
time_t seed;
- set <pair <int,int> > * players;
+ pairset * players;
- players = new set <pair <int,int> > [PLAYERS];
+ players = new pairset [PLAYERS];
- vector <pair <int,int> > ys;
- vector <pair <int,int> > :: iterator it;
+ pairvector ys;
+ pairvector :: iterator it;
for(i = 0; i < N; ++i){
for(j = i; j < N; ++j){
- ys.push_back(pair<int,int>(i,j));
+ ys.push_back(intpair (i,j));
}
}
@@ -196,41 +140,20 @@ set <pair <int,int> > * fichas() {
return 0;
}
-pair <int,int> escogefifo(set <pair <int,int> > xs){
- if(xs.count(pair <int,int> (N-1,N-1))){return pair <int,int> (N-1,N-1);}
-
- set <pair <int,int> > candidatos;
- set <pair <int,int> > :: iterator it;
- for(it = xs.begin(); it != xs.end(); ++it){
- if(it->first == punta.first ||
- it->first == punta.second ||
- it->second == punta.first ||
- it->second == punta.second){
- candidatos.insert(*it);
- }
- }
-
- if(candidatos.empty()){
- return pair <int,int> (-1,-1);
- }
-
- /////////////////// EDITAR ALGORITMO AQUÍ ///////////////////////
- return *(candidatos.lower_bound(pair <int,int> (0,0)));
-}
-
-int inicial(set <pair <int,int> > * xs){
+int inicial(pairset * xs){
int i;
for(i = 0; i < PLAYERS; ++i){
- if ((xs+i)->count(pair <int,int> (N-1,N-1))){
+ if ((xs+i)->count(intpair (N-1,N-1))){
return i;
}
}
+
return -1; // no debe suceder
}
-int points(set <pair <int,int> > xs){
+int points(pairset xs){
int ret = 0;
- set <pair <int,int> > :: iterator it;
+ pairset :: iterator it;
for(it = xs.begin(); it != xs.end(); ++it){
ret += it->first;
ret += it->second;
@@ -239,9 +162,10 @@ int points(set <pair <int,int> > xs){
}
// requiere exclusión mutua
-pair <int,int> actualiza(pair <int,int> x){
+intpair actualiza(intpair x){
// en orden; en el futuro, definir de qué lado jugar doble opción
- pair <int,int> ret = punta;
+ // FIXME
+ intpair ret = punta;
if(punta.first == x.first || punta.second == x.first){
if(punta.first == x.first){
@@ -268,10 +192,36 @@ int islocked(){
izq = N;
der = N;
- for(vector <pair <int,int> > :: iterator it = mesa.begin(); it != mesa.end(); ++it){
+ for(intvector :: iterator it = mesa.begin(); it != mesa.end(); ++it){
if(it->first == punta.first || it->second == punta.first){ --izq; }
if(it->first == punta.second || it->second == punta.second){ --der; }
}
return (!(izq > 0 || der > 0));
}
+
+intpair escogefifo(pairset xs){
+
+ if(xs.count(intpair (N-1,N-1))){return intpair (N-1,N-1);}
+
+ pairset candidatos;
+ pairset :: iterator it;
+
+ for(it = xs.begin(); it != xs.end(); ++it){
+ if(it->first == punta.first ||
+ it->first == punta.second ||
+ it->second == punta.first ||
+ it->second == punta.second){
+ candidatos.insert(*it);
+ }
+ }
+
+ if(candidatos.empty()){
+ return intpair (-1,-1);
+ }
+
+ /////////////////// EDITAR ALGORITMO AQUÍ ///////////////////////
+
+ return *(candidatos.lower_bound(intpair (0,0)));
+}
+

0 comments on commit defcdd7

Please sign in to comment.
Something went wrong with that request. Please try again.