lunes, 17 de diciembre de 2012

[ProjectMX] Primer juego completo en C++

Después de largos intentos por desarrollar un minijuego en C++, he terminado al fin un videojuego completo,  algo simple y muy dinámico, lo cual hace que solo tenga 105 líneas de código, lo cual pienso mejorar para que ocupe las menos posibles.

El primer intento por desarrollar este videojuego fue muy simple, una nave que se movia en la pantalla y era todo lo que hacia. <60 lineas aprox>

En el segundo intento logré hacer una nave y una roca, la nave al pegar con la roca se destruia y por esto mismo se cerraba el juego. <95 lineas aprox>

En este tercer intento he logrado desarrollar una nave con puntos de vida, nivel de dificultad y 6 naves en la pantalla mostradas de forma aleatoria. Lo que más me agrado fué el efecto que tiene de multitarea, además de ser muy dinámico. <105 líneas>


Como este fue mi primer intento logrado, lo seguiré desarrollando y será el proyecto principal, y como siempre 100% libre.

El juego lo desarrollé en C++ con ayuda de la librería MiniWin.

Aquí el código:
http://programando-habilidades.blogspot.mx/2012/12/projectmx-juego-en-c-version-03-100.html

[ProjectMX] Juego en C++ version 0.3 (100 %libre)

Aquí el código del juego. Para más información clic aqui.

#include <stdlib.h>
#include "miniwin.h"
using namespace miniwin;

const int PX = 20, CAMPOX=15, CAMPOY=20;
bool roca_existe[6];
int rx[6],ry[6];
int vida=10, puntos=0, nivel=100;

void cuadrado(int x, int y) {
    rectangulo_lleno(1+x * PX, 1+y * PX, x * PX + PX, y * PX + PX);
}

void nave_pintar(int x, int y) {
    color(VERDE);
    cuadrado(x,y-1); cuadrado(x-1,y);
    cuadrado(x,y);   cuadrado(x+1,y);
}

int nave_control(int x, int y, int key) {
    if (key==IZQUIERDA && x > 1)
        x--;
    if (key==DERECHA && x < CAMPOX-2)
        x++;
    nave_pintar(x,y);
    return (x);
}

int key_det(int key) {
    if (key==NINGUNA)
        key=ARRIBA;
    return (key);
}

void roca_pintar(int x, int y) {
    color(CYAN);
    cuadrado(x,y);
}

void  roca_control() {
    for (int i=0; i < 6; i++) {
        if (roca_existe[i]==0) {
            rx[i]=rand()%CAMPOX-1;
            ry[i]=(rand()%20)*-1;
            roca_existe[i]=1;
        }
        else if (roca_existe[i]==1 && ry[i] < CAMPOY) {
            ry[i]++;
            roca_pintar(rx[i],ry[i]);
        }
        else {
            roca_existe[i]=0;
            ry[i]=0;
        }
    }
}

void game_over() {
    borra();
    vcierra();
}

void vida_control(){
    color(ROJO);
    for (int i = 0; i <= vida; i++)
        cuadrado(i,0);
    if (vida<=0)
        game_over();
}

void puntos_control() {
    color(AMARILLO);
    for (int i = 0; i <= puntos/100; i++)
        cuadrado(i,1);
}

void colision_detectar(int nx, int ny) {
    for (int i=0; i < 6; i++) {
        if (rx[i]>nx-2 && rx[i]<nx+2 && ry[i]>ny-2 && ry[i]<ny+2)
            vida--;
    }
}

int main() {
    int key=tecla();
    int nx=CAMPOX/2, ny= CAMPOY-1;
    vredimensiona(CAMPOX * PX, CAMPOY * PX);
    while(key!=ESCAPE) {
        puntos++;
        espera(nivel-(puntos/35));
        key=tecla();
        key=key_det(key);
        if (key!=NINGUNA) {
            borra();
            puntos_control();
            colision_detectar(nx,ny);
            vida_control();
            nx=nave_control(nx,ny,key);
            roca_control();
            refresca();
        }
    }
    vcierra();
    return 0;
}