[Programacion C] Juego Bolita

Comprad0r

Estoy en un pequeño problema sobre este programa en C, tengo el codigo en pseudocodigo pero al intentar implementarlo a C no consiguo hacerlo de la misma manera (cuando vuelva a casa pondré el codigo en C que tengo hecho hasta ese momento).

El minijuego consiste en establecer un punto en la pantalla ( dimensiones Fila 1 a 25 y Columna 1 y 80) y que se mueva hasta que pulse una tecla (en este caso 'q'), aunque lo más "complicado" seria el rebote cuando va a salirse.

Este seria mi codigo en papel:


#Include <Las librerias necesarias>

main(){

// Variables no puestas //

Escribir Posicion Inicial
Escribir Direcion de Movimiento

Do {

Escribir cursor
Escribir pelotita

// Calcular posicion siguiente //

if ( hay rebote) // Cambio de posicion //
{
F=F-incr;
C=C-incr;
}
else
{
F=F+incr;
C=C+incr;
}

borrar posicion anterior
Tiempo de Espera
}
While ( ( tecla1 == 'q') || ( tecla2 == 'q'))

}

Gracias por la ayuda y/o sugerencias :).

LOc0

Hará unos 5 años hice algo parecido -> http://www.hackvalue.org/descargas/boli.zip A lo mejor te ayuda (el código está muy poco comentado y bastante desordenado aunque no es muy extenso).

La idea es simple: hay un búffer (un char[]) que se va actualizando y repintando en pantalla X veces por segundo mediante un bucle. Además dentro de dicho bucle captura pulsaciones de teclas de forma asíncrona con kbhit() para cambiar la dirección del cursor, pausar, salir, etc...

Salu2 ;)

Comprad0r

Se agradece la ayuda :) , lo miraré mucho mejor cuando esté en casa y te comento.

B

como se nota que estan de examenes

MaKi

pseudocódigo by maki xD:

if(colisionVertical())
{
       incrementoX = -incrementoX;
}
else if(colisionHorizontal)
{
       incrementoY = -incrementoY;
}
x += incrementoX;
y += incrementoY;

edit:
corrijo, si quieres algo más real te puedo buscar la formula para calcular el angulo de reflexión, que lo implemente una vez por amor al arte : P

Comprad0r

LOc0 vi tu programa y me gusto pero para lo que necesito es demasiado xD, pero gracias :).

MaKi, tampoco necesito algo tan real (por curiosidad si) pero para el programa con hacer el rebote me sobra por el momento xD.

Las condiciones if y else, ?que quieres hacer exactamente con esa funcion? :O.

Thx! :).

bLaKnI

Cambia el signo de las variables de incremento de posicion.
Y mediante unas funciones de evaluación de colision, valida un IF u otro.

Prueba a buscar un framework limipo de cualquier asignatura de creación de videojuegos.
Tendras las funciones que necesitas, donde las necesitas.

Piensa que hay una estructura y jerarquia, que en caso de que las siguieras, te facilitarian enormemente el trabajo.

Has trabajado alguna vez con SDL? Te iria genial para gestionar todo lo que pides en un plis plas.
Tienes cierto nivel de programación?

Por si te interesa ahora, o por si te interesara mas adelante, te puedo pasar el lik a la web del bloque de prácticas de la assignatura que hice en mi universidad:

http://www.tecn.upf.edu/jagenjo/jocs.html <-- busca el "Framwork practicas" arriba del todo.

Mi profesor era Daniel Sanchez Crespo, director de Novarama (creadores de Fallen Lords).

Dentro de nada, Master! :)

JMBadBoy sabra de que hablo... (¿o no...?) xD

Saludos!

Comprad0r

Gracias bLaKnI, voy a ver tu link.

SDL no utilizo aunque me gustaria saber sobre ello, y según he visto seria lo mejor en este caso xD.

Gracias por la ayuda.

Lo que he visto, es que no es lo mismo un rebote el horizontal de la izquierda que el horizontal de la derecha, y esa es la unica duda que tengo.

Mas tarde pondré mi código en C para ver que me queda y los fallos.

Gracias a todos por todo.

Comprad0r

De momento lo tengo así:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>

