Red de conocimiento informático - Material del sitio web - Cómo programar un Tetris en lenguaje C

Cómo programar un Tetris en lenguaje C

Vista previa de la interfaz del juego:

Vista previa del menú:

Personaliza el color de cada interfaz de función de cuadrado pequeño:

El juego tiene principalmente cuatro Composición de partes: clase Cuadrado, clase Bloque, clase gameField, motor de juego

Clase Cuadrado:

El objeto descrito por esta clase es cada entidad cuadrada pequeña que forma el cuadrado grande.

Diseño de clase:

clase Cuadrado

{

ubicación del punto público // Las coordenadas del cuadrado pequeño

tamaño público tamaño; //Tamaño del cuadro pequeño

color público foreColor; //color de primer plano del cuadro pequeño

color público backColor //color de fondo del cuadro pequeño

public Square(Size initSize, Color initForeColor, Color initBackColor) //Constructor

{ ……}

public void Draw(System.IntPtr winHandle) //En el especificado dispositivo Dibujar un cuadrado

{…… }

public void Erase(System.IntPtr winHandle)//Borrar el cuadrado

{…… }

}

Clase de bloque:

El objeto descrito por esta clase es una entidad de bloque grande. Cada cuadrado grande se compone de cuatro cuadrados pequeños y hay 7 combinaciones en un conjunto. Esta clase necesita implementar todas las propiedades y acciones de una entidad de caja grande. Incluyendo: la forma y posición del bloque, mover el bloque hacia la izquierda, derecha, abajo, rotación, etc.

Diseño de clase:

class Block

{

public Square square1 //Los cuatro pequeños cuadrados que forman el bloque

cuadrado público2;

cuadrado público3;

cuadrado público4; private const int squareSize = GameField.SquareSize; //longitud del lado del cuadrado pequeño

enumeración pública BlockTypes

{

indefinido = 0,

cuadrado = 1,

línea = 2,

J = 3,

L = 4,

T = 5,

Z = 6,

S = 7

}; //Hay 7 formas en un ***

public BlockTypes blockType; //La forma del bloque

// Siete bloques pequeños Matriz de colores

private Color foreColor;

private Color backColor;

// La dirección del bloque

public enum RotateDirections

{

Norte = 1,

Este = 2,

Sur = 3,

Oeste = 4

};

public RotateDirections myRotation = RotateDirections.North

public Block(Point thisLocation, BlockTypes bType)

{ ……}

//Sobrecarga con colores personalizados

public Block(Point thisLocation, BlockTypes bType, Color fc, Color bc)

{ ……} / * dibujar cuadrado*/

public void Draw(System.IntPtr winHandle)

{…… }

/*Limpiar el cuadrado*/

borrado público vacío (System.IntPtr winH

andle)

{…… } /*move*/

public bool down()

{……}

public bool left()

{……}

public bool right()

{……}

/*Rotar bloque*/

public void Rotate()

{……}

/*Comprueba si llega a la cima*/

public int Top ()

{……}

}

Clase GameField:

El objeto descrito por esta clase es la entidad de la escena del juego, incluido el color de fondo de la escena, el tamaño, si el bloque aún se puede mover y la detección de llenar una fila en la escena, etc.

Diseño de clase:

class GameField

{

public const int width = 20 // El ancho de la escena, en El número de cuadrados es la unidad

public const int height = 30;

public const int SquareSize = 15 //La longitud del lado de cada cuarto de cuadrado

public; static Color BackColor; //Color de fondo de la escena

public static System.IntPtr winHandle; //Manejador de la escena

public static Color[] BlockForeColor ={ Color.Blue, Color.Beige, Color.DarkKhaki, Color.DarkMagenta, Color.DarkOliveGreen, Color.DarkOrange, Color.DarkRed };

public static Color[] BlockBackColor ={ Color.LightCyan, Color.DarkSeaGreen, Color. Beige, Color.Beige, Color.Beige, Color.Beige, Color.Beige};

public static bool isChanged=false //Establece la bandera si se ha cambiado

public static SoundPlayer sound = new SoundPlayer(); //Reproducir sonido public static Square[,] returnBlock = new Square[width, height] //Guarda el bloque que ya no puede caer

public static int; [ ] arrBitBlock=new int[height]; //Matriz de bits: cuando hay un bloque en una determinada posición, el bit en la fila es 1

private const int bitEmpty = 0x0; 0000 0000 0000

private const bitFull = 0xFFFFF; //1111 1111 1111 1111 1111 /*Detectar si una determinada posición está vacía*/

public static bool isEmpty(int x, int y)

{……}

/*Detener el cuadrado*/

public static void stopSquare(Cuadrado cuadrado, int x, int y)

{……}

/*La línea de detección es

Completo o no

* Devuelve: la suma del número de líneas eliminadas con éxito (conveniente para puntuaciones estadísticas)

*/

public static int CheckLines()

{……}

/*Reproducir sonido*/

public static void PlaySound(cadena sonidostr)

{……}

/*Redraw*/

public static void Redraw()

{ …… }

//Fin

}

