Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Juegos en C
Juegos en C
JUEGOS EN C++
I. OBJETIVOS:
Actualmente existe un estándar, denominado ISO C++, al que se han adherido la mayoría
de los fabricantes de compiladores más modernos. Existen también algunos intérpretes,
tales como ROOT.
El nombre "C++" fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue
utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre
"C con clases". En C++, la expresión "C++" significa "incremento de C" y se refiere a que
C++ es una extensión de C.
C++ es un lenguaje de programación orientado a objetos que toma la base del lenguaje C y
le agrega la capacidad de abstraer tipos como en Smalltalk.
vista de los lenguajes orientados a objetos, el C++ es un lenguaje híbrido (¿por? fusionar
con el siguiente).
Si aprenden C++ bien serán parte de una comunidad de “elite” dentro de lo programadores
incluso podrán ganar mucho dinero creando software de bajo nivel, desde los cuales se
sustentarán sistemas mucho más complejos. Pero, nuevamente, los voy a traer hasta nuestra
realidad: establecer una base para crear nuestros futuros videojuegos. Ahora que nombre
esto de "crear una base para nuestros futuros vieojuegos" les paso a explicar la ventaja más
excitante de programar orientado al objeto. Si nosotros creamos un diseño relativamente
bueno que sustente a nuestro videojuego podremos en un futuro seguir ocupando estas
"clases" de objeto (ya veremos este concepto), es decir, no tendremos que invertar la rueda
de nuevo (un error frecuente en un programador). Otra característica de C++ es que ofrece
la robustez de nuestro diseño mediante la ocultación de información, es decir, no todas las
personas que ocupen nuestro código podrán acceder a todo el código. Por ejemplo, no
podrán acceder a las estructuras que guardan la información en un tipo de dato lista,
podremos restringir el acceso del programador que ocupará nuestras clases a las funciones
canónicas insertar, eliminar o borrar un elemento.
C++ (y C) es el lenguaje más utilizado para crear videojuegos a nivel profesional. Así
que si queremos ser "profesionales", hay que conocer C++. C++ es un lenguaje muy
potente y muy flexible, pero también bastante difícil de aprender. Además, C++ no
incorpora funciones "nativas" (o sea, que pertenezcan al propio lenguaje en sí) para la
gestión de gráficos ni multimedia, por lo que si nos decidiéramos por usar este lenguaje
tendríamos que echar mano de alguna librería gráfica disponible y aprender a utilizarla.
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
Un hito importante en el inicio de los videojuegos tuvo lugar en 1 971 cuando Nolan
Bushnell comenzó a comercializar Computer Space, una versión de Space War,
aunque otra versión recreativa de Space War como fue Galaxy War puede que se le
adelantara a principios de los 70 en el campus de la universidad de Standford.
La ascensión de los videojuegos llegó con la máquina recreativa Pong que es
considerada la versión comercial del juego Tennis for Two de Higginbotham. El
sistema fue diseñado por Al Alcom para Nolan Bushnell en la recién fundada Atari.
El juego se presentó en 1 972 y fue la piedra angular del videojuego como industria.
Durante los años siguientes se implantaron numerosos avances técnicos en los videojuegos
(destacando los microprocesadores y los chips de memoria). Aparecieron en los salones
recreativos juegos como Space Invaders (Taito) o Asteroids (Atari).
SDL está escrito en C, funciona de forma nativa con C ++, y hay enlaces disponibles para
varios otros idiomas, incluidos C # y Python.
SDL 2.0 se distribuye bajo la licencia zlib . Esta licencia le permite utilizar SDL libremente
en cualquier software.
SDL RTF: Posibilita el abrir para leer en aplicaciones SDL archivos de texto usando
el formato Rich Text Format RTF.
SDL TTF: Permite usar tipografías TrueType en aplicaciones SDL.
Primero lo primero, y esto es la idea de lo que quieres convertir en un juego, tu idea por
simple que sea es la fuente de tu poder, las cosas sencillas los las que mejor funcionan,
o, nunca te divertiste con pac-man todavía da batalla, como segundo y esto es tu
gasolina para ver realizado tu proyecto es tener las ganas y la convicción de que si se
puede, después de esto debes preguntarte según tu idea, en qué clase de videojuego se
enmarca tu idea, existen muchos tipos de juegos yo creo que ni los conos todos,
solamente me baso en los básicos, a continuación describo algunos.
RPG: como el famoso Final Fantasy, mucha acción, aventura y estrategia, este género
es el que ha consumido mayor parte de mi tiempo, algo triste, pero no los puedo dejar.
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
DEPORTE: FIFA 2006 y de más, los de baloncesto, los de tenis como virtual tenis,
realmente no sé si es un género aparte me queda difícil definirlo dentro de alguno de los
anteriores.
Después de esto se necesitan habilidades como por ejemplo, saber programar en algún
lenguaje como C++
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
Existen varias bibliotecas gráficas con las que empezar, pero mi recomendación es SDL,
tiene bastante reputación en el mundo de los videojuegos 2D, es simple y existe mucha
documentación. En este apartado es cuando es más difícil encontrar documentación en
español, pero existe un gran trabajo en español en forma de wiki perfecto para comenzar en
este maravilloso mundo.
Esto estupendo tutorial no se limita a mostrat y explicar las características de SDL, sino que
trata de explicar el buen uso de la misma y finalmente tiene el desarrollo de un videojuego
paso a paso. Totalmente recomendada para iniciarse con gráficos.
#define ARRIBA 72
#define IZQUIERDA 75
#define DERECHA 77
#define ABAJO 80
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
#define ESC 27
int cuerpo[200][2];
int n = 1, tam = 10, dir = 3;
int x = 10, y = 12;
int xc = 30, yc = 15;
int velocidad = 60;
char tecla;
dwPos.X = x;
dwPos.Y = y;
hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hCon,dwPos);
}
void OcultaCursor() {
CONSOLE_CURSOR_INFO cci = {100, FALSE};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
}
void pintar(){
for(int i=2; i < 78; i++){
gotoxy (i, 3); printf ("%c", 205);
gotoxy(i, 23); printf ("%c", 205);
}
for(int v=4; v < 23; v++){
gotoxy (2,v); printf ("%c", 186);
gotoxy(77,v); printf ("%c", 186);
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
}
gotoxy (2,3); printf ("%c", 201);
gotoxy (2,23); printf ("%c", 200);
gotoxy (77,3); printf ("%c", 187);
gotoxy(77,23); printf ("%c", 188);
}
void guardar_posicion(){
cuerpo[n][0] = x;
cuerpo[n][1] = y;
n++;
if(n == tam) n = 1;
}
void dibujar_cuerpo(){
for(int i = 1; i < tam; i++){
gotoxy(cuerpo[i][0] , cuerpo[i][1]); printf("*");
}
}
void borrar_cuerpo(){
gotoxy(cuerpo[n][0] , cuerpo[n][1]); printf(" ");
}
void teclear(){
if(kbhit()){
tecla = getch();
switch(tecla){
case ARRIBA : if(dir != 2) dir = 1; break;
case ABAJO : if(dir != 1) dir = 2; break;
case DERECHA : if(dir != 4) dir = 3; break;
case IZQUIERDA : if(dir != 3) dir = 4; break;
}
}
}
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
void comida()
{
if(x == xc && y == yc)
{
xc = (rand() % 73) + 4;
yc = (rand() % 19) + 4;
tam++;
gotoxy(xc, yc); printf("%c", 4);
}
}
bool game_over()
{
if(y == 3 || y == 23 || x == 2 || x == 77) return false;
for(int j = tam - 1; j > 0; j--){
if(cuerpo[j][0] == x && cuerpo[j][1] == y)
return false;
}
return true;
}
int main()
{
OcultaCursor();
pintar();
gotoxy(xc, yc); printf("%c", 4);
dibujar_cuerpo();
comida();
teclear();
teclear();
if(dir == 1) y--;
if(dir == 2) y++;
if(dir == 3) x++;
if(dir == 4) x--;
Sleep(velocidad);
}
pintar();
return 0;
}
JUEGO DE PACMAN
#include <windows.h>
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
#include <iostream>
#include <conio.h>
#include <stdio.h>
#define ARRIBA 72
#define IZQUIERDA 75
#define DERECHA 77
#define ABAJO 80
#define ESC 27
#define ENTER 13
int backcolor=0;
int dir = 0;
int x=39,y=22;
int anteriorpx,anteriorpy;
char tecla;
int color[7] = {
0x009,
0x00E,
0x00C,
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
0x002,
0x00B,
0x005,
0x00F
};
dwPos.X = x;
dwPos.Y = y;
hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hCon,dwPos);
}
char mapa[50][100] = {
" ",
" AXXXXXXXXXXXXXXXXXXXB
AXXXXXXXXXXXXXXXXXXXB",
" Y___________________Y Y___________________Y",
" Y_AXXXXXB_AXXXXXXXB_Y
Y_AXXXXXXXB_AXXXXXB_Y",
" Y_Y Y_Y Y_Y Y_Y Y_Y Y_Y",
"
Y_DXXXXXC_DXXXXXXXC_DXC_DXXXXXXXC_DXXXXXC_Y",
" Y________|_________|___|_________|________Y",
"
Y_AXXXXXB_AXB_AXXXXXXXXXXXXXB_AXB_AXXXXXB_Y",
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
void pintar_mapa()
{
for(int i = 0 ; i < 78 ; i++){
for(int j = 0 ; j < 30 ; j++){
gotoxy(i,j);
}
}
}
if(kbhit()){
tecla = getch();
switch(tecla){
case ARRIBA:
dir = 0;
break;
case ABAJO:
dir = 1;
break;
case DERECHA:
dir = 2;
break;
case IZQUIERDA:
dir = 3;
break;
class fantasma{
int fdir;
int _x, _y;
int col;
public:
fantasma(int x , int y , int color);
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
setCColor(color[col]);
gotoxy(_x,_y); printf("%c",6);
}
void fantasma::borrar_fantasma() const{
}
}
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
void fantasma::mover_fantasma(){
borrar_fantasma();
choque_pacman();
int bolx=_x,boly=_y;
if(mapa[_y][_x] == '|'){
fdir = rand()%4;
}
if(mapa[_y][_x] == '*'){
fdir = 0;
}
if(fdir == 2){
if(mapa[_y][_x+1] != 'X' && mapa[_y][_x+1] != 'A' && mapa[_y][_x+1] !
= 'Y' &&
mapa[_y][_x+1] != 'B' && mapa[_y][_x+1] != 'C' && mapa[_y][_x+1] !=
'D') _x++;
else fdir = rand()%4;
}
if(fdir == 3){
if(mapa[_y][_x-1] != 'X' && mapa[_y][_x-1] != 'A' && mapa[_y][_x-1] !=
'Y' &&
mapa[_y][_x-1] != 'B' && mapa[_y][_x-1] != 'C' && mapa[_y][_x-1] !=
'D') _x--;
else fdir = rand()%4;
}
if(fdir == 0){
if(mapa[_y-1][_x] != 'X' && mapa[_y-1][_x] != 'A' && mapa[_y-1][_x] !=
'Y' &&
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
// rutina atajo
if(_x <= 17) _x = 61;
else if(_x >= 62) _x = 18;
dibujar_fantasma();
}
void marcador(){
gotoxy(5,4); printf("PUNTOS");
gotoxy(5,6); printf(" ");
setCColor(color[6]);
gotoxy(5,6); printf("%ld",puntos);
setCColor(color[1]);
gotoxy(5,25); printf("VIDAS");
for(int i = 0 ; i <= vidas ; i++){
gotoxy(5,i+27);printf(" ");
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
}
for(int i = 0 ; i < vidas ; i++){
gotoxy(5,i+27);printf("%c",2);
}
setCColor(color[2]);
gotoxy(70,27);printf("%c",169);
}
int main(){
fantasma A(41,14,2);
fantasma B(43,14,3);
fantasma C(40,14,4);
fantasma D(39,14,5);
pintar_mapa();
B.choque_pacman();
C.choque_pacman();
D.choque_pacman();
A.choque_pacman();
anteriorpx = x; anteriorpy = y;
teclear();
if(dir == 2 && mapa[y][x+1] != 'X' && mapa[y][x+1] != 'A' && mapa[y]
[x+1] != 'Y' &&
mapa[y][x+1] != 'B' && mapa[y][x+1] != 'C' && mapa[y][x+1] != 'D')
x++;
else if(dir == 3 && mapa[y][x-1] != 'X' && mapa[y][x-1] != 'A' && mapa[y]
[x-1] != 'Y' &&
mapa[y][x-1] != 'B' && mapa[y][x-1] != 'C' && mapa[y][x-1] != 'D')
x--;
A.mover_fantasma();
B.mover_fantasma();
C.mover_fantasma();
D.mover_fantasma();
pacman(x,y);
Sleep(55);
if(x < 17) {
borrar_pacman(x,y);
x = 61;
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
}
else if(x > 62){
borrar_pacman(x,y);
x= 18;
}
}
for(int i = 0 ; i <= vidas ; i++){
gotoxy(5,i+27);printf(" ");
system("pause>NULL");
return 0;
}
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
JUEGO DE GATO
#include<iostream.h>
char gato[3][3];
bool bandera=true;
//===PROTOTIPOS===
void imprimegato();
void cambiaturno(char &t);
void introduce(char t, char corden);
short evalua(char t);
main()
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
{
imprimegato();
char t='X';
char posicion;
while(bandera==true)
{
cout<<"Es el turno de "<<t<<" introduzca posicion: ";
cin>>posicion;
posicion=toupper(posicion);
introduce(t,posicion);
// comprueba(turno);
evalua(t);
cambiaturno(t);
imprimegato();
}
system("pause");
}//fin main
//====INTRODUCE=====
void introduce(char t, char corden)
{
switch(corden)
{
case 'A':
if(gato[0][0]!='X' && gato[0][0]!='O')
{
gato[0][0]=t;
// cambiaturno(t);
}
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
else{cout<<"\n=Posicion ocupada=\n";}
break;
case 'B':
if(gato[0][1]!='X' && gato[0][1]!='O')
{
gato[0][1]=t;
// cambiaturno(t);
}
else{cout<<"\n=Posicion ocupada=\n";}
break;
case 'C':
if(gato[0][2]!='X' && gato[0][2]!='O')
{
gato[0][2]=t;
// cambiaturno(t);
}
else{cout<<"\n=Posicion ocupada=\n";}
break;
case 'D':
if(gato[1][0]!='X' && gato[1][0]!='O')
{
gato[1][0]=t;
// cambiaturno(t);
}
else{cout<<"\n=Posicion ocupada=\n";}
break;
case 'E':
if(gato[1][1]!='X' && gato[1][1]!='O')
{
gato[1][1]=t;
// cambiaturno(t);
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
}
else{cout<<"\n=Posicion ocupada=\n";}
break;
case 'F':
if(gato[1][2]!='X' && gato[1][2]!='O')
{
gato[1][2]=t;
// cambiaturno(t);
}
else{cout<<"\n=Posicion ocupada=\n";}
break;
case 'G':
if(gato[2][0]!='X' && gato[2][0]!='O')
{
gato[2][0]=t;
// cambiaturno(t);
}
else{cout<<"\n=Posicion ocupada=\n";}
break;
case 'H':
if(gato[2][1]!='X' && gato[2][1]!='O')
{
gato[2][1]=t;
// cambiaturno(t);
}
else{cout<<"\n=Posicion ocupada=\n";}
break;
case 'I':
if(gato[2][2]!='X' && gato[2][2]!='O')
{
gato[2][2]=t;
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
// cambiaturno(t);
}
else{cout<<"\n=Posicion ocupada=\n";}
break;
default:
cout<<"\nIntroduzca una posicion valida.\n";
}//fin switch
}//fin introduce
//====CAMBIATURNO===
void cambiaturno(char &t)
{
if (t=='X'){t='O';}
else{t='X';}
//cout<<t
//return t;
}//fin cambiaturno
//=======IMPRIMEGATO=====
void imprimegato()
{
cout<<"\n ######GATO#######\n\n";
cout<<"\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
}//fin imrpimegato
short evalua(char t)
{
cout<<t
short px=0;
short po=0;
short evaluacion=0;
cout<<"\n[0][i]\n";
for(short i=0;i<3i++)
{
if(((gato[0][i]=='X')||gato[0][i]=='\0')&&((gato[1][i]=='X')||gato[1]
[i]=='\0')&&((gato[2][i]=='X')||gato[2][i]=='\0'))
{px++;}
if(gato[0][0]=='O'||gato[0][1]=='O'||gato[0][2]=='O'||gato[1][0]=='O'||gato[1]
[1]=='O'||gato[1][2]=='O'||gato[2][0]=='O'||gato[2][1]=='O'||gato[2][2]=='O')
{
if(((gato[0][i]=='O')||gato[0][i]=='\0')&&((gato[1][i]=='O')||gato[1]
[i]=='\0')&&((gato[2][i]=='O')||gato[2][i]=='\0'))
{po++;}
}
//else {po++;}
cout<<"\npo="<<po
cout<<"\npx="<<px
for(short i=0;i<3i++)
{
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
if(((gato[i][0]=='X')||gato[i][0]=='\0')&&((gato[i][1]=='X')||gato[i]
[1]=='\0')&&((gato[i][2]=='X')||gato[i][2]=='\0'))
{px++;}
if(gato[0][0]=='O'||gato[0][1]=='O'||gato[0][2]=='O'||gato[1][0]=='O'||gato[1]
[1]=='O'||gato[1][2]=='O'||gato[2][0]=='O'||gato[2][1]=='O'||gato[2][2]=='O')
{
if(((gato[i][0]=='O')||gato[i][0]=='\0')&&((gato[i][1]=='O')||gato[i]
[1]=='\0')&&((gato[i][2]=='O')||gato[i][2]=='\0'))
{po++;}
}
//else{po++;}
cout<<"\npo="<<po
cout<<"\npx="<<px
}//fin for
//Diagonales
cout<<"\ndiagonales\n";
if(((gato[0][0]=='X')||gato[0][0]=='\0')&&((gato[1][1]=='X')||gato[1]
[1]=='\0')&&((gato[2][2]=='X')||gato[2][2]=='\0'))
{px++;}
if(gato[0][0]=='O'||gato[0][1]=='O'||gato[0][2]=='O'||gato[1][0]=='O'||gato[1]
[1]=='O'||gato[1][2]=='O'||gato[2][0]=='O'||gato[2][1]=='O'||gato[2][2]=='O')
{
if(((gato[0][0]=='O')||gato[0][0]=='\0')&&((gato[1][1]=='O')||gato[1]
[1]=='\0')&&((gato[2][2]=='O')||gato[2][2]=='\0'))
{po++;}
}
//else{po++;}cout<<"\n1.diagonal\n";
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS
cout<<"\npo="<<po
cout<<"\npx="<<px
if(((gato[2][0]=='X')||gato[2][0]=='\0')&&((gato[1][1]=='X')||gato[1]
[1]=='\0')&&((gato[0][2]=='X')||gato[0][2]=='\0'))
{px++;}
if(gato[0][0]=='O'||gato[0][1]=='O'||gato[0][2]=='O'||gato[1][0]=='O'||gato[1]
[1]=='O'||gato[1][2]=='O'||gato[2][0]=='O'||gato[2][1]=='O'||gato[2][2]=='O')
{
if(((gato[2][0]=='O')||gato[2][0]=='\0')&&((gato[1][1]=='O')||gato[1]
[1]=='\0')&&((gato[0][2]=='O')||gato[0][2]=='\0'))
{po++;}
}
//else{po++;}cout<<"\n2.diagonal\n";
cout<<"\npo="<<po
cout<<"\npx="<<px
if (t=='X'){evaluacion=px-po;}
else{evaluacion=po-px;}
cout<<"\n\nfinales";
cout<<"\npo="<<po
cout<<"\npx="<<px
//return evaluacion;
cout<<"\n\nEvaluacion es: "<<evaluacion<<endl
}//fin evalua
FACULTAD DE INGENIERIA CIVIL, ARQUITECTURA Y URBANISMO
ESCUELA PROFESIONAL DE CIENCIAS FISICO MATEMATICAS