• Nenhum resultado encontrado

Programação I. 2º Semestre 2013/2014 3º Trabalho. DATA DE ENTREGA: 23 DE Junho DE 2014

N/A
N/A
Protected

Academic year: 2021

Share "Programação I. 2º Semestre 2013/2014 3º Trabalho. DATA DE ENTREGA: 23 DE Junho DE 2014"

Copied!
5
0
0

Texto

(1)

3 º Trabalho de Programação I 1 / 5

Programação I

2º Semestre 2013/2014

3º Trabalho

DATA DE ENTREGA: 23 DE Junho DE 2014

Introdução

Neste trabalho, os alunos adquirem prática de utilização da matéria dada durante o semestre. Desenvolve-se uma abordagem estruturada (top-down) ao desenvolvimento de programas organizados em funções.

Cada grupo entregará no site da sua turma um documento (com extensão docx, doc ou pdf) que descreva a solução encontrada para cada exercício, assim como os ficheiros fonte das respetivas soluções, devidamente comentados, comprimidos num ficheiro (com extensão zip, rar, gz, etc.).

É valorizada a simplicidade das soluções que cumpram o enunciado e a construção do código organizado em funções que minimizem a existência de código repetido.

Enquadramento

Neste trabalho será utilizada uma biblioteca que permite o desenho de formas gráficas nomeadamente linhas, triângulos, rectângulos e círculos. O conjunto completo das funções de desenho é apresentado no final deste enunciado. A biblioteca e os ficheiros de include, com as respectivas instruções de instalação, são fornecidas em anexo. São também fornecidos alguns programas exemplo.

A seguir apresenta-se um programa que ilustra a utilização da biblioteca, apresentando a figura anexa o resultado da sua execução (o programa termina quando se fechar a consola gráfica criada):

Em geral, para compilar um programa que usa a biblioteca deverá usar o seguinte comando: gcc –Wall –std=c99 –o programa programa.c -lpg

// ficheiro de include necessário

#include "pg/graphics.h" int main() {

// chamada necessária para iniciação da biblioteca

graph_init();

// desenho de um triângulo dados os pontos dos vértices. // O penúltimo argumento indica a côr e o último que o // triângulo é desenhado “a cheio”

graph_triangle(150, 300, 450, 300, 300, 50, c_green, true);

// desenho de um segundo triângulo dados os pontos dos vértices, // a cor e com desenho “a cheio”

graph_triangle(150, 150, 450, 150, 300, 400, c_green, true);

// chamada necessária para correcto refrescamento da consola gráfica

graph_start();

return 0; }

(2)

Eventos

Esta biblioteca permite executar código quando ocorre uma das seguintes três situações: um evento de teclado, um evento de rato ou um evento de temporização (por cada período de tempo previamente definido).

Como exemplo de utilização de eventos (de temporização) , o programa seguinte mostra na consola de texto um relógio digital (HH:MM:SS):

No final do enunciado são detalhadas as definições da biblioteca (constantes, tipos e funções) relacionadas com eventos.

Objectivos

São apresentadas a seguir três alternativas de trabalho, ordenadas por ordem crescente de cotação.

Opção A (para 12 Valores)

Pretende-se desenvolver um programa que permita jogar o jogo do galo para dois jogadores humanos. Cada vez que ocorra um

click de rato numa área do tabuleiro ainda vazia, a área é

preenchida com a jogada do jogador corrente. O programa determina após cada jogada se há situação de vitória ou empate e termina nesse caso, afixando na consola de texto o jogador vencedor ou a indicação de empate. Em anexo é fornecido executável (tictactoe1) que demonstra a funcionalidade pretendida e o aspeto desejado, replicado na figura ao lado.

#include <stdio.h> #include “pg/graphics.h” int hours, minuts, secs;

// handler de evento de temporização