void main(void)
{

int x,y,a,b,incrementox=1,incrementoy=1;
char salir;

printf ("Escribir variable X: ");
scanf ("%d", &x);


printf ("Escribir variable Y: ");
scanf ("%d", &y);
clrscr();

gotoxy(x,y);
printf ("*");

   //*Establecer movimiento*//



do{


gotoxy(x,y);
printf ("*");


 if ((y<0) || (y>80) )
 {
 incrementox = -incrementox;
 }
 else if ((x<0) || (x>25) )
 {
 incrementoy = -incrementoy;
 }
 x += incrementox;
 y += incrementoy;


salir=getch();


}
while ( (salir == 'q') && (salir == 'Q'));

}


Riu

jajaj la convocatoria de diciembre hace mella en el for :>>>

Comprad0r

Gracias por la ayuda Riu

spoiler
JuAn4k4

if ((y==0) || (y==80) )

else if ((x==0) || (x==25) )

Imagino que cuando llegues al lmite tendras que cambiar de direccion e ir hacia el otro lado, y no llegar al -1 / 81 , -1 / 26 ( Porque te saldrias ).

El math.h sobra, las variables a,b sobran tambien, hay un goto(x,y) ; printf("*"); duplicado.

Y deberias poner:

do{

#

printf(" ");

gotoxy(x,y);

printf ("*");

Para limpiar el rastro

Comprad0r

Si, esas cosa las modifiqué aunque no cambie algunas cosas cuando copié el codigo xD como las variables y tal.

Actualmente lo tengo así, me sale bien sin ningun problema aunque tengo que pulsar una tecla para que la "bolita" se mueva por toda la pantalla:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>

void main(void)
{

int x,y,incrementox,incrementoy;
char salir;

printf ("Escribir variable X: ");
scanf ("%d", &x);


printf ("Escribir variable Y: ");
scanf ("%d", &y);
clrscr();

gotoxy(x,y);
printf ("*");


incrementox = 1;
incrementoy = 1;

do{

 if ((y+incrementoy<=1) || (y+incrementoy>25) )
 {
 incrementoy = -incrementoy;

}
 else if ((x+incrementox<=1) || (x+incrementox>80) )
 {
 incrementox = -incrementox;

 }
 x += incrementox;
 y += incrementoy;

clrscr();
gotoxy(x,y);
printf ("*");


salir=getch();
printf("%c",salir);


}
while ( (salir != 'q') && (salir != 'Q'));

}
MTX_Anubis

if ((y+incrementoy<=1) || (y+incrementoy>25) )

{

incrementoy = -incrementoy;

#

}

else if ((x+incrementox<=1) || (x+incrementox>80) )

{

incrementox = -incrementox;

#

}

eso es así:

if ((y+incrementoy<=1) || (y+incrementoy>25) ) incrementoy = -incrementoy;
if ((x+incrementox<=1) || (x+incrementox>80) ) incrementox = -incrementox;

Tienes que hacer las dos comprobaciones, no una y si no se cumple, la otra. Si no, puede darse la situación de que se cumplan las dos y sólo corrijas la primera.

Comprad0r

Aunque sea muy dificil (o casi imposible) que ocurra, voy a cambiarlo para mejorar algo el codigo, gracias.

MaKi

si lo hicieras para linux podría ayudarte mucho más, pero en fins. En vez de getchar() para parar, que es una chapuza xD pon un sleep(1000/FPS) para dormir el proceso FPS veces por segundo, en el bucle principal de todo juego no puede haber nada bloqueante, que espera entrada/salida.

Entonces el problema te surge para finalizar la aplicación. Busca el equivalente a windows de captura de una señal de cierre para romper la condición del bucle principal y salir bien:
El pseudocódigo en linux es:

//Configuras la forma de atender las señales
signal(SIGINT , salir);
signal(SIGTERM , salir);

//callback de la señal SIGINT y SIGTERM (Ctrl + C o cerrar)
int salir(int c)
{
      salir = true;
}

//Entonces el bucle ya rompe y sale bien

while(!salir)
{
       actualizarDireccionVectorIncremento();
       sumasVectorIncremento();
       sleep(1000/FPS);
}

Me extraña que en tu uni te digan de usar conio.h que no es parte del estándar ANSI C

Un saludo

Usuarios habituales