miércoles, 13 de noviembre de 2013

Programemos un juego en C




Aunque en el encabezado he puesto que este blog habla de programación, realmente solo he publicado el juego que hice y las entradas sobre programación en Basic, creo que va siendo hora de hablar un poco de programación, y que mejor que un juego para ello, como ya he publicado INFERNO, que desarrollé en Basic para el Spectrum, y que un amigo ha pasado al Basic del MSX (uno de estos días lo pondré por aquí, en cuanto me acuerde), vamos a escribirlo de nuevo, pero esta vez usando C estándar, que siempre fue mi lenguaje favorito y por desgracia hace años que no toco, hoy día los objetos son la base pero un poco de programación a la antigua nunca bien mal.

Uno de los grandes de la informática es Donald Knuth, padre entre otras muchas cosas del lenguaje TeX, gran amigo de Edsger Dijkstra otro de los grandes. Uno de los primeros libros de programación que leí fue el primer tomo de la serie "El arte de programar ordenadores", dedicado a los algoritmo fundamentales. Sin ser un libro sobre como desarrollar un programa, si describe la técnica básica de programación que yo uso desde entonces, el desarrollo descendente, se trata de ir descomponiendo el programa en rutinas mas pequeñas a las que vas llamando, mientras las desarrollar puedes hacer que devuelvan un valor fijo para ir probando cosas, hasta llegar a un punto en que no puedes dividirlo por ser ya pequeñas rutinas (en la moderna programación se llega a hablar de que las funciones deben ocupar una pagina, para que se puedan ver de manera sencilla). También puedes usar la técnica del desarrollo ascendente, planteas el programa y empiezas desarrollando las rutinas pequeñas, que vas incorporando al programa que así va creciendo.

Otro principio básico de programación que nunca debemos perder de vista es "no repitas código", si lo mismo lo usas en dos o más partes del programa conviertelo en una función, así si cambias algo solo lo haces en un punto del programa, no en dos.

En esta primera entrada vamos a plantear la estructura base del programa, que es muy sencilla, e iré ampliándola en el resto de entradas (tengo un poco oxidado el C, no se si compila, pero es para hacernos una idea de la estructura a montar). Los comentarios marcados como ++ se pueden convertir en una función o desarrollarse en el mismo lugar, depende de lo largo que sea:

/************************************************/
/* INFERNO, un sokoban en C                     */
/* Jose Antonio Vaqué, noviembre 2013           */
/************************************************/
#include "stdio.h"

/* Constantes que usaremos */
#define MAX_NIVELES = 50;
#define FALSE = 0;
#define TRUE = 1;


/* Estructura para un nivel del juego */
typedef struct nivel{

}

/* Variables globales */
nivel niveles[MAX_NIVELES];

main(){
  /* ++ Preparar niveles */
  /* ++ Preparar variables globales */


  boolean fin_juego = FALSE;
  repeat{
    /* ++ Montar un nivel */
    boolean fin_nivel = FALSE;
    repeat{
      /* ++ Rutina de presentación del nivel */
      /* ++ Lectura del teclado */
      /* ++ Acción según tecla pulsada */
      /* ++ Verificar si se ha completado el nivel */
    } until (fin_nivel | fin_juego);

    if (!fin_juego) {
      /* ++ Mensaje de fin del nivel */
      /* ++ Aumentar nivel */
    } else {
      /* ++ Mensaje fin del juego */
    }

  }until (fin_juego);
}

5 comentarios:

  1. boolean no es un tipo de datos de C estándar, ni las estructuras repeat..until. La primera tendrás que simularla con unsigned char, por ejemplo, y lo segundo modificarlo para convertirlo en un do..while.

    ResponderEliminar
    Respuestas
    1. Y he dicho que solo es una estructura y no se si compila en C, pero es la base sobre la que irá aumentando el programa poco a poco.

      Eliminar
    2. Solo trataba ser de ayuda. Sorry.

      Eliminar
    3. Que te agradezco, que el C lo tengo oxidado.

      Eliminar
  2. A ver si esta iniciativa sigue avanzando poco a poco,... me encantaria aprender a programar y que mejor que aprender que volver a hacer un juego que ya está hecho.

    ResponderEliminar