Proyecto del juego C Language-Snake

Proyecto del juego C Language-Snake

Inicialización de la serpiente

La inicialización de la serpiente es en realidad la inicialización de una matriz bidimensional. La matriz bidimensional almacena dos valores, que contienen la información de coordenadas del cuerpo de la serpiente. La posición inicial de su aparición es la posición media de la coordenada simulada.

El movimiento de la serpiente

El movimiento de la serpiente se logra cambiando las coordenadas de la matriz bidimensional. Por ejemplo, cuando la serpiente avanza una unidad hacia la derecha, las coordenadas de cada posición del cuerpo de la cola cambian y la dirección de la lengua, el cuerpo y la cola de la serpiente se cambian al mismo tiempo. De esta manera, la serpiente avanzó una unidad en total.

Crecimiento de serpientes

Cuando la serpiente come comida normal, la longitud de la serpiente aumentará. Aumentar la longitud de la serpiente significa agregar una matriz bidimensional en la posición de la comida y convertir esta posición en la cabeza de la serpiente.

Muerte de serpiente

Cuando la serpiente choca contra un obstáculo, ella misma, o supera un nivel, la muerte de la serpiente es la destrucción de la matriz bidimensional.

La producción de alimentos

La ubicación de los alimentos es aleatoria. Estos factores están determinados por números aleatorios obtenidos mediante funciones aleatorias. La ubicación de los alimentos no puede aparecer en obstáculos y límites.

Control de entrada de teclado

Al obtener la entrada del teclado W (arriba), S (abajo), A (izquierda), D (derecha) para cambiar la dirección de movimiento en el módulo, afectando así la dirección de movimiento de la serpiente.

Ejemplo de código:

Serpiente.c

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
#include"Snake.h"
/*
1.定义蛇的结构体
2.初始化蛇和食物
3.开始游戏
        蛇和墙的碰撞
        蛇和自身碰撞
        蛇和食物碰撞
               重新随机食物
               蛇身体增长
               分数增长
        方向键控制
4.游戏结束
*/
void InitFood()
{
    
    
        food[0] = rand() % WIDE;
        food[1] = rand() % HIGH;
}
void InitSnake()
{
    
    
        snake.size = 2;
        snake.body[0].X = WIDE / 2;
        snake.body[0].Y = HIGH / 2;
        snake.body[1].X = WIDE / 2 - 1;
        snake.body[1].Y = HIGH / 2;
}
void ShowUI()
{
    
    
        
        COORD coord;
        coord.X = lx;
        coord.Y = ly;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
        putchar(' ');
        //显示蛇的位置上
        for (int i = 0; i < snake.size; i++)
        {
    
    
               coord.X = snake.body[i].X;
               coord.Y = snake.body[i].Y;
               SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
               if (i == 0)
                       putchar('@');
               else
               {
    
    
                       putchar('*');
               }
               //显示食物位置
               coord.X = food[0];
               coord.Y = food[1];
               SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
               putchar('#');
        }
}
void PlayGame()
{
    
    
        char key = 'D';
        while (snake.body[0].X>=0 && snake.body[0].X<WIDE
               &&snake.body[0].Y>=0&& snake.body[0].Y<HIGH)
        {
    
    
               //显示界面
               ShowUI();
               //方向控制
               while (_kbhit())
               {
    
    
                       key = _getch();
               }
               //方向控制按钮
               switch (key)
               {
    
    
               case 'D':case'd':dx = 1; dy = 0; break;
               case 'A':case'a':dx = -1; dy = 0; break;
               case 'W':case'w':dx = 0; dy = -1; break;
               case 'S':case's':dx = 0; dy = 1; break;
               }
               //是否和自身碰撞
               for (int i = 1; i < snake.size; i++)
               {
    
    
                       //当条件满足就停止游戏
                       if (snake.body[0].X == snake.body[i].X&&snake.body[0].Y ==  snake.body[i].Y)
                       {
    
    
                              return;
                       }
               }
               //蛇和食物的碰撞
               if (snake.body[0].X == food[0] && snake.body[0].Y == food[1])
               {
    
    
                       //随机新食物
                       InitFood();
                       //蛇身体增长
                       snake.size++;
                       score += 10;
                       //关卡 速度  障碍物
               }
               //蛇更新坐标
               lx = snake.body[snake.size - 1].X;
               ly = snake.body[snake.size - 1].Y;
               for (int i = snake.size - 1; i > 0; i--)
               {
    
    
                       snake.body[i].X = snake.body[i - 1].X;
                       snake.body[i].Y = snake.body[i - 1].Y;
               }
               //更新舌头
               snake.body[0].X += dx;
               snake.body[0].Y += dy;
               
               Sleep(100);
               //system("cls");
        }
}
//加框架墙
void InitWall()
{
    
    
        for (int i = 0; i <= HIGH; i++)
        {
    
    
               for (int j = 0; j <= WIDE; j++)
               {
    
    
                       if (i == HIGH)
                              putchar('=');
                       else if(j==WIDE)
                              putchar('|');
                       else
                              putchar(' ');
               }
               putchar('\n');
        }
}
int main()
{
    
    
        //添加随机数种子
        srand((size_t)time(NULL));
        //清除控制台光标
        CONSOLE_CURSOR_INFO cci;
        cci.dwSize = sizeof(cci);
        cci.bVisible = FALSE;
        SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
        InitWall();
        InitFood();
        InitSnake();
        PlayGame();
        
        //getchar();
        return EXIT_SUCCESS;
}

Serpiente.h

#pragma once
#define WIDE 60
#define HIGH 20
struct BODY
{
    
    
        int X;
        int Y;
};
struct SNAKE
{
    
    
        int size;
        struct BODY body[WIDE * HIGH];
}snake;
int food[2] = {
    
     0 };//food[0]为X坐标 food[1]为Y坐标
int score = 0;
//偏移坐标
int dx = 0;
int dy = 0;
//记录蛇末尾坐标
int lx = 0;
int ly = 0;
void InitFood();
void InitSnake();
void ShowUI();
void PlayGame();
void InitWall();

¡Tu atención es la motivación de mi creación!

Supongo que te gusta

Origin blog.csdn.net/gyqailxj/article/details/114991058
Recomendado
Clasificación