• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Skazi

[C++] Ajuda para codificar RPG

5 mensagens neste tópico

Boas, sou newbie em c++ e tenho sérias dificuldades ao trabalhar com classes! O meu grande problema é que tenho um projecto para fazer pra escola em que tenho que codificar um rpg. O enunciado é o seguinte:

“Aventura” é um jogo onde cada jogador controla um conjunto de aventureiros que exploram o fantástico território de Xabulon, combatendo monstros terríveis e descobrindo tesouros escondidos.

O jogo desenrola-se por turnos: cada jogador dá um conjunto de ordens ao seu grupo de aventureiros, e essas ordens são cumpridas antes dos outros jogadores/grupos terem a oportunidade de fazer o mesmo.

Os aventureiros de Xabulon possuem as seguintes características:

Pontos de Vida (PV) Quando chega a zero, a personagem é eliminada (sepertencer a um grupo é removida desse grupo).

Defesa (DEF) Capacidade de evitar danos.

Ataque Distante (ATD) Capacidade de infligir danos à distância.

Ataque (AT) Capacidade de combater corpo a corpo.

Experiência (EXP) Experiência ganha a combater e explorar o mundo.

Nível (N) Característica calculada em função da experiência

(EXP/100 +1). Influencia a eficácia do aventureiro, determinando o número de ataques em cada combate.

Em cada turno, o jogador deverá dar apenas uma ordem a cada um dos seus grupos que será cumprida imediatamente, passando-se em seguida para outro grupo, até dar a volta a todos os grupos.

Os grupos não controlados pelo(s) jogador(es) são controlados por uma IA (inteligência artificial) da mesma forma que um jogador controla os seus grupos.

Os grupos que possuem controladores diferentes são considerados inimigos mútuos (um controlador pode controlar mais do que um grupo).

O mundo de Xabulon pode ser visto como um imenso quadriculado. Em cada instante um grupo encontra-se numa determinada posição (quadrícula). O grupo pode movimentar-se em 8 direcções (N, S, E, O, NE, NO, SE, SO). Em geral um grupo pode-se deslocar para qualquer posição adjacente, segundo uma das 8 direcções, desde que esta posição não esteja ocupada.

As ordens que podem ser dadas a um grupo são:

DESCANSAR: O grupo permanece na mesma posição e todos os elementos do grupo recuperam naturalmente das suas feridas (+1 PV se o total de PV for menor do que o máximo).

MOVE (N/S/E/O/NE/NO/SE/SO): Move o grupo na direcção indicada. Não é possível deslocar-se para uma região na qual já se encontra outro grupo. No entanto, caso esse seja um grupo inimigo, inicia-se o combate com ele, sem se deslocar.

Morte de membros do grupo: Sempre que um elemento de um grupo é reduzido a 0 PV, é destruído. Quando o grupo é reduzido a 0 elementos, é destruído e removido do jogo.

Combate:

O combate processa-se nas seguintes etapas:

• Combate à distância: Os aventureiros com capacidade de ataque à distância (ATD) >0 têm direito a N ataques (durante cada turno/jogada desse grupo). A ordem de ataque é dada apenas uma vez nessa jogada. Os alvos de cada ataque são seleccionados aleatoriamente entre todos os membros do grupo adversário. O combate à distância dura enquanto houver aventureiros que ainda não esgotaram o seu número de ataques.

• Combate corpo a corpo: Os aventureiros com capacidade de ataque corpo a corpo (AT) >0 têm direito a N ataques. Os alvos de cada ataque são seleccionados aleatoriamente entre todos os membros do grupo adversário. Tal como o combate à distância, o combate corpo a corpo dura enquanto houver aventureiros que ainda não esgotaram o seu número de ataques.

O combate à distância e combate corpo a corpo são resolvidos de forma análoga, sendo simplesmente considerada como força de ataque o valor ATD no primeiro caso, e AT no segundo. Os aventureiros que têm capacidade para ambas as etapas do combate (ATD > 0 e AT > 0) utilizam o valor N (que depende de EXP), independentemente de o terem esgotado numa delas.

O combate é resolvido escolhendo alternadamente, de cada um dos grupos, um combatente que ainda tem a possibilidade de efectuar um ataque (o primeiro combatente é escolhido do grupo defensor).

Sempre que um combatente aplica o golpe final a um adversário, deve ganhar 1 ponto de experiência. Qualquer combatente aniquilado deve ser imediatamente removido do grupo e combate.

Exemplo:

O grupo 1 ataca o grupo 2.

Grupo 1

“Zé”                  (AT=5, ATD=0, PV=4, DEF=6, N=2)

“Ambrósio”        (AT=0, ATD=1, PV=2, DEF=2, N=1)

“Guilhermino”    (AT=0, ATD=1, PV=2, DEF=1, N=2)

Grupo 2

“Óscar” (AT=1, ATD=5, PV=3, DEF=4, N=5)

Neste caso, durante a fase de combate à distância, apenas o Ambrósio, Guilhermino e o Óscar iriam intervir. O primeiro teria direito a um ataque (N=1), enquanto que o segundo tem direito a 2 ataques (N=2) e por fim o Óscar terá direito a 5 (N=5). Como o Óscar pertence ao grupo atacado, terá o privilégio de desferir o primeiro ataque.

Consideramos que nenhum dos intervenientes morre durante os ataques deste exemplo.