void myTimerHandler() { secs++;

if (secs == 60) { secs = 0;

minuts++;

if (minuts == 60 ) hours = (hours + 1) % 60; }

printf(“%02d:%02d:%02d\r”, hours, minuts, secs);

fflush(stdout); // esta função força os caracteres a serem escritos na consola }

int main() {

graph_init();

// regista a função “myTimerHandler” // para ser chamada em cada segundo

graph_regist_timer_handler(myTimerHandler, 1000); graph_start();

return 0; }

(3)

3 º Trabalho de Programação I 3 / 5

Opção B (para 15 Valores)

Tal como na alternativa anterior, pretende-se desenvolver um programa que permita jogar o jogo do galo para dois jogadores humanos. A diferença relativamente à alternativa anterior consiste na diferença do aspecto gráfico, mais elaborado. Pretende-se que o programa seja desenvolvido em duas fases: em primeiro lugar deverá criar uma função para desenhar paralelogramos com a seguinte assinatura:

void graph_paralelogram( int x, int y, int w, int h, int x0, RGB color, bool fill); A função permite desenhar paralelogramos, ocupando uma

área de comprimento w e altura h. Os parâmetros x, y indicam o canto superior esquerdo dessa área. As bases são sempre rectas horizontais. O valor absoluto do parâmetro x0 indica a dimensão das bases. Se x0 é positivo, a base superior começa em (x, y). Se x0 é negativo, a base superior começa em x+ w -abs(x0). O argumento fill indica, se

true, que o paralelogramo deve ser desenhado a cheio ou, se false, apenas o contorno. A cor de desenho é a indicada em

color. As figuras ao lado ilustram o pretendido.

Numa segunda fase, construa a nova interface gráfica, usando função graph_paralelogram para desenhar o símbolo cruz. Em anexo é fornecido executável (tictactoe2) que demonstra a funcionalidade pretendida e o aspeto desejado, replicado na figura ao lado.

Opção C (para 20 Valores)

Pretende-se desenvolver um programa que permite jogar o dos quatro em linha para dois jogadores humanos. Cada vez que ocorra um click de rato numa coluna do tabuleiro ainda não cheia, o buraco superior da coluna é preenchido com a jogada do jogador corrente. O programa determina após cada jogada se há situação de vitória ou empate e termina nesse caso, afixando ou o jogador vencedor na consola de texto ou a indicação de empate. Em anexo é fornecido executável (4inline) que demonstra a funcionalidade pretendida e o aspeto desejado, replicado na figura ao lado.

(4)

Apêndice A –

Definições e funções de desenho (excerto de graphics.h) /* Dimensões da janela gráfica */

#define GRAPH_WIDTH 640 #define GRAPH_HEIGHT 480 /*cores pré-definidas */ const RGB c_white; const RGB c_gray; const RGB c_dgray; const RGB c_cyan; const RGB c_black; const RGB c_orange; const RGB c_lightblue; const RGB c_red; const RGB c_green; const RGB c_blue; /* funções */

// returns an rgb color from their components

RGB graph_rgb(short r, short g, short b);

// initializes the graphics. Must be called first

int graph_init();

// draws a pixel at position with specified color

void graph_pixel(short x, short y, RGB color);

// draws a line at position with specified color

void graph_line(short x1, short y1, short x2, short y2, RGB color);

// draws a circle at position with specified color, filled or not

void graph_circle(short x0, short y0, short radius, RGB color, bool toFill);

// draws a rect at position with specified color, filled or not

void graph_rect(short x0, short y0, short w, short h, RGB color, bool toFill);

// draws a ellipse at position with specified color, filled or not

void graph_ellipse(short x0, short y0, short xr, short yr, RGB color, bool toFill);

// draws a round rectangle at position with specified color, filled or not

void graph_round_rect(short x0, short y0, short w, short h, RGB color, bool toFill);

// draws a triangle at position (x0,y0) with specified color, filled or not

int graph_triangle2(int x0, int y0, int a, int b, int c, RGB color, bool toFill);

// draws a triangle given his points (x0,y0), (x1,y1), (x2,y2) // with specified color, filled or not

void graph_triangle(int x0, int y0, int x1, int y1, int x2, int y2, RGB color, bool toFill );

// start the event loop

void graph_start();

// stop the event loop

(5)

3 º Trabalho de Programação I 5 / 5

Apêndice B –

Definições e funções relacionados com eventos de teclado, rato e temporização

/*

* constantes associadas a eventos de rato */

// campo type de MouseEvent

#define MOUSE_MOTION_EVENT 1 #define MOUSE_BUTTON_EVENT 2

// campo button de MouseEvent

#define BUTTON_LEFT 1 #define BUTTON_RIGHT 2

// campo state de MouseEvent

#define BUTTON_PRESSED 1 #define BUTTON_RELEASED 2 #define BUTTON_CLICK 4 typedef struct MouseEvent {

int type; /* mouse motion or mouse button event type */ byte state; /* button pressed or released */

int button; /* which button is pressed */ ushort x, y; /* coordinates of the mosue */ short dx, dy; /* delta move when mouse motion */ } MouseEvent;

/*

* KEYBOARD Events constants */

// campo state de KeyEvent

#define KEY_PRESSED 0 #define KEY_RELEASED 1

typedef struct KeyEvent {

int state; /* key pressed or released */ ushort keysym; /* key scan code */

ushort unicode; /* unicode result from key combination (ex- SHIFT "a" gives "A" */ } KeyEvent;

// tipos que representam a assinatura das funções que tratam eventos typedef void (*KeyEventHandler)(KeyEvent *ke);

typedef void (*MouseEventHandler)(MouseEvent *me); typedef void (*TimerEventHandler)();

/* funções para registar as funções que processam eventos */ // Regist the keyboard event handler

void graph_regist_key_handler(KeyEventHandler ke);

// Regist the mouse event handler

void graph_regist_mouse_handler(MouseEventHandler me);

// Regist the timer event handler

void graph_regist_timer_handler(TimerEventHandler te, uint period);

Referências

Documentos relacionados

nesta nossa modesta obra O sonho e os sonhos analisa- mos o sono e sua importância para o corpo e sobretudo para a alma que, nas horas de repouso da matéria, liberta-se parcialmente

O objetivo do curso foi oportunizar aos participantes, um contato direto com as plantas nativas do Cerrado para identificação de espécies com potencial

3.3 o Município tem caminhão da coleta seletiva, sendo orientado a providenciar a contratação direta da associação para o recolhimento dos resíduos recicláveis,

Neste estudo foram estipulados os seguintes objec- tivos: (a) identifi car as dimensões do desenvolvimento vocacional (convicção vocacional, cooperação vocacio- nal,

Os dados referentes aos sentimentos dos acadêmicos de enfermagem durante a realização do banho de leito, a preparação destes para a realização, a atribuição

De acordo com o Consed (2011), o cursista deve ter em mente os pressupostos básicos que sustentam a formulação do Progestão, tanto do ponto de vista do gerenciamento

Janaína Oliveira, que esteve presente em Ouagadougou nas últimas três edições do FESPACO (2011, 2013, 2015) e participou de todos os fóruns de debate promovidos

Neste tipo de situações, os valores da propriedade cuisine da classe Restaurant deixam de ser apenas “valores” sem semântica a apresentar (possivelmente) numa caixa