SlideShare una empresa de Scribd logo
1 de 20
Ejemplo Completo #2:
Black Jack
Juan Carlos Zuluaga
Introducción
 Este es un juego clásico de cartas. En esta implementación, lo haremos para 2
jugadores. Cada jugador inicia con 2 cartas, y el objetivo es que la suma de
los puntos de las cartas sea 21. Si el jugador se pasa de 21, pierde. Gana el
que tenga 21 punto o el que más se aproxime.
 Las cartas del 2 a 10, valen el número de la carta, es decir, el 2 vale 2, e 3
vale 3, y así sucesivamente
 La J, Q y K, valen 10 puntos
 El As vale 1 u 11 puntos dependiendo de lo que más le convenga al jugador
 Cree un proyecto XNA. Yo lo llame: Black Jack
 Cree la carpeta Images y agregue las imágenes que utilizaremos en este proyecto,
que son: un fondo verde, un logo de Black Jack y las 52 cartas que están PN,
donde P es la pinta (P: Corazones, D: Diamantes, P: Picas, T: Tréboles) y N el
número, que va del 2 al 10, más: J, Q, K y A.
 Cree la carpeta Fonts y cree un nuevo archivo de letras llamado Font. Cambie
estas etiquetas:
<FontName>Impact</FontName>
<Size>24</Size>
 Agreguemos la enumeración GameState que utilizamos en el ejemplo anterior. No
olvide cambiar el nombre del NameSpace
 Agregue una nueva clase llamada Pinta, la cual será una enumeración con las
pintas de la baraja
enum Pinta
{
Corazón,
Diamante,
Pica,
Trébol
}
 Agregue una nueva clase llamada Carta, la cual empaquetará todos los atributos
de una carta
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
namespace Black_Jack
{
class Carta
{
public Texture2D Textura { get; set; }
public Pinta Pinta { get; set; }
public string Letra { get; set; }
public int Valor1 { get; set; }
public int Valor2 { get; set; }
}
}
 Primero pintemos como se verá nuestro juego cuando lo ejecutemos.
 Agreguemos estos atributos a la clase Game1
Texture2D fondo;
Texture2D logo;
SpriteFont font;
GameState gameState;
int width;
int height;
 En el constructor de la case Game1, adicione las siguientes líneas:
// change windows size
width = 900;
height = 600;
graphics.PreferredBackBufferWidth = width;
graphics.PreferredBackBufferHeight = height;
 En el Initizalice:
gameState = GameState.Uninitiated;
 En el Load
fondo = Content.Load<Texture2D>("Images/FondoVerde");
logo = Content.Load<Texture2D>("Images/BlackJack");
font = Content.Load<SpriteFont>("Fonts/Font");
 En el Draw
spriteBatch.Begin();
spriteBatch.Draw(fondo, new Vector2(0, 0), Color.White);
spriteBatch.Draw(logo, new Vector2((width - logo.Width) / 2, 20), Color.White);
if (gameState == GameState.Uninitiated)
{
spriteBatch.DrawString(font, "Presioner ENTER para empezar...", new Vector2(250, 250),
Color.White);
}
spriteBatch.End();
 Probemos lo que llevamos hasta el momento:
 Ahora empecemos con la lógica del juego. Vamos a cargar toda la baraja en memoria y
cuando el usuario presione ENTER, vamos a darle a cada jugador 2 cartas y las vamos a
mostrar
 Vamos a adicionar estos nuevos atributos a la clase Game1
KeyboardState tecladoPrevio;
Random rd = new Random();
List<Carta> baraja;
List<Carta> jugador1;
List<Carta> jugador2;
 En el Initialize:
baraja = new List<Carta>();
jugador1 = new List<Carta>();
jugador2 = new List<Carta>();
 Ahora empecemos con la lógica del juego. Vamos a cargar toda la baraja en memoria y
cuando el usuario presione ENTER, vamos a darle a cada jugador 2 cartas y las vamos a
mostrar
 Vamos a adicionar estos nuevos atributos a la clase Game1
KeyboardState tecladoPrevio;
Random rd = new Random();
List<Carta> baraja;
List<Carta> jugador1;
List<Carta> jugador2;
 Adicionemos el método LoadBaraja. El cual carga todo el mazo de cartas en memoria (este
método puede ser reutilizable por otros juegos de cartas)
private void LoadBaraja()
{
Pinta pinta = Pinta.Corazón;
string pintaLetra = "C";
for (int i = 0; i < 4; i++)
{
for (int j = 1; j <= 13; j++)
{
string letra;
int valor1;
int valor2;
if (j == 1)
{
letra = "A";
valor1 = 1;
valor2 = 11;
}
else if (j == 11)
{
letra = "J";
valor1 = 10;
valor2 = 10;
}
else if (j == 12)
{
letra = "Q";
valor1 = 10;
valor2 = 10;
}
else if (j == 13)
{
letra = "K";
valor1 = 10;
valor2 = 10;
}
else
{
letra = j.ToString();
valor1 = j;
valor2 = j;
}
Texture2D textura = Content.Load<Texture2D>("Images/" + pintaLetra + letra);
Carta carta = new Carta();
carta.Letra = letra;
carta.Pinta = pinta;
carta.Textura = textura;
carta.Valor1 = valor1;
carta.Valor2 = valor2;
baraja.Add(carta);
}
pinta++;
if (pinta == Pinta.Diamante) pintaLetra = "D";
if (pinta == Pinta.Pica) pintaLetra = "P";
if (pinta == Pinta.Trébol) pintaLetra = "T";
}
}
 Adicionemos el método AsignarCarta. El cual le asigna una carta NO repetida al jugador
(este método puede ser reutilizable por otros juegos de cartas)
private void AsignaCarta(List<Carta> jugador)
{
int index = rd.Next(0, baraja.Count - 1);
jugador.Add(baraja[index]);
baraja.RemoveAt(index);
}
 Adicionemos estas líneas al método Update
carta.Pinta = pinta;
carta.Textura = textura;
carta.Valor1 = valor1;
carta.Valor2 = valor2;
baraja.Add(carta);
}
pinta++;
if (pinta == Pinta.Diamante) pintaLetra = "D";
if (pinta == Pinta.Pica) pintaLetra = "P";
if (pinta == Pinta.Trébol) pintaLetra = "T";
}
}
 Adicionemos el método AsignarCarta. El cual le asigna una carta NO repetida al jugador
(este método puede ser reutilizable por otros juegos de cartas)
private void AsignaCarta(List<Carta> jugador)
{
int index = rd.Next(0, baraja.Count - 1);
jugador.Add(baraja[index]);
baraja.RemoveAt(index);
}
 Adicionemos estas líneas al método Update
KeyboardState tecladoActual = Keyboard.GetState();
if ((gameState == GameState.Uninitiated || gameState == GameState.Finish) &&
tecladoActual.IsKeyDown(Keys.Enter))
{
gameState = GameState.Running;
jugador1.Clear();
jugador2.Clear();
LoadBaraja();
AsignaCarta(jugador1);
AsignaCarta(jugador2);
AsignaCarta(jugador1);
AsignaCarta(jugador2);
}
tecladoPrevio = tecladoActual;
 Agregue el método MostrarCartas:
if (gameState == GameState.Running)
{
spriteBatch.DrawString(font, "I) Carta jugador izquierda, D) Carta jugador derecha, P)
Plantar",
new Vector2(50, 250), Color.White);
MostrarCartas(jugador1, 100, 350);
MostrarCartas(jugador2, 500, 350);
}
 Agregue estas líneas al Draw, antes del spriteBatch.End();
if (gameState == GameState.Running)
{
spriteBatch.DrawString(font, "I) Carta jugador izquierda, D) Carta jugador derecha, P) Plantar",
new Vector2(50, 250), Color.White);
MostrarCartas(jugador1, 100, 350);
MostrarCartas(jugador2, 500, 350);
}
 Probemos lo que llevamos hasta el momento:
 Ahora agreguemos la lógica del juego y el manejo de puntajes
 Adicione estos atributos a la clase Game1:
int puntaje1Jugador1;
int puntaje2Jugador1;
int puntaje1Jugador2;
int puntaje2Jugador2;
int ganador;
 En el Initialize:
puntaje1Jugador1 = 0;
puntaje2Jugador1 = 0;
puntaje1Jugador2 = 0;
puntaje2Jugador2 = 0;
ganador = 0;
 Adicione el método revisar puntajes:
private void RevisarPuntajes()
{
puntaje1Jugador1 = 0;
puntaje2Jugador1 = 0;
puntaje1Jugador2 = 0;
puntaje2Jugador2 = 0;
foreach (Carta carta in jugador1)
{
puntaje1Jugador1 += carta.Valor1;
puntaje2Jugador1 += carta.Valor2;
}
foreach (Carta carta in jugador2)
{
puntaje1Jugador2 += carta.Valor1;
puntaje2Jugador2 += carta.Valor2;
}
}
 Cambien el método Update por el siguiente:
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
KeyboardState tecladoActual = Keyboard.GetState();
if ((gameState == GameState.Uninitiated || gameState == GameState.Finish) &&
tecladoActual.IsKeyDown(Keys.Enter))
{
gameState = GameState.Running;
jugador1.Clear();
jugador2.Clear();
LoadBaraja();
AsignaCarta(jugador1);
AsignaCarta(jugador2);
AsignaCarta(jugador1);
AsignaCarta(jugador2);
RevisarPuntajes();
}
if (gameState == GameState.Running &&
tecladoActual.IsKeyDown(Keys.I) &&
!tecladoPrevio.IsKeyDown(Keys.I) &&
(puntaje1Jugador1 < 21 || puntaje2Jugador1 < 21))
{
AsignaCarta(jugador1);
RevisarPuntajes();
}
if (gameState == GameState.Running &&
tecladoActual.IsKeyDown(Keys.D) &&
!tecladoPrevio.IsKeyDown(Keys.D) &&
(puntaje1Jugador2 < 22 || puntaje2Jugador2 < 22))
{
AsignaCarta(jugador2);
RevisarPuntajes();
}
if (gameState == GameState.Running)
{
if (puntaje1Jugador1 == 21 || puntaje2Jugador1 == 21)
{
ganador = 1;
gameState = GameState.Finish;
return;
}
if (puntaje1Jugador2 == 21 || puntaje2Jugador1 == 22)
{
ganador = 2;
gameState = GameState.Finish;
return;
}
}
if (gameState == GameState.Running && tecladoActual.IsKeyDown(Keys.P))
{
gameState = GameState.Finish;
}
tecladoPrevio = tecladoActual;
base.Update(gameTime);
}
 Cambien el método Draw por el siguiente:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here
spriteBatch.Begin();
spriteBatch.Draw(fondo, new Vector2(0, 0), Color.White);
spriteBatch.Draw(logo, new Vector2((width - logo.Width) / 2, 20), Color.White);
if (gameState == GameState.Uninitiated)
{
spriteBatch.DrawString(font, "Presioner ENTER para empezar...", new Vector2(250, 250), Color.White);
}
if (gameState == GameState.Running)
{
spriteBatch.DrawString(font, "I) Carta jugador izquierda, D) Carta jugador derecha, P) Plantar",
new Vector2(50, 250), Color.White);
MostrarCartas(jugador1, 100, 350);
MostrarCartas(jugador2, 500, 350);
}
if (gameState == GameState.Finish)
{
spriteBatch.DrawString(font, "Game Over...", new Vector2(350, 250), Color.White);
spriteBatch.DrawString(font, "Presioner ENTER para empezar...", new Vector2(250, 300), Color.White);
MostrarCartas(jugador1, 100, 350);
MostrarCartas(jugador2, 500, 350);
if (puntaje1Jugador1 == 21 || puntaje2Jugador1 == 21)
{
spriteBatch.DrawString(font, "Ganador Jugador 1!", new Vector2(320, 510), Color.White);
}
else if (puntaje1Jugador2 == 21 || puntaje2Jugador2 == 21)
{
spriteBatch.DrawString(font, "Ganador Jugador 2!", new Vector2(320, 510), Color.White);
}
else if ((puntaje1Jugador1 > 21 || puntaje2Jugador1 > 21) && (puntaje1Jugador2 > 21 || puntaje2Jugador2 > 21))
{
spriteBatch.DrawString(font, "La Casa Gana!", new Vector2(320, 510), Color.White);
}
else if ((puntaje1Jugador1 > 21 || puntaje2Jugador1 > 21) && (puntaje1Jugador2 < 21 || puntaje2Jugador2 < 21))
{
spriteBatch.DrawString(font, "Ganador Jugador 2!", new Vector2(320, 510), Color.White);
}
else if ((puntaje1Jugador2 > 21 || puntaje2Jugador2 > 21) && (puntaje1Jugador1 < 21 || puntaje2Jugador1 < 21))
{
spriteBatch.DrawString(font, "Ganador Jugador 1!", new Vector2(320, 510), Color.White);
}
else if ((puntaje1Jugador1 > puntaje1Jugador2) || (puntaje2Jugador1 > puntaje2Jugador2))
{
spriteBatch.DrawString(font, "Ganador Jugador 1!", new Vector2(320, 510), Color.White);
}
else if ((puntaje1Jugador1 < puntaje1Jugador2) || (puntaje2Jugador1 < puntaje2Jugador2))
{
spriteBatch.DrawString(font, "Ganador Jugador 2!", new Vector2(320, 510), Color.White);
}
else
{
spriteBatch.DrawString(font, "Empate!", new Vector2(320, 510), Color.White);
}
}
spriteBatch.End();
base.Draw(gameTime);
}
 Probemos nuestro juego terminado!!!
Taller #7
 Haga un juego de cartas!!!

Más contenido relacionado

La actualidad más candente

La actualidad más candente (18)

Java AWT Tres en Raya
Java AWT Tres en RayaJava AWT Tres en Raya
Java AWT Tres en Raya
 
Tutorial Game Maker segunda parte
Tutorial Game Maker segunda parteTutorial Game Maker segunda parte
Tutorial Game Maker segunda parte
 
Creando juegos con game maker 8
Creando juegos con game maker 8Creando juegos con game maker 8
Creando juegos con game maker 8
 
Tutorial game maker
Tutorial game makerTutorial game maker
Tutorial game maker
 
Creacion de tablas geograficas en postgres
Creacion de tablas geograficas en postgresCreacion de tablas geograficas en postgres
Creacion de tablas geograficas en postgres
 
Aventura
AventuraAventura
Aventura
 
Presentación3d
Presentación3dPresentación3d
Presentación3d
 
Manual de App
Manual de App Manual de App
Manual de App
 
Comandos r
Comandos rComandos r
Comandos r
 
Pst solides3d
Pst solides3dPst solides3d
Pst solides3d
 
Custom keyinfo
Custom keyinfoCustom keyinfo
Custom keyinfo
 
Presentacion del proyecto
Presentacion del proyectoPresentacion del proyecto
Presentacion del proyecto
 
Java Applet:::Pelota que rebota en un recinto.
Java Applet:::Pelota que rebota en un recinto.Java Applet:::Pelota que rebota en un recinto.
Java Applet:::Pelota que rebota en un recinto.
 
Manual de practicas de Open GL
Manual de practicas de Open GLManual de practicas de Open GL
Manual de practicas de Open GL
 
Pstricks y tikz
Pstricks y tikzPstricks y tikz
Pstricks y tikz
 
Mysql
MysqlMysql
Mysql
 
manual de practicas de opengl
manual de practicas de openglmanual de practicas de opengl
manual de practicas de opengl
 
Computacion v studio 2010 - 02
Computacion   v studio 2010 - 02Computacion   v studio 2010 - 02
Computacion v studio 2010 - 02
 

Destacado

Diplomado edumatica sesión #2
Diplomado edumatica   sesión #2Diplomado edumatica   sesión #2
Diplomado edumatica sesión #2Juan Cardona
 
Taller de programación clase #2
Taller de programación   clase #2Taller de programación   clase #2
Taller de programación clase #2Juan Cardona
 
Taller de programación clase #3
Taller de programación   clase #3Taller de programación   clase #3
Taller de programación clase #3Juan Cardona
 
Taller de programación clase #1
Taller de programación   clase #1Taller de programación   clase #1
Taller de programación clase #1Juan Cardona
 
Conceptos Básicos Análisis de Señales
Conceptos Básicos Análisis de SeñalesConceptos Básicos Análisis de Señales
Conceptos Básicos Análisis de SeñalesJosé Mendoza
 
Int numeros complejos
Int numeros complejosInt numeros complejos
Int numeros complejosJosé Mendoza
 
Ciclos Java - NetsBeans - Algoritmia
Ciclos Java - NetsBeans - AlgoritmiaCiclos Java - NetsBeans - Algoritmia
Ciclos Java - NetsBeans - AlgoritmiaDaniel Gómez
 
02 examen diagnóstico bd
02 examen diagnóstico bd02 examen diagnóstico bd
02 examen diagnóstico bdJosé Mendoza
 
Programación Orientada a Eventos Java
Programación Orientada a Eventos JavaProgramación Orientada a Eventos Java
Programación Orientada a Eventos JavaJosé Mendoza
 
Tipos y Enfoques de Investigacion
Tipos y Enfoques de InvestigacionTipos y Enfoques de Investigacion
Tipos y Enfoques de InvestigacionJosé Mendoza
 

Destacado (11)

Diplomado edumatica sesión #2
Diplomado edumatica   sesión #2Diplomado edumatica   sesión #2
Diplomado edumatica sesión #2
 
Taller de programación clase #2
Taller de programación   clase #2Taller de programación   clase #2
Taller de programación clase #2
 
Herramientas bd
Herramientas bdHerramientas bd
Herramientas bd
 
Taller de programación clase #3
Taller de programación   clase #3Taller de programación   clase #3
Taller de programación clase #3
 
Taller de programación clase #1
Taller de programación   clase #1Taller de programación   clase #1
Taller de programación clase #1
 
Conceptos Básicos Análisis de Señales
Conceptos Básicos Análisis de SeñalesConceptos Básicos Análisis de Señales
Conceptos Básicos Análisis de Señales
 
Int numeros complejos
Int numeros complejosInt numeros complejos
Int numeros complejos
 
Ciclos Java - NetsBeans - Algoritmia
Ciclos Java - NetsBeans - AlgoritmiaCiclos Java - NetsBeans - Algoritmia
Ciclos Java - NetsBeans - Algoritmia
 
02 examen diagnóstico bd
02 examen diagnóstico bd02 examen diagnóstico bd
02 examen diagnóstico bd
 
Programación Orientada a Eventos Java
Programación Orientada a Eventos JavaProgramación Orientada a Eventos Java
Programación Orientada a Eventos Java
 
Tipos y Enfoques de Investigacion
Tipos y Enfoques de InvestigacionTipos y Enfoques de Investigacion
Tipos y Enfoques de Investigacion
 

Similar a Xna game studio presentación 07

Juego Bingo - JAVA
Juego Bingo - JAVAJuego Bingo - JAVA
Juego Bingo - JAVAedgar muñoz
 
Prototipo de un juego de poker "Programado en lenguaje C"
Prototipo de un juego de poker "Programado en lenguaje C"Prototipo de un juego de poker "Programado en lenguaje C"
Prototipo de un juego de poker "Programado en lenguaje C"Maynor Mendoza
 

Similar a Xna game studio presentación 07 (6)

Numeros aleatorios
Numeros aleatoriosNumeros aleatorios
Numeros aleatorios
 
Juego Bingo - JAVA
Juego Bingo - JAVAJuego Bingo - JAVA
Juego Bingo - JAVA
 
Codigo ejercicios
Codigo ejerciciosCodigo ejercicios
Codigo ejercicios
 
Recuperacion programas
Recuperacion programasRecuperacion programas
Recuperacion programas
 
Prototipo de un juego de poker "Programado en lenguaje C"
Prototipo de un juego de poker "Programado en lenguaje C"Prototipo de un juego de poker "Programado en lenguaje C"
Prototipo de un juego de poker "Programado en lenguaje C"
 
Java
JavaJava
Java
 

Más de Juan Cardona

Xna game studio presentación 02
Xna game studio   presentación 02Xna game studio   presentación 02
Xna game studio presentación 02Juan Cardona
 
Xna game studio presentación 01
Xna game studio   presentación 01Xna game studio   presentación 01
Xna game studio presentación 01Juan Cardona
 
Xna game studio presentación 03
Xna game studio   presentación 03Xna game studio   presentación 03
Xna game studio presentación 03Juan Cardona
 
Diplomado edumatica sesión #1
Diplomado edumatica   sesión #1Diplomado edumatica   sesión #1
Diplomado edumatica sesión #1Juan Cardona
 
Taller de programación clase #5
Taller de programación   clase #5Taller de programación   clase #5
Taller de programación clase #5Juan Cardona
 
Taller de programación clase #4
Taller de programación   clase #4Taller de programación   clase #4
Taller de programación clase #4Juan Cardona
 

Más de Juan Cardona (6)

Xna game studio presentación 02
Xna game studio   presentación 02Xna game studio   presentación 02
Xna game studio presentación 02
 
Xna game studio presentación 01
Xna game studio   presentación 01Xna game studio   presentación 01
Xna game studio presentación 01
 
Xna game studio presentación 03
Xna game studio   presentación 03Xna game studio   presentación 03
Xna game studio presentación 03
 
Diplomado edumatica sesión #1
Diplomado edumatica   sesión #1Diplomado edumatica   sesión #1
Diplomado edumatica sesión #1
 
Taller de programación clase #5
Taller de programación   clase #5Taller de programación   clase #5
Taller de programación clase #5
 
Taller de programación clase #4
Taller de programación   clase #4Taller de programación   clase #4
Taller de programación clase #4
 

Último

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativanicho110
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxMiguelAtencio10
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxJorgeParada26
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIhmpuellon
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21mariacbr99
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.FlorenciaCattelani
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxFederico Castellari
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...JohnRamos830530
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 