Possível ordem do ataque na fase de combate à distância:

1º - Óscar (5 ataques no total, 1 efectuado)

2º - Guilhermino (2 ataques no total, 1 efectuado)

3º - Óscar (5 ataques no total, 2 efectuados)

4º - Guilhermino (2 ataques no total, 2 efectuados)

5º -Óscar (5 ataques no total, 3 efectuados)

6º - Ambrósio (1 ataque no total, 1 efectuado)

7º - Óscar (5 ataques no total, 4 efectuados)

8º - Óscar (5 ataques no total, 5 efectuados)

Outra possibilidade seria:

1º - Óscar (5 ataques no total, 1 efectuado)

2º - Guilhermino (2 ataques no total, 1 efectuado)

3º - Óscar (5 ataques no total, 2 efectuados)

4º - Ambrósio (1 ataque no total, 1 efectuado)

5º - Óscar (5 ataques no total, 3 efectuados)

6º - Guilhermino (2 atques no total, 2 efectuados)

7º - Óscar (5 ataques no total, 4 efectuados)

8º - Óscar (5 ataques no total, 5 efectuados)

Depois de esgotada a fase de combate à distância, processa-se a fase de combate corpo a corpo.

Neste caso, apenas o Zé e o Óscar iriam intervir. O primeiro teria direito a 2 ataques (N=2), enquanto que o segundo tem direito a 5 ataques (N=5). Como o Óscar pertence ao grupo atacado, terá o privilégio de desferir o primeiro ataque.

Consideramos que nenhum dos intervenientes morre durante os ataques deste exemplo.

Ordem do ataque na fase de combate corpo a corpo:

1º - Óscar (5 ataques no total, 1 efectuado)

2º - Zé (2 ataques no total, 1 efectuado)

3º - Óscar (5 ataques no total, 2 efectuados)

4º - Zé (2 ataques no total, 2 efectuados)

5º - Óscar (5 ataques no total, 3 efectuados)

6º - Óscar (5 ataques no total, 4 efectuados)

7º - Óscar (5 ataques no total, 5 efectuados)

Cálculo do dano

O dano efectuado por cada ataque é calculado da seguinte forma:

Se a força de ataque for maior do que a defesa do alvo, então são feitos AT(D)-DEF pontos de dano. Caso a defesa seja superior, então cada ataque tem uma probabilidade de AT(D)/DEF de fazer 1 ponto de dano. Estes pontos de dano devem ser subtraídos ao montante total de PV dos aventureiros atacados. Os aventureiros em que o valor de PV seja reduzido a 0 ou menos,  serão imediatamente eliminados.

Exemplo:

O alvo do ataque do Óscar é o Ambrósio. A força do ataque à distância do primeiro é de (ATD=5), sendo a defesa do segundo dada por DEF=2. O Ambrósio perde 5-2=3 PV e é imediatamente eliminado porque tem PV=2. O Óscar ganha um ponto de EXP. Em seguida, o Guilhermino vai atacar o Óscar para vingar a morte do seu amigo Ambrósio. O seu poder de ataque é ATD=1 e a defesa do Óscar é de DEF=4. Isto significa que o Guilhermino tem ¼ =25% de probabilidade de conseguir infligir 1 ponto de dano ao Óscar.

Controladores

O conceito de controlador é bastante importante. É usado não só para representar quem controla as acções um determinado grupo, como também para determinar as diversas facções e inimizades entre os diversos grupos. É importante perceber que um controlador pode controlar um ou vários grupos distintos, e que estes podem ser usados para obter diferentes efeitos:

P. Ex:

- O mesmo jogador pode controlar 2 grupos diferentes.

- Um jogador poderá, por exemplo, assumir o controlo temporário de um grupo inimigo.

Deve construir uma IA de serviços mínimos (ou seja, que consiga dar ordens aos seus grupos, mesmo que perca quase sempre). Isto significa uma IA que, pelo menos, ataque adversários que lhe estão adjacentes (e não ataca amigos). É obvio que podem ser consideradas muitas opções adicionais: perseguir adversários, fugir, descansar de forma inteligente, etc. mas não é fundamental.

Será que alguem me pode ajudar a construir as classes? Tou mesmo a nora, agradecia imenso alguma ajuda.

Cumprimentos e bons programas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Cheira-me que não vais ter muito sucesso assim... Chapares assim todo esse texto.... Ninguém o vai ler!  :P

É melhor ires postando as tuas dúvidas sempre que surgirem pois nós cá estaremos para ajudar. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Reduzi um pouco o tamanho, o problema é que a minha dificuldade é mesmo a declaração das classes, não consigo sequer começar!

Brigadão.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não devias ter primeiro uma cadeira de programação?!

É que fazer logo uma coisa destas é entrar um bocado á força pela medeira!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem vindo ao fórum Skazi

Bem, programar C++ é programar com classes.

Se não percebes como funciona as classes, vai a secção dos tutoriais C++:Portugal-a-Programar | Tutoriais e experimenta cumprir algumas pequenas metas do projecto (começa do mais simples para o mais complicado).

Conforme vão surgindo dúvidas sobre o desenvolvimento do projecto, posta aqui que nós ajudamos.

O teu projecto é muito complexo, só se existir alguém interessado em fazer também isso, só assim é que se metia nesse projecto contigo (as probabilidades são muito baixas).

Cumpr. bk@ero

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora