From 3f02df869688a0dc474fa8c025e85a0953525b70 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Crist=C3=B3v=C3=A3o=20Cruz?= Date: Sun, 28 Mar 2010 17:46:27 +0100 Subject: [PATCH] Preliminary version. To be deleted. --- funnysort.c | 224 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ intento | 2 + 2 files changed, 226 insertions(+) create mode 100644 funnysort.c create mode 100644 intento diff --git a/funnysort.c b/funnysort.c new file mode 100644 index 0000000..4e407c8 --- /dev/null +++ b/funnysort.c @@ -0,0 +1,224 @@ +/* funnysort.c */ +#include +#include +#include +#include +#include + +#include "congl.h" + +#define LARGURA 40 +#define ALTURA 20 +#define NITERA 100 + +typedef enum {A,VAZIO} cubo_t; + +struct tabuleiro_s { + cubo_t cubo[LARGURA][ALTURA]; + //pthread_mutex_t mutex[LARGURA][ALTURA]; +} tabuleiro; + +void imprimir_tabuleiro(void) +{ + int r, s; + + conglClearScreen(); + conglMoveCursor(1, 1); + + for (r = 0; r < ALTURA; ++r) { + for (s = 0; s < LARGURA; ++s) { + switch(tabuleiro.cubo[r][s]) { + case A: + conglSetBg(congl_red); + conglDrawChar(' '); + break; + case VAZIO: + conglSetBg(congl_white); + conglDrawChar(' '); + break; + } + } + conglSetBg(congl_black); + printf("\n"); + } + +} + +int ordenador (void) +{ + int itera; + cubo_t cubo, cubo_outro; + int x, x_outro; + int y, y_outro; + + /* inicializa a posição inicial a um valor aleatório */ + x = random()%LARGURA; + y = random()%ALTURA; + + conglSetFg(congl_green); + conglMoveCursor(x+1, y+1); + conglDrawChar('@'); + + for (itera = 0; itera <= NITERA; ++itera) { + /* anda aleatoriamente até encontrar um cubo */ + cubo = VAZIO; + while (cubo == VAZIO) { + /* tenta pegar num cubo */ + + conglSetBg(congl_white); + conglMoveCursor(x+1, y+1); + conglDrawChar(' '); + //pegar_cubo(x, y, &cubo); + //if (cubo == VAZIO) { + /* não conseguiu pegar no cubo */ + /* tenta-se mexer para uma nova posição sem cubo */ + do { + x_outro = (x+(random()%3)-1)%LARGURA; + y_outro = (y+(random()%3)-1)%ALTURA; + ler(x_outro, y_outro, &cubo_outro); + conglSetFg(congl_green); + conglMoveCursor(x_outro+1, y_outro+1); + conglDrawChar('@'); + sleep(1); + } while (cubo_outro != VAZIO); + x = x_outro; + y = y_outro; + //} + conglSetFg(congl_green); + conglMoveCursor(x+1, y+1); + conglDrawChar('@'); + //printf("Posição do ordenador: %d, %d.\n", x, y); + sleep(1); + } + + /* anda aleatoriamente até encontrar um cubo da mesma cor */ + //while (cubo != VAZIO) { + // /* tenta pousar o cubo */ + // pousar_cubo(x, y, &cubo); + // if (cubo != VAZIO) { + // /* não conseguiu pousar o cubo */ + // /* tenta-se mexer para uma nova posição sem cubo */ + // do { + // x_outro = (x+1)%LARGURA; + // y_outro = (y+1)%ALTURA; + // ler(x_outro, y_outro, &cubo_outro); + // } while (cubo_outro != VAZIO); + // x = x_outro; + // y = y_outro; + // } + //} + + //imprimir_tabuleiro(); + } + + return 0; +} + +int pegar_cubo (int x, int y, cubo_t *cubo) +{ + assert (x >= 0 && x < LARGURA); + assert (y >= 0 && y < ALTURA); + + int xnovo, ynovo; + int r, s; + + /* tenta adquirir o cubo */ + for (r = -1; (r <= 1) && (*cubo != VAZIO); ++r) { + for (s = -1; (s <= 1) && (*cubo != VAZIO); ++s) { + if ((r != 0) && (s != 0)) { + xnovo = (x+r)%LARGURA; + ynovo = (y+s)%ALTURA; + //pthread_mutex_lock(&(tabuleiro.mutex[xnovo][ynovo])); + if(tabuleiro.cubo[xnovo][ynovo] != VAZIO) { + *cubo = tabuleiro.cubo[xnovo][ynovo]; + tabuleiro.cubo[xnovo][ynovo] = VAZIO; + //pthread_mutex_unlock(&(tabuleiro.mutex[xnovo][ynovo])); + /* adquiriu o cubo */ + return 0; + } + //pthread_mutex_unlock(&(tabuleiro.mutex[xnovo][ynovo])); + } + } + } + + /* se não conseguir segue viagem */ + + return 0; +} + +int pousar_cubo (int x, int y, cubo_t *cubo) +{ + assert (x < LARGURA); + assert (y < ALTURA); + + int xnovo, ynovo; + int r, s; + + /* tenta pousar o cubo */ + //pthread_mutex_lock(&(tabuleiro.mutex[x][y])); + for (r = -1; (r <= 1) && (*cubo != VAZIO); ++r) { + for (s = -1; (s <= 1) && (*cubo != VAZIO); ++s) { + if ((r != 0) && (s != 0)) { + xnovo = (x+r)%LARGURA; + ynovo = (y+s)%ALTURA; + //pthread_mutex_lock(&(tabuleiro.mutex[xnovo][ynovo])); + if(tabuleiro.cubo[xnovo][ynovo] == *cubo) { + tabuleiro.cubo[xnovo][ynovo] = *cubo; + *cubo = VAZIO; + /* pousou o cubo */ + } + //pthread_mutex_unlock(&(tabuleiro.mutex[xnovo][ynovo])); + } + } + } + //pthread_mutex_unlock(&(tabuleiro.mutex[x][y])); + + /* se não conseguir segue viagem */ + + return 0; +} + +int ler (int x, int y, cubo_t *cubo) +{ + assert (x < LARGURA); + assert (y < ALTURA); + + *cubo = tabuleiro.cubo[x][y]; + + return 0; +} + +int main (int argc, char *argv[]) +{ + /* inicializar o gerador de números aleatórios */ + srandom((unsigned int)time(NULL)); + + int coiso; + int r, s; + + /* preparar o tabuleiro */ + for (r = 0; r < LARGURA; ++r) { + for (s = 0; s < ALTURA; ++s) { + coiso = random()%10; + switch (coiso) { + case 0: + tabuleiro.cubo[r][s] = A; + break; + default: + tabuleiro.cubo[r][s] = VAZIO; + break; + } + } + } + + imprimir_tabuleiro(); + /* lançar ordenadores */ + ordenador(); + + /* o programa termina quando o utilizador premir uma tecla */ + getchar(); + conglReset(); + + exit(0); +} + diff --git a/intento b/intento new file mode 100644 index 0000000..d670724 --- /dev/null +++ b/intento @@ -0,0 +1,2 @@ +Programa com vários fios de execução que trata de juntar vários objectos +coloridos em grupos com a mesma cor, recorrendo a algoritmos simples. -- 2.11.4.GIT