Último (12)

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 

Xna game studio presentación 07

  • 1. Ejemplo Completo #2: Black Jack Juan Carlos Zuluaga
  • 2. Introducción  Este es un juego clásico de cartas. En esta implementación, lo haremos para 2 jugadores. Cada jugador inicia con 2 cartas, y el objetivo es que la suma de los puntos de las cartas sea 21. Si el jugador se pasa de 21, pierde. Gana el que tenga 21 punto o el que más se aproxime.  Las cartas del 2 a 10, valen el número de la carta, es decir, el 2 vale 2, e 3 vale 3, y así sucesivamente  La J, Q y K, valen 10 puntos  El As vale 1 u 11 puntos dependiendo de lo que más le convenga al jugador
  • 3.  Cree un proyecto XNA. Yo lo llame: Black Jack  Cree la carpeta Images y agregue las imágenes que utilizaremos en este proyecto, que son: un fondo verde, un logo de Black Jack y las 52 cartas que están PN, donde P es la pinta (P: Corazones, D: Diamantes, P: Picas, T: Tréboles) y N el número, que va del 2 al 10, más: J, Q, K y A.  Cree la carpeta Fonts y cree un nuevo archivo de letras llamado Font. Cambie estas etiquetas: <FontName>Impact</FontName> <Size>24</Size>  Agreguemos la enumeración GameState que utilizamos en el ejemplo anterior. No olvide cambiar el nombre del NameSpace  Agregue una nueva clase llamada Pinta, la cual será una enumeración con las pintas de la baraja enum Pinta { Corazón, Diamante, Pica, Trébol }  Agregue una nueva clase llamada Carta, la cual empaquetará todos los atributos de una carta
  • 4. using System; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; namespace Black_Jack { class Carta { public Texture2D Textura { get; set; } public Pinta Pinta { get; set; } public string Letra { get; set; } public int Valor1 { get; set; } public int Valor2 { get; set; } } }  Primero pintemos como se verá nuestro juego cuando lo ejecutemos.  Agreguemos estos atributos a la clase Game1 Texture2D fondo; Texture2D logo; SpriteFont font; GameState gameState; int width; int height;  En el constructor de la case Game1, adicione las siguientes líneas:
  • 5. // change windows size width = 900; height = 600; graphics.PreferredBackBufferWidth = width; graphics.PreferredBackBufferHeight = height;  En el Initizalice: gameState = GameState.Uninitiated;  En el Load fondo = Content.Load<Texture2D>("Images/FondoVerde"); logo = Content.Load<Texture2D>("Images/BlackJack"); font = Content.Load<SpriteFont>("Fonts/Font");  En el Draw spriteBatch.Begin(); spriteBatch.Draw(fondo, new Vector2(0, 0), Color.White); spriteBatch.Draw(logo, new Vector2((width - logo.Width) / 2, 20), Color.White); if (gameState == GameState.Uninitiated) { spriteBatch.DrawString(font, "Presioner ENTER para empezar...", new Vector2(250, 250), Color.White); } spriteBatch.End();
  • 6.  Probemos lo que llevamos hasta el momento:  Ahora empecemos con la lógica del juego. Vamos a cargar toda la baraja en memoria y cuando el usuario presione ENTER, vamos a darle a cada jugador 2 cartas y las vamos a mostrar  Vamos a adicionar estos nuevos atributos a la clase Game1 KeyboardState tecladoPrevio; Random rd = new Random(); List<Carta> baraja; List<Carta> jugador1; List<Carta> jugador2;
  • 7.  En el Initialize: baraja = new List<Carta>(); jugador1 = new List<Carta>(); jugador2 = new List<Carta>();  Ahora empecemos con la lógica del juego. Vamos a cargar toda la baraja en memoria y cuando el usuario presione ENTER, vamos a darle a cada jugador 2 cartas y las vamos a mostrar  Vamos a adicionar estos nuevos atributos a la clase Game1 KeyboardState tecladoPrevio; Random rd = new Random(); List<Carta> baraja; List<Carta> jugador1; List<Carta> jugador2;  Adicionemos el método LoadBaraja. El cual carga todo el mazo de cartas en memoria (este método puede ser reutilizable por otros juegos de cartas) private void LoadBaraja() { Pinta pinta = Pinta.Corazón; string pintaLetra = "C"; for (int i = 0; i < 4; i++) { for (int j = 1; j <= 13; j++) { string letra; int valor1; int valor2; if (j == 1)
  • 8. { letra = "A"; valor1 = 1; valor2 = 11; } else if (j == 11) { letra = "J"; valor1 = 10; valor2 = 10; } else if (j == 12) { letra = "Q"; valor1 = 10; valor2 = 10; } else if (j == 13) { letra = "K"; valor1 = 10; valor2 = 10; } else { letra = j.ToString(); valor1 = j; valor2 = j; } Texture2D textura = Content.Load<Texture2D>("Images/" + pintaLetra + letra); Carta carta = new Carta(); carta.Letra = letra;
  • 9. carta.Pinta = pinta; carta.Textura = textura; carta.Valor1 = valor1; carta.Valor2 = valor2; baraja.Add(carta); } pinta++; if (pinta == Pinta.Diamante) pintaLetra = "D"; if (pinta == Pinta.Pica) pintaLetra = "P"; if (pinta == Pinta.Trébol) pintaLetra = "T"; } }  Adicionemos el método AsignarCarta. El cual le asigna una carta NO repetida al jugador (este método puede ser reutilizable por otros juegos de cartas) private void AsignaCarta(List<Carta> jugador) { int index = rd.Next(0, baraja.Count - 1); jugador.Add(baraja[index]); baraja.RemoveAt(index); }  Adicionemos estas líneas al método Update
  • 10. carta.Pinta = pinta; carta.Textura = textura; carta.Valor1 = valor1; carta.Valor2 = valor2; baraja.Add(carta); } pinta++; if (pinta == Pinta.Diamante) pintaLetra = "D"; if (pinta == Pinta.Pica) pintaLetra = "P"; if (pinta == Pinta.Trébol) pintaLetra = "T"; } }  Adicionemos el método AsignarCarta. El cual le asigna una carta NO repetida al jugador (este método puede ser reutilizable por otros juegos de cartas) private void AsignaCarta(List<Carta> jugador) { int index = rd.Next(0, baraja.Count - 1); jugador.Add(baraja[index]); baraja.RemoveAt(index); }  Adicionemos estas líneas al método Update
  • 11. KeyboardState tecladoActual = Keyboard.GetState(); if ((gameState == GameState.Uninitiated || gameState == GameState.Finish) && tecladoActual.IsKeyDown(Keys.Enter)) { gameState = GameState.Running; jugador1.Clear(); jugador2.Clear(); LoadBaraja(); AsignaCarta(jugador1); AsignaCarta(jugador2); AsignaCarta(jugador1); AsignaCarta(jugador2); } tecladoPrevio = tecladoActual;  Agregue el método MostrarCartas: if (gameState == GameState.Running) { spriteBatch.DrawString(font, "I) Carta jugador izquierda, D) Carta jugador derecha, P) Plantar", new Vector2(50, 250), Color.White); MostrarCartas(jugador1, 100, 350); MostrarCartas(jugador2, 500, 350); }
  • 12.  Agregue estas líneas al Draw, antes del spriteBatch.End(); if (gameState == GameState.Running) { spriteBatch.DrawString(font, "I) Carta jugador izquierda, D) Carta jugador derecha, P) Plantar", new Vector2(50, 250), Color.White); MostrarCartas(jugador1, 100, 350); MostrarCartas(jugador2, 500, 350); }  Probemos lo que llevamos hasta el momento:
  • 13.  Ahora agreguemos la lógica del juego y el manejo de puntajes  Adicione estos atributos a la clase Game1: int puntaje1Jugador1; int puntaje2Jugador1; int puntaje1Jugador2; int puntaje2Jugador2; int ganador;  En el Initialize: puntaje1Jugador1 = 0; puntaje2Jugador1 = 0; puntaje1Jugador2 = 0; puntaje2Jugador2 = 0; ganador = 0;
  • 14.  Adicione el método revisar puntajes: private void RevisarPuntajes() { puntaje1Jugador1 = 0; puntaje2Jugador1 = 0; puntaje1Jugador2 = 0; puntaje2Jugador2 = 0; foreach (Carta carta in jugador1) { puntaje1Jugador1 += carta.Valor1; puntaje2Jugador1 += carta.Valor2; } foreach (Carta carta in jugador2) { puntaje1Jugador2 += carta.Valor1; puntaje2Jugador2 += carta.Valor2; } }  Cambien el método Update por el siguiente:
  • 15. protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); // TODO: Add your update logic here KeyboardState tecladoActual = Keyboard.GetState(); if ((gameState == GameState.Uninitiated || gameState == GameState.Finish) && tecladoActual.IsKeyDown(Keys.Enter)) { gameState = GameState.Running; jugador1.Clear(); jugador2.Clear(); LoadBaraja(); AsignaCarta(jugador1); AsignaCarta(jugador2); AsignaCarta(jugador1); AsignaCarta(jugador2); RevisarPuntajes(); } if (gameState == GameState.Running && tecladoActual.IsKeyDown(Keys.I) && !tecladoPrevio.IsKeyDown(Keys.I) && (puntaje1Jugador1 < 21 || puntaje2Jugador1 < 21)) { AsignaCarta(jugador1); RevisarPuntajes(); }
  • 16. if (gameState == GameState.Running && tecladoActual.IsKeyDown(Keys.D) && !tecladoPrevio.IsKeyDown(Keys.D) && (puntaje1Jugador2 < 22 || puntaje2Jugador2 < 22)) { AsignaCarta(jugador2); RevisarPuntajes(); } if (gameState == GameState.Running) { if (puntaje1Jugador1 == 21 || puntaje2Jugador1 == 21) { ganador = 1; gameState = GameState.Finish; return; } if (puntaje1Jugador2 == 21 || puntaje2Jugador1 == 22) { ganador = 2; gameState = GameState.Finish; return; } } if (gameState == GameState.Running && tecladoActual.IsKeyDown(Keys.P)) { gameState = GameState.Finish; } tecladoPrevio = tecladoActual; base.Update(gameTime); }
  • 17.  Cambien el método Draw por el siguiente: protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); // TODO: Add your drawing code here spriteBatch.Begin(); spriteBatch.Draw(fondo, new Vector2(0, 0), Color.White); spriteBatch.Draw(logo, new Vector2((width - logo.Width) / 2, 20), Color.White); if (gameState == GameState.Uninitiated) { spriteBatch.DrawString(font, "Presioner ENTER para empezar...", new Vector2(250, 250), Color.White); } if (gameState == GameState.Running) { spriteBatch.DrawString(font, "I) Carta jugador izquierda, D) Carta jugador derecha, P) Plantar", new Vector2(50, 250), Color.White); MostrarCartas(jugador1, 100, 350); MostrarCartas(jugador2, 500, 350); } if (gameState == GameState.Finish) { spriteBatch.DrawString(font, "Game Over...", new Vector2(350, 250), Color.White); spriteBatch.DrawString(font, "Presioner ENTER para empezar...", new Vector2(250, 300), Color.White); MostrarCartas(jugador1, 100, 350); MostrarCartas(jugador2, 500, 350);
  • 18. if (puntaje1Jugador1 == 21 || puntaje2Jugador1 == 21) { spriteBatch.DrawString(font, "Ganador Jugador 1!", new Vector2(320, 510), Color.White); } else if (puntaje1Jugador2 == 21 || puntaje2Jugador2 == 21) { spriteBatch.DrawString(font, "Ganador Jugador 2!", new Vector2(320, 510), Color.White); } else if ((puntaje1Jugador1 > 21 || puntaje2Jugador1 > 21) && (puntaje1Jugador2 > 21 || puntaje2Jugador2 > 21)) { spriteBatch.DrawString(font, "La Casa Gana!", new Vector2(320, 510), Color.White); } else if ((puntaje1Jugador1 > 21 || puntaje2Jugador1 > 21) && (puntaje1Jugador2 < 21 || puntaje2Jugador2 < 21)) { spriteBatch.DrawString(font, "Ganador Jugador 2!", new Vector2(320, 510), Color.White); } else if ((puntaje1Jugador2 > 21 || puntaje2Jugador2 > 21) && (puntaje1Jugador1 < 21 || puntaje2Jugador1 < 21)) { spriteBatch.DrawString(font, "Ganador Jugador 1!", new Vector2(320, 510), Color.White); } else if ((puntaje1Jugador1 > puntaje1Jugador2) || (puntaje2Jugador1 > puntaje2Jugador2)) { spriteBatch.DrawString(font, "Ganador Jugador 1!", new Vector2(320, 510), Color.White); } else if ((puntaje1Jugador1 < puntaje1Jugador2) || (puntaje2Jugador1 < puntaje2Jugador2)) { spriteBatch.DrawString(font, "Ganador Jugador 2!", new Vector2(320, 510), Color.White); } else { spriteBatch.DrawString(font, "Empate!", new Vector2(320, 510), Color.White); } } spriteBatch.End(); base.Draw(gameTime); }
  • 19.  Probemos nuestro juego terminado!!!
  • 20. Taller #7  Haga un juego de cartas!!!