Jump to content
Sign in to follow this  
Elyst

Correcção de programa sobre ciclos

Recommended Posts

Elyst

Antes de mais gostava de dizer olá a  todos no forum. Já há algum tempo que tenho lido alguns posts por aqui muito interessantes...e agora surgiu a oportunidade e a necessidade de me registar e pedir uma ajudinha :cheesygrin:

É o seguinte, estou neste momento a estudar C em linux.

Sempre quis fazer um jogo que fosse uma espécie de duelo entre duas personagens tipo RPG.

Não tenho capacidades para tal ainda. Mas fazer um programa que regista-se uma pequena "luta" entre duas variáveis com valores gerados aleatoriamente parecia bem mais fácil.

Fiz então estes 2 programas:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


main ()

{
  int hp1, hp2, dmg1, dmg2;
srand(time(NULL));

  hp1=15;
  hp2=15;

        while(hp1!=0 || hp2!=0)
         {
           dmg1=rand() % 100;
           dmg2=rand() % 100;
           
           if(dmg1>dmg2)
               {hp2--;}
          else {hp1--;}
           printf("O jogador1 faz %d de dano.\n O jogador 2 faz %d de dano\n",dmg1,dmg2);
           printf("hp:\njog1:%d,\njog2:%d\n",hp1,hp2);
         }
     
}