Motor del juego:

El motor del juego, como su nombre indica, es como un motor que permite que el juego se ejecute de forma continua. En este juego, los bloques deben caer a cierta velocidad. Y responda a los eventos del teclado, implemente funciones de movimiento hacia la izquierda y hacia la derecha y aceleración hacia abajo. (Ver código fuente para el código)

Reproducción de sonido:

Los efectos de sonido son una parte indispensable del juego. Se ha proporcionado una clase en .Net2.0 para reproducir sonidos. En el espacio de nombres usando System.Media;

El código para reproducir sonido en este juego es el siguiente: (en la clase GameField)

usando System.Media

public static SoundPlayer sound = new; SoundPlayer() ;

/*Reproducir sonido*/

public static void PlaySound(cadena sonidostr)

{

cambiar (soundstr )

{

case "FinishOneLine": //Elimina el sonido de una línea

if (!File.Exists("FinishOneLine.wav")) return;

sound.SoundLocation = "FinishOneLine.wav";

break

case "CanNotDo": //Cuando no se puede realizar la operación

p>

if ( !File.Exists("CanNotDo.wav")) return;

sound.SoundLocation = "CanNotDo.wav";

descanso;

}

p>

sound.Play();

}

Simplemente llama al método PlaySound() cuando quieras jugar.

De hecho, los pasos son muy simples. Primero haga referencia al espacio System.Media, luego cree un objeto SoundPlayer, use la propiedad SoundLocation para establecer la dirección del archivo de sonido y luego llame a Play(). método para jugarlo. Sin embargo, tenga en cuenta que los únicos formatos de sonido que esta clase puede reproducir son archivos Wav.

Guardar configuración del juego:

A menudo es necesario guardar la configuración definida por el usuario en los juegos. Este juego se guarda escribiendo en un archivo ini.

El código principal es el siguiente:

/*Leer la configuración del juego desde el archivo de configuración Configuración.ini al cargar el formulario*/

private void getSettings( )

{

if (!File.Exists("Setting.ini"))

return;

FileStream fs = nuevo FileStream( "Setting.ini", FileMode.OpenOrCreate, FileAccess.ReadWrite);

StreamReader sr = new StreamReader(fs);

string line1=sr.ReadLine();

cadena línea2=sr.ReadLine();

cadena línea3=sr.ReadLine();

if (línea1 != null amp; amp; línea1. Split( '=').Longitud gt; 1)

{

GameField.BackColor = Color.FromArgb(int.Parse(line1.Split('=')[1] )) ;

picBackGround.BackColor = GameField.BackColor;

}

if (line2 != null & line2.Split('='). Longitud gt; 1)

GameField.BlockForeColor = strToColor(line2.Split('=')[1]);

if (line3 != null amp; amp; line3. Split ('=').Longitud gt; 1)

GameField.BlockBackColor = strToColor(line3.Split('=')[1]);

sr.Close() ;

fs.Close();

}

/*Si se cambia la configuración del juego, guarde la nueva configuración en Configuración.ini*/

private void saveSettings()

{

FileStream fs = new FileStream("Setting.ini", FileMode.Create, FileAccess.ReadWrite);

StreamWriter sw = new StreamWriter(fs);

sw.WriteLine("GameFieldColor=" GameField.BackColor.ToArgb());

sw.WriteLine("BlockFroeColor=" colorToStr( GameField.BlockForeColor));

sw.WriteLine("BlockBackColor=" colorToStr(GameField.BlockBackColor));

sw.Flush();

sw .Close();

fs.Close();

}

Código fuente QQ348199903