Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Hola, quisiera que me recomendarais algun programa, gratuito si es posible, para compilar y programar en c, y saber si se puede hacer programas en c, que ademas de escribir texto en pantalla pueda manejar graficos, crear entorno grafico propio y similares (como los entornos graficos de un videojuego) y como se puede programar que se muestren imagenes en pantalla con c. Igualmente agradeceria cualquier referencia a manuales lo mas completos posibles sobre programacion en c, preferiblemente en castellano.
Gracias por cualquier ayuda que me podais ofrecer.
También lo puedes hacer con funciones c, en este caso para DevCpp. Un ejemplo muy sencillote y rápido:
#include <stdio>
#include <stdlib>
int main(int argc, char *argv[])
{
int cont, seguir, teclaPulsada;
char tecla;
cont=0;
seguir=1;
teclaPulsada=0;
while (seguir)
{
sleep(500);
printf ("Aun no has pulsado ninguna tecla...rn");
teclaPulsada=kbhit();
if (teclaPulsada!=0 || cont>10)
seguir=0;
else
cont++;
}
if (teclaPulsada!=0)
{
tecla=getch();
printf ("Pulsaste la tecla [%c]rn", tecla);
}
else
printf ("No pulsaste ninguna tecla...rn");
printf ("Pulsa una tecla para finalizarrn", tecla);
getch();
return 0;
}
ranganok, gracias por el enlace, no consegui hacer lo de leer la interrupcion como ponia en el enlace, leyendo la direccion 0x60, no sabia como leer direcciones de memoria y asignarla a un puntero directamente era algo que no me dejo el compilador, pero busque por internet y encontre la forma de hacerlo con la funcion kbhit de conio.h, pero aun asi, si sabes de algun enlace que esplique de forma mas detallada lo de leer direciones, te lo agradeceria, porque me parecio interesante igual que se lee informacion de la memoria con punteros por ejemplo, poder hacer algo parecido con el teclado.
Voy a trabajar en el snake con kbhit.
Hola, tengo echo casi medio snake, pero me he encontrado con la cuestión de como hacer que la comida salga en lugares aleatorios, para que no salga siempre en el mismo sitio, ¿como puedo conseguir en C números verdaderamente aleatorios?
Hola, ya tengo acabado el snake, lo unico es que como usando srand para definir la semilla para los numeros aleatosrios, pasandole como argumento clock siempre me salia la comida al principio en el mismo sitio, por lo que ademas de clock, intentando medir el tiempo desde que defino la variable tiempo, hasta srand, junto con teclas presionadas libremente por el usuario, para intentar que los numeros sean algo mas aleatorios. De resto, funciona bien por lo que lo he podido probar, lo he probado en ordenadores con distinto procesador y la velocidad maxima de la serpiente se ve algo limitada segun el procesador. Para borrar la pantalla y que no salga linea tras linea, he usado system("cls"), pero con ella la pantalla parece parpadear. La forma de puntuar he echo que dependa de que tipo de comida se coja, uno que da un punto y otro que raramente deberia salir y que da puntos en funcion del tamaño de la serpiente.
¿Como se pueden conseguir numeros, si no verdaderamente aleatorios, al menos mas aleatorios que con rand?
¿Como puedo limpiar la pantalla de forma mas eficiente que system("cls"), para que no se vea ese parpadeo al borrar y escribir?
¿que os parece el snake?
Codigo del snake:
#include <stdlib>
#include <stdio>
#include <conio>
#include <time>
/*Estructura para guardar cada punto de la serpiente para la correcta eliminacion de la cola*/
typedef struct serpiente{
int x, y;
struct serpiente *siguiente;
struct serpiente *anterior;
} serpiente;
/*Comprueba el teclado y devuelve el caracter leido o 0*/
char teclado();
main(){
/*Se inicia la pantalla de juego*/
register int i=1, j=1;
int pantalla[50][50];
for(i=1; i<50; i++){
for(j=1; j<50>x=26;
cabeza->y=27;
cola->siguiente= (serpiente *) NULL;
cola->x=26;
cola->y=26;
cola->anterior=cabeza;
cabeza->siguiente=cola;
register int direccion=1, udireccion=1, cax=26, cay=27, cox=26, coy=26;
/*puntero auxiliar con el que recorer la lista doble de la serpiente*/
serpiente *auxiliar;
/*Variable para contar los puntos conseguidos*/
unsigned long int puntos=0;
/*el tipo de comida comido para añadir los puntos correspondientes*/
register int comidaapuntuar;
/*lleva la cuenta de los segmentos de serpiente (aumenta en 1 cada vez que come e inicialmente vale 2)*/
unsigned int tamanoserpiente=2;
/*velocidad en segundos para mover la serpiente y actualizar el juego*/
float velocidad= 1;
/*bucle de juego*/
register unsigned long int tiempo;
tiempo= clock();
/*Se inicia la semilla para numeros aleatorios para la comida*/
printf("Pulsa dos teclas cualquiera para iniciar el juego.");
srand(((clock()-tiempo)+getch())*(getch() + 5));
register int e=1;
char tecla;
while(e>=1){
/*se muestra en pantalla el juego si es distinto*/
if(e==1){
system("cls");
for(j=1; j<52; j++){
printf("_");
}
printf("n");
for(i=1; i<50; i++){
printf("|");
for(j=1; j<50; j++){
switch(pantalla[j]){
case 1: printf("O");
break;
case 2: printf("*");
break;
case 3: printf("#");
break;
case 0: printf(" ");
break;
default: printf(" ");
break;
}
}
printf("|n");
}
for(j=1; j<52>= velocidad){
tiempo= clock();
/*comprobando si hay alguna tecla pulsada, y cual*/
tecla= teclado();
if(tecla != 0){
/*Comprobando tecla pulsada*/
switch(tecla){
case 'z': direccion=1;
break;
case 's': direccion=2;
break;
case 'w': direccion=3;
break;
case 'a': direccion=4;
break;
case 'q': e=0;
break;
case 'e': printf("nPulsa cualquier tecla para volver al juego.n");
getch();
break;
default: printf("nTecla incorrecta; para salir, q; para pausar la partida, e; para arriba, w; para abajo, z; para la derecha, s y para la izquierda, a.nPulse una tecla para continuar el juego.n");
getch();
break;
}
/* comprobando que direccion no va en sentido contrario que udireccion para evitar mordeduras accidentales*/
if((direccion == 1 && udireccion == 3) || (direccion == 3 && udireccion == 1) || (direccion == 2 && udireccion == 4) || (direccion == 4 && udireccion == 2)){
direccion= udireccion;
}
else{
udireccion= direccion;
}
/* se traga cualquier pulsacion pendiente que quede, eliminando las pulsaciones multiples para la siguiente ejecucion del bucle*/
while(tecla != 0){
tecla= teclado();
}
/*Rompiendo el bucle si pulso q para salir*/
if(e==0){
break;
}
}
/*Actualizando juego*/
/* comprobando choque con muros*/
if(cax == 0 || cay == 0 || cax == 50 || cay == 50){
printf("Has chocado con el muro.n");
e=0;
break;
}
else{
/* comprobando que no se muerde*/
if((direccion == 1 && pantalla[cay+1][cax] == 1) || (direccion == 2 && pantalla[cay][cax+1] == 1) || (direccion == 3 && pantalla[cay-1][cax] == 1) || (direccion == 4 && pantalla[cay][cax-1] == 1)){
printf("Te has mordido.n");
e=0;
break;
}
else{
/* Como no ha chocado ni mordido se comprueba si tiene la comida delante y se la come*/
auxiliar= (serpiente *) NULL;
auxiliar= (serpiente *) malloc(sizeof(serpiente));
if(auxiliar == NULL){
printf("Memoria insuficiente para continuar la ejecucion.n");
e=0;
break;
}
if(direccion == 1 && pantalla[cay+1][cax] >= 2 && pantalla[cay+1][cax] <= 3 && cay <49>y=cay+1;
auxiliar->x=cax;
comidaapuntuar= pantalla[cay+1][cax];
pantalla[cay+1][cax]= 1;
comidap--;
}
else{
if(direccion == 2 && pantalla[cay][cax+1] >= 2 && pantalla[cay][cax+1] <=3 && cax <49>y=cay;
auxiliar->x=cax+1;
comidap--;
comidaapuntuar= pantalla[cay][cax+1];
pantalla[cay][cax+1]= 1;
}
else{
if(direccion == 3 && pantalla[cay-1][cax] >= 2 && pantalla[cay-1][cax] <3>= 1){
auxiliar->y=cay-1;
auxiliar->x=cax;
comidap--;
comidaapuntuar= pantalla[cay-1][cax];
pantalla[cay-1][cax]= 1;
}
else{
if(direccion == 4 && pantalla[cay][cax-1] >= 2 && pantalla[cay][cax-1] <3>= 1){
auxiliar->y=cay;
auxiliar->x=cax-1;
comidap--;
comidaapuntuar= pantalla[cay][cax-1];
pantalla[cay][cax-1]= 1;
}
else{
/* al no haber comido, se libera auxiliar por no haberse utilizado y se pone auxiliar a null*/
free(auxiliar);
auxiliar= (serpiente *) NULL;
}
}
}
}
/* se comprueba si ha comido para añadir el segmento de cuerpo*/
if(auxiliar != NULL){
auxiliar->siguiente=cabeza;
cabeza->anterior=auxiliar;
cabeza=auxiliar;
cay=cabeza->y;
cax=cabeza->x;
/* se incrementa el contador del tamaño de la serpiente*/
tamanoserpiente++;
/* Se incrementa la puntuacion*/
switch(comidaapuntuar){
case 3: puntos= puntos + floor((tamanoserpiente / ((rand() % 5)+1)));
break;
default: puntos++;
break;
}
}
/* Se comprueba que hayga comida, si no hay comida se pone*/
while(comidap == 0){
comidax= (rand() % 49)+1;
comiday= (rand() % 49)+1;
if(pantalla[comiday][comidax] == 0){
if((rand() % 21) == 10 || tamanoserpiente == 10 || tamanoserpiente == 100 || tamanoserpiente == 500 || tamanoserpiente == 1000 || tamanoserpiente == 1500 || tamanoserpiente == 2000){
pantalla[comiday][comidax]= 3;
}
else{
pantalla[comiday][comidax]= 2;
}
comidap= 1;
icomida= 0;
break;
}
else{
if(icomida > 2500){
printf("Pulsa dos teclas cualquiera para continuar el juego.");
srand(((clock()-tiempo)+getch())*(getch() + 5));
}
}
}
/* fin de la comprobacion de comida*/
}
}
/* fin de la comprobacion de choques, mordeduras y comida*/
/*avance de la serpiente*/
/* avanzando la cabeza*/
if(direccion == 1){
cay++;
}
else{
if(direccion == 2){
cax++;
}
else{
if(direccion == 3){
cay--;
}
else{
if(direccion == 4){
cax--;
}
}
}
}
/* actualizando la posicion de cada segmento de cuerpo de la serpiente, empezando por la cola*/
auxiliar=cola;
while(auxiliar != cabeza){
auxiliar->x= auxiliar->anterior->x;
auxiliar->y= auxiliar->anterior->y;
auxiliar= auxiliar->anterior;
}
cabeza->x=cax;
cabeza->y=cay;
pantalla[cay][cax]= 1;
/* avanzando la cola*/
pantalla[coy][cox]= 0;
coy=cola->y;
cox=cola->x;
/*fin de avance de la serpiente*/
/*comprobacion del tamaño de la serpiente para ajustar la velocidad*/
switch(tamanoserpiente){
case 5: velocidad=0.6;
break;
case 10: velocidad=0.4;
break;
case 20: velocidad=0.2;
break;
default: break;
}
e=1;
}
else{
e=2;
}
}
printf("nnFin del juegon");
getch();
return 0;
}
char teclado(){
if(kbhit()){
char t;
t= getch();
return t;
}
else{
return 0;
}
}
Editado por garrocha para poner las etiquetas de codigo
lacabra25, usa la etiqueta code para poner código dentro de los post.
En vez de usar cls borra únicamente el ultimo punto de la serpiente. Para la semilla utiliza el reloj del sistema (fecha y hora actual) y no el clock() que te da el tiempo desde que has iniciado el programa (creo).
S2
Ranganok Schahzaman