Beispiel #1
0
/** @ingroup test
 *  @brief Teste les positions
 *
 */
void test_position(void)
{
	assert(position_est_valide(position(0, 0, 19)));
	assert(! position_est_valide(POSITION_INVALIDE));

	int taille = 19;
	int max = taille - 1;
	(void) max;
#define TEST(dir, x, y) position_est_valide(position_##dir( position(x, y, taille)))

	assert(!TEST(gauche, 0, 0));
	assert(TEST(droite, 0, 0));
	assert(!TEST(haut, 0, 0));
	assert(TEST(bas, 0, 0));

	assert(TEST(gauche, max, 0));
	assert(!TEST(droite, max, 0));
	assert(!TEST(haut, max, 0));
	assert(TEST(bas, max, 0));

	assert(TEST(gauche, max, max));
	assert(!TEST(droite, max, max));
	assert(TEST(haut, max, max));
	assert(!TEST(bas, max, max));

	assert(!TEST(gauche, 0, max));
	assert(TEST(droite, 0, max));
	assert(TEST(haut, 0, max));
	assert(!TEST(bas, 0, max));
#undef TEST
}
Beispiel #2
0
s_Coup cli_convertir_coup(const Partie partie, const char* str, bool* valide)
{
	(void) partie;

	int taille = plateau_get_taille(partie->plateau);
	s_Coup coup = str2coup(str, taille, valide);
	if (*valide) {
		if (! position_est_valide(coup.position)) {
			*valide = false;
		}
	}
	return coup;
}
Beispiel #3
0
static void event_jouer(struct state* state, SDL_Event event)
{
	struct jouerdata* jouer = state->data;
	utiliser_event_textinput(jouer->nom_partie, event);
	if (jouer->nom_partie->active) {
		afficher_sauvegarder(jouer);
		return; // ne pas interférer entre la saisie et les raccourcis claviers
	}
	if (event.type == SDL_MOUSEMOTION) {
		jouer->hovered = get_position_depuis_ecran(jouer, event.motion.x, event.motion.y);
	} else if (event.type == SDL_MOUSEBUTTONUP) {
		int b = event.button.button;
		if (b == 1) {
			Position pos = get_position_depuis_ecran(jouer, event.motion.x, event.motion.y);
			if (position_est_valide(pos)) {
				s_Coup coup = {pos};
				partie_jouer_coup(jouer->partie, coup);
				afficher_sauvegarder(jouer);
			}
		} else if (b == 2) {
			s_Coup coup;
			coup.position = POSITION_INVALIDE;
			partie_jouer_coup(jouer->partie, coup);
			afficher_sauvegarder(jouer);
		} else if (b == 4) {
			partie_annuler_coup(jouer->partie);
			afficher_sauvegarder(jouer);
		} else if (b == 5) {
			partie_rejouer_coup(jouer->partie);
			afficher_sauvegarder(jouer);
		}
	} else if (event.type == SDL_KEYDOWN) {
		if (event.key.keysym.sym == SDLK_p) {
			s_Coup coup = {POSITION_INVALIDE};
			partie_jouer_coup(jouer->partie, coup);
			afficher_sauvegarder(jouer);
		} else if (event.key.keysym.sym == SDLK_a) {
			partie_annuler_coup(jouer->partie);
			afficher_sauvegarder(jouer);
		} else if (event.key.keysym.sym == SDLK_r) {
			partie_rejouer_coup(jouer->partie);
			afficher_sauvegarder(jouer);
		}
	}
	utiliser_event_bouton(jouer->passer_son_tour, event);
	utiliser_event_bouton(jouer->sauvegarder, event);
	utiliser_event_bouton(jouer->retour_menu, event);
}
Beispiel #4
0
Territoire determiner_territoire(Plateau plateau, Position position)
{
	Territoire territoire = creer_ensemble_colore(VIDE);
	EnsemblePosition territoire_positions = ensemble_colore_positions(territoire);

	EnsemblePosition possibles = creer_ensemble_position();
	Couleur couleur = VIDE;
	bool couleur_connue = false;

	ensemble_position_ajouter(possibles, position);

	/// @todo remplacer par une pile.
	while (!ensemble_position_vide(possibles)) {
		Position courante = ensemble_position_supprimer_tete(possibles);

		Couleur c = plateau_get_at(plateau, courante);
		if (c == VIDE) {
			if (!territoire_appartient(territoire, courante)) {
				ensemble_position_ajouter(territoire_positions, courante);

				const Position a_tester[] = {
					position_gauche(courante),
					position_droite(courante),
					position_haut(courante),
					position_bas(courante),
				};
				for (int p = 0; p < 4; p++) {
					if (position_est_valide(a_tester[p]))
						ensemble_position_ajouter(possibles, a_tester[p]);
				}
			}
		} else {
			// si la case n'est pas vide, elle est à coté du territoire
			// on regarde sa couleur
			if (!couleur_connue) { // le territoire n'a pas encore de couleur défini
				couleur = c;
				couleur_connue = true;
			} else if (couleur != c) // le territoire est entouré par deux couleurs différentes
				couleur = VIDE;
		}
	}

	ensemble_colore_set_couleur(territoire, couleur);
	detruire_ensemble_position(possibles);
	return territoire;
}
Beispiel #5
0
static void afficher_jouer(struct state* state, SDL_Surface* surface)
{
	struct jouerdata* jouer = state->data;
	Partie partie = jouer->partie;
	int taille = jouer->taille;

	int x1 = W * .2;
	int y1 = H * .2;
	int w = MAX(W * .8 - x1, H * .8 - y1);
	w -= w % (taille);
	int pixel_par_case = w / (taille);
	int interbordure = 2;
	int bordure = (w - pixel_par_case * (taille - 1)) / 2;

	// bois
	set_color(240, 174, 95);
	draw_rect(surface, x1, y1, w, w);

	// dessin des interbordures
	set_color(30, 30, 30);
	for (int x = 0; x < taille; x++) {
		draw_rect(surface,
		          x1 + bordure + x * pixel_par_case - interbordure / 2,
		          y1 + bordure,
		          interbordure, pixel_par_case * (taille - 1));
	}
	for (int y = 0; y < taille; y++) {
		draw_rect(surface,
		          x1 + bordure,
		          y1 + bordure + y * pixel_par_case - interbordure / 2,
		          pixel_par_case * (taille - 1), interbordure);
	}

	int taille_stone = taille == 9 ? 30 : taille == 13 ? 24 : 16;
	int taille_stone2 = taille_stone / 4;
	Position hov = jouer->hovered;
	Chaine chaine = position_est_valide(hov) ?
	                plateau_determiner_chaine(partie->plateau, hov) : NULL;
	Libertes libertes = chaine ? determiner_libertes(partie->plateau, chaine) : NULL;
	EnsemblePosition yeux = chaine ? lesYeuxDeLaChaine(chaine, partie->plateau) : NULL;
	for (int x = 0; x < taille; x++) {
		for (int y = 0; y < taille; y++) {
			Position pos = position(x, y, taille);
			Couleur c = plateau_get(partie->plateau, x, y);
			bool draw = false;
			if (c != VIDE) {
				if (c == BLANC) {
					set_color(210, 210, 210);
				} else {
					set_color(40, 40, 40);
				}
				draw = true;
			} else if (position_est_valide(hov) && hov.x == x && hov.y == y) {
				if (partie->joueur_courant == JOUEUR_BLANC) {
					set_color(240, 240, 240);
				} else {
					set_color(20, 20, 20);
				}
				draw = true;
			}
			int marge = (taille == 9 ? 2 : 3);
			if (draw) {
				// affichage de la pierre
				int sx, sy;
				get_position_vers_ecran(jouer, x, y, &sx, &sy);
				sx -= taille_stone / 2;
				sy -= taille_stone / 2;
				draw_rect(surface, sx, sy, taille_stone, taille_stone);
			} else if ((get_marge(x, taille) == marge || x == taille / 2)
					&& (get_marge(y, taille) == marge || y == taille / 2)) {
				// affichage du hoshi
				int sx, sy;
				get_position_vers_ecran(jouer, x, y, &sx, &sy);
				set_color(0, 0, 0);
				draw_rect(surface, sx - 3, sy - 3, 6, 6);
			}

			// affichage d'indicateurs d'aide
			draw = false;
			if (chaine && gosh_appartient(chaine, pos)) {
				set_color(120, 120, 120);
				draw = true;
			} else if (yeux && gosh_appartient(yeux, pos)) {
				set_color(255, 130, 130);
				draw = true;
			} else if (libertes && gosh_appartient(libertes, pos)) {
				set_color(200, 40, 40);
				draw = true;
			}
			if (draw) {
				int sx, sy;
				get_position_vers_ecran(jouer, x, y, &sx, &sy);
				sx -= taille_stone2 / 2;
				sy -= taille_stone2 / 2;
				draw_rect(surface, sx, sy, taille_stone2, taille_stone2);
			}
		}
	}
	if (chaine)
		detruire_chaine(chaine);
	if (libertes)
		detruire_libertes(libertes);
	if (yeux)
		detruire_ensemble_position(yeux);

	if (!partie->finie) {
		if (partie_en_cours_de_handicap(partie)) {
			afficher_label(surface, jouer->handicap);
		} else {
			afficher_label(surface, jouer->au_tour_de[partie->joueur_courant]);
		}
	} else {
		afficher_label(surface, jouer->partie_finie);
		afficher_label(surface, jouer->score);
	}
	afficher_bouton(surface, jouer->retour_menu);
	afficher_bouton(surface, jouer->passer_son_tour);
	afficher_textinput(surface, jouer->nom_partie);
	afficher_bouton(surface, jouer->sauvegarder);
}