Last Update: 03/20/2020 10:25:33
As seguintes tarefas devem ser entregues (através do github) até ao dia 20 de Março às 20h00:
A primeira tarefa desta semana é tornar o repositório Github privado. Para isso deverão fazer os seguintes passos:
<UC><Turno><Nº de grupo>Por exemplo, nomes de repositórios válidos são LA1PL1G5 ou LI2PL7G9.
Vamos criar um conjunto de regras para o Slack
<UC>PL<Nº do Turno>g<Nº de grupo com dois algarismos>Eis uma lista dos docentes:
Pretende-se que crie a documentação do código. Essa documentação poderá ser obtida através do comando Doxygen. Para obter a documentação:
doxygen -g para gerar o ficheiro de configuraçãodoxygen para gerar a documentação.De cada vez que se corre o comando doxygen, são geradas duas pastas: html e latex. Entra-se na pasta html e abre-se o ficheiro index.html.
Segue-se um exemplo de um ficheiro dados.h com os comentários para obter a documentação:
/**
@file dados.h
Definição do estado e das funções que o manipulam
*/
#ifndef ___DADOS_H___
#define ___DADOS_H___
#define BUF_SIZE 1024
/**
\brief Tipo de dados para os erros
*/
typedef enum {
OK,
COORDENADA_INVALIDA,
JOGADA_INVALIDA,
ERRO_LER_TAB,
ERRO_ABRIR_FICHEIRO,
} ERROS;
/**
\brief Tipo de dados para a casa
*/
typedef enum {
UM = '1',
DOIS = '2',
VAZIO = '.',
BRANCA = '*',
PRETA = '#'
} CASA;
/**
\brief Tipo de dados para as coordenadas
*/
typedef struct {
int coluna;
int linha;
} COORDENADA;
/**
\brief Tipo de dados para a jogada
*/
typedef struct {
COORDENADA jogador1;
COORDENADA jogador2;
} JOGADA;
/**
\brief Tipo de dados para as jogadas
*/
typedef JOGADA JOGADAS[32];
/**
\brief Tipo de dados para o estado
*/
typedef struct {
/** O tabuleiro */
CASA tab[8][8];
/** As jogadas */
JOGADAS jogadas;
/** O número das jogadas, usado no prompt */
int num_jogadas;
/** O jogador atual */
int jogador_atual;
/** O nº de comando, usado no prompt */
int num_comando;
/** A coordenada da última jogada */
COORDENADA ultima_jogada;
} ESTADO;
/**
\brief Muda o valor de uma casa
@param e Apontador para o estado
@param c A coordenada
@param V O novo valor para a casa
*/
void set_casa(ESTADO *e, COORDENADA c, CASA V);
/**
\brief Devolve o valor de uma casa
@param e Apontador para o estado
@param c A coordenada
@returns O valor da casa
*/
CASA get_casa(ESTADO *e, COORDENADA c);
/**
\brief Inicializa o valor do estado
Esta função inicializa o valor do estado. Isso implica o tabuleiro ser colocado na posição inicial e todos os campos do estado estarem com o valor por omissão.
@returns O novo estado
*/
ESTADO *inicializar_estado();
#endif
Um prompt deve permitir ao utilizador saber o estado do jogo, quantos comados foram introduzidos, quem é o jogador atual e qual é a jogada atual. No exemplo dado abaixo, o implementador optou por colocar
# <número de comandos> PL<1 ou 2 conforme o jogador> (<número da jogada atual>)>
Segue-se um exemplo de um extrato da interação com o jogo:
8 .......2
7 ........
6 ........
5 ....*...
4 ........
3 ........
2 ........
1 1.......
abcdefgh
# 01 PL1 (0)> d4
8 .......2
7 ........
6 ........
5 ....#...
4 ...*....
3 ........
2 ........
1 1.......
abcdefgh
# 02 PL2 (1)> d5
8 .......2
7 ........
6 ........
5 ...*#...
4 ...#....
3 ........
2 ........
1 1.......
abcdefgh
# 03 PL1 (1)> c5
8 .......2
7 ........
6 ........
5 ..*##...
4 ...#....
3 ........
2 ........
1 1.......
abcdefgh
# 04 PL2 (2)> c6
8 .......2
7 ........
6 ..*.....
5 ..###...
4 ...#....
3 ........
2 ........
1 1.......
abcdefgh
# 05 PL1 (2)> b5
8 .......2
7 ........
6 ..#.....
5 .*###...
4 ...#....
3 ........
2 ........
1 1.......
abcdefgh
# 06 PL2 (3)>
Não precisam de seguir exatamente o que se optou aqui mas pretende-se que o prompt seja informativo e tenha, no mímino, a indicação do jogador e do número da jogada.
Pretende-se que implemente o resto das funcionalidades da jogada, nomeadamente:
Pretende-se que adicione mais comandos ao intepretador:
Tanto o comando gr como o ler recebem um argumento: o nome do ficheiro.
Os comandos gr e ler não precisam de ser implementados na totalidade. Por agora pede-se que o programa só crie o ficheiro com o tabuleiro. A informação relativa às jogadas pode ficar para depois.
Eis as system calls necessárias para criar um ficheiro:
Relembro que escrever:
printf("ola\n");
É o mesmo que escrever:
fprintf(stdout, "ola\n");
E por isso pretende-se que reutilizem a função que imprime o tabuleiro para o comando que grava o tabuleiro. Tal implica algo tão simples como substituir printf por fprintf por exemplo. Segue-se um tutorial para ficheiros, mas existem outros.