/***************************************************************************** 
*O objectivo disto seria gerar um dmg1 e dmg2 aleatórios e depois subtraí-los ao hp1 e hp2        *
*conforme o maior. O programa também devia escrever os danos e o hp 1 e 2... mas ao compilar *
*isto entra num ciclo infinito e a unica forma de parar é fechando mesmo o computador...              *
*****************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


main ()

{
  int hp1, hp2, dano1, dano2;
srand(time(NULL));

  hp1=100;
  hp2=100;

        while(hp1!=0 || hp2!=0)
         {
           dano1=rand() % 100;
           dano2=rand() % 100;
           hp1-dano2=hp1;
           hp2-dano1=hp2;
           printf("O jogador1 faz %d de dano.\n O jogador 2 faz %d de dano\n",dano1,dano2);
           printf("hp:\njog1:%d,\njog2:%d\n",hp1,hp2);
         }
     
}

O Problema é que ao compilar estes 2 programas gera-se um ciclo interminável e não percebo bem porque...talvez algum pormenor que não me lembre sobre ciclos while...

Alguém me pode dar uma ajuda e apontar o erro e explicar como se deveria fazer isto direito?

Esqueci-me de dizer que sou novato nisto...mas acho que ao ver os programas acima já perceberam isso... 😳

Cumps. :D


“The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.”(Seymour Cray)

Share this post


Link to post
Share on other sites
mjamado

O while nunca acaba... :cheesygrin:

Imagina o seguinte cenário:

HP1 HP2 hp1!=0 || hp2!=0 Acção seguinte
2 2 true P1 perde
1 2 true P2 perde
1 1 true P1 perde
0 1 true P1 perde
-1 1 true P2 perde
-1 0 true P2 perde

E daqui para baixo, nunca mais acaba...  :cheesygrin:

A tua condição do while deveria ser (hp1>0) && (hp2>0), por dois motivos: em primeiro lugar, o ciclo só continua enquanto ambos tiverem "vida"; em segundo lugar, ao usar o "maior", em vez do "diferente", abres caminho a outras possibilidades, por exemplo, uma probabilidade de golpe crítico que tira 2 pontos em vez de apenas um (e esquivas-te a situações do tipo hp1 == 1; hp1 -= 2; hp1 == -1; hp1 != 0 (false))


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
Elyst

Didndn't thought this one through...

eu sabia que tinha feito um erro mesmo estúpido...só não sabia qual era  :wallbash:

obrigado, vou ver se faço as mudanças e ver se resulta.

o chato é que tenho de desligar o pc, ligar outra vez com o linux, fazer alterações e compilar...

Não há nenhum compilador que seja windows friendly? Já tentei o Dev C++ mas esse vai abaixo quando testo o programa...


“The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.”(Seymour Cray)

Share this post


Link to post
Share on other sites
IceBrain

Porque não instalas o Linux numa Virtual Machine, como a VirtualBox? Podes corrê-lo numa janela.

Quanto a compiladores para Windows, o DevC++ não é um compilador, é um IDE que vem com o mingw,  Mas já está algo obsoleto.

Experimenta o Code::blocks, também vem com o mingw, mas deve vir com uma versão mais recente, além de que o IDE é melhor (imo).


❝The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.❞- John Carmack on software patents

A list  of command line apps

Share this post


Link to post
Share on other sites
Elyst

Vou fazer isso. Já arranjei o VMWare...supostamente teria acesso a uma versão de estudante mas não encontrei isso no site...

Esse virtual Box é grátis? Tmb já descubro isso daqui a nada.

Em relação ao problema inicial ainda estou com outro problema de compilação  :cheesygrin:

while(hp1>0) && (hp2>0)

erro: expected identifier before ‘(’ token

while(hp1>0 && hp2>0)

erro: c:19: error: lvalue required as left operand of assignment
         c:20: error: lvalue required as left operand of assignment

Estou aqui com uns problemas com os parêntesis... de qualquer maneira ele dá erro... o pior é o 2o que nem percebo o que quer dizer...


“The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.”(Seymour Cray)

Share this post


Link to post
Share on other sites
Baderous

O ciclo leva parêntesis à volta da condição global. O erro do lvalue deve-se a isto:

hp1-dano2=hp1;

hp2-dano1=hp2;

Share this post


Link to post
Share on other sites
daj

O VMWare Player é gratuito http://www.vmware.com/products/player/ e tem as funcionalidades suficientes para criares e executares máquinas virtuais.

Já reparei que raramente se recomenda o Visual Studio Express (ou apenas o Visual C++ Express) para desenvolvimento C e C++ em Windows, dando sempre sugestões para os lados do Dev C++. Alguma desvantagem do Visual Studio no vosso ponto de vista que o torne não recomendável?

http://www.microsoft.com/express/Downloads/#2010-Visual-CPP

Vou fazer isso. Já arranjei o VMWare...supostamente teria acesso a uma versão de estudante mas não encontrei isso no site...

Esse virtual Box é grátis? Tmb já descubro isso daqui a nada.

Share this post


Link to post
Share on other sites
Elyst

O ciclo leva parêntesis à volta da condição global. O erro do lvalue deve-se a isto:

hp1-dano2=hp1;

hp2-dano1=hp2;

Bem me parecia quanto aos parêntesis.

Não sei é o que tá mal no erro do lvalue... supostamente ele devia subtrair o dano2 ao hp1 e atribuir o resultado ao hp1...


“The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.”(Seymour Cray)

Share this post


Link to post
Share on other sites
daj

Em C,

x = y;

Afecta o valor da expressão y na variável x, e não ao contrário.

Não faz sentido,

hp1-dano2=hp1;
hp2-dano1=hp2;

deveria ser:

hp1=hp1-dano2;
hp2=hp2-dano1;

Bem me parecia quanto aos parêntesis.

Não sei é o que tá mal no erro do lvalue... supostamente ele devia subtrair o dano2 ao hp1 e atribuir o resultado ao hp1...

Share this post


Link to post
Share on other sites
Elyst

Em C,

x = y;

Afecta o valor da expressão y na variável x, e não ao contrário.

Não faz sentido,

hp1-dano2=hp1;
hp2-dano1=hp2;

deveria ser:

hp1=hp1-dano2;
hp2=hp2-dano1;

Ah bom... então é isso... pensei que 2+2=4 ou 4=2+2 era a mesma coisa. Mas pelos visto em C não é assim.

Ok, mt obrigado. Agr o programa já deve funcionar mas ainda vou testar com as modificações.

mais uma vez mt obrigado e um grande abraço  :cheesygrin:


“The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.”(Seymour Cray)

Share this post


Link to post
Share on other sites
daj

Sugeria evitar pensar nessa instrução como uma igualdade matemática porque depois essa analogia falha em coisas dessas. Sendo uma atribuição é necessário saber qual é a variável de destino, que em C é a expressão que está à esquerda do = (o tal lvalue, left value). Se não houvesse uma ordem definida, haveriam casos ambíguos como, por exemplo,

int x = 1;
int y = 2;

x = y;

Estou a afectar x com o valor de y (que é 2) ou estou a afectar y com o valor de x (que é 1)?

Boa continuação de trabalho.

Share this post


Link to post
Share on other sites
mjamado
Sendo uma afectação...

Pá, já tenho uns anos valentes desta gaita, e é a primeira vez que vejo um termo em Português que se aplica perfeitamente a este operador (e sim, tenho um problema com atribuição, não curto nada).

Amanhã, no escritório, já vai ser um tal afectação para ali, afectação para acolá...  :cheesygrin:

Hey, admins, para quando o "Gosto disto", hein?  :cheesygrin:


"Para desenhar um website, não tenho que saber distinguir server-side de client-side" - um membro do fórum que se auto-intitula webdesigner. Temo pelo futuro da web.

Share this post


Link to post
Share on other sites
Elyst

Obrigado pela ajuda, o programa já está a funcionar. Não consegui impedir que os números ficassem negativos no final sem gerar um ciclo infinito novamente (não percebo porquê 🤔)

Creio que este link funcione: http://codepad.org/QMtsSqTk

Isto é de um compilador online que descobri (já instalei o VMWare e dá para correr o unbutu sem problemas...ainda restam uns mini problemas mas isso são coisas complicadas de explicar e resolvem-se sacando o .iso do ubuntu)

Obg mais uma vez a todos,

Cumps e boas afectações a todos :D


“The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.”(Seymour Cray)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.