OpenGL实现贪吃蛇代码

本文详细介绍了如何使用OpenGL进行贪吃蛇游戏的编程实现,涵盖了图形渲染、用户输入处理和游戏逻辑等方面的关键技术,是学习OpenGL实战的一个经典案例。
摘要由CSDN通过智能技术生成

OpenGL实现贪吃蛇代码

#include <cassert>
#include <cstdlib>
#include <ctime>
#include <GL/glut.h>    // Header File For The GLUT Library
#include <GL/gl.h>	// Header File For The OpenGL32 Library
#include <GL/glu.h>	// Header File For The GLu32 Library
#include <unistd.h>     // Header file for sleeping.
/* ascii code for the escape key */
#define ESCAPE 27

/* 大小定义 */
#define ISNAKE_WIDTH  20
#define ISNAKE_HEIGHT 20

/* 方向定义 */
#define DIR_UP         0
#define DIR_DOWN       1
#define DIR_LEFT       2
#define DIR_RIGHT      3

/* 颜色定义(RGB) */
#define  CLR_BLACK      0.0f, 0.0f, 0.0f
#define  CLR_RED        1.0f, 0.0f, 0.0f
#define  CLR_GREEN      0.0f, 1.0f, 0.0f
#define  CLR_YELLOW     1.0f, 1.0f, 0.0f
#define  CLR_BLUE       0.0f, 0.0f, 1.0f
#define  CLR_MEGENTA    1.0f, 0.0f, 1.0f
#define  CLR_CYAN       0.0f, 1.0f, 1.0f
#define  CLR_WHITE      1.0f, 1.0f, 1.0f

/* 时间加快所要吃到的食物个数 */
#define  MIN_FOOD       20
/* 最慢时间,ms */
#define  TIME_BASE      300
/* 最块时间,ms */
#define  TIME_MIN       50
/* 每次升级时间缩短单位,ms */
#define  TIME_UPUNIT    50
GLenum fillMode = GL_SMOOTH;
int level=0;

typedef struct _RGB{
    float r;
    float g;
    float b;
}RGB;

typedef struct Position{
    int x;
    int y;
}Pos;

typedef struct _SnakeNode{
    int    color;
    int    index_x;
    int    index_y;
    struct _SnakeNode *prev;
    struct _SnakeNode *next;
}SnakeNode;

struct _Snake{
    SnakeNode *head;
    SnakeNode *tail;
    int num;
} _snake;

RGB  _color[] = {
        { CLR_RED }, { CLR_GREEN } ,  { CLR_BLUE }, { CLR_YELLOW},
        { CLR_CYAN}, { CLR_MEGENTA},  { CLR_WHITE}, { CLR_BLACK},
};

/* 0, 1, 2, 3分别代表上下左右 */
int _direction = DIR_RIGHT;  /* 要控制的方向 */
int _move_dir = DIR_RIGHT;   /* 当前移动方向 */
int _dir_x[4] = {-1, 1, 0, 0};
int _dir_y[4] = { 0, 0,-1, 1};

/* 定时时间 */
int _timer = TIME_BASE;
/* 游戏结束标志 */
int _finish_flag = 0;
/* 暂停标志 */
int _pause_flag = 0;
/* 食物坐标 */
Pos _food_pos;
int _food_clr_id;

/* The number of our GLUT window */
int window;
int wnd_width;
int wnd_height;

/* 移动,将最后一个节点变为头节点,根据方向改变坐标 */
void SnakeMove(int direction)
{
/* 当前头部位置 */
    int x = _snake.head->index_x;
    int y = _snake.head->index_y;
    int c = _snake.head->color;
    SnakeNode *node = _snake.head;
/* 移动之前改变颜色 */
    for ( ; node->next != NULL; node = node->next){
        node->color = node->next->color;
    }
    node->color = c;
/* 将尾巴加到头部 */
    _snake.tail->prev->next = NULL;
    _snake.head->prev = _snake.tail;
    _snake
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值