可以提供一个C语言OpenGL编写的贪吃蛇代码吗,要比较高级的那种
时间: 2024-02-06 19:10:08 浏览: 74
以下是一个使用C语言和OpenGL库实现的高级贪吃蛇游戏示例:
```
#include <GL/glut.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 25 // 行数
#define COL 40 // 列数
#define UNIT_SIZE 16 // 每个网格的大小
int score = 0; // 得分
int foodX, foodY; // 食物的位置
int snakeX[ROW * COL], snakeY[ROW * COL]; // 蛇的身体坐标
int snakeLength = 4; // 蛇的长度
int direction = GLUT_KEY_RIGHT; // 蛇头的方向
int gameover = 0; // 游戏结束标志
void init() {
glClearColor(0.0, 0.0, 0.0, 0.0); // 设置背景颜色为黑色
glMatrixMode(GL_PROJECTION); // 设置投影模式
glLoadIdentity();
gluOrtho2D(0, COL * UNIT_SIZE, 0, ROW * UNIT_SIZE); // 设置窗口范围
srand(time(NULL)); // 设置随机数种子
foodX = rand() % (COL - 1) * UNIT_SIZE; // 随机生成食物的位置
foodY = rand() % (ROW - 1) * UNIT_SIZE;
}
// 绘制网格
void drawGrid() {
glColor3f(0.3, 0.3, 0.3); // 设置网格颜色为灰色
glBegin(GL_LINES);
for (int i = 0; i < COL; i++) {
glVertex2i(i * UNIT_SIZE, 0);
glVertex2i(i * UNIT_SIZE, ROW * UNIT_SIZE);
}
for (int i = 0; i < ROW; i++) {
glVertex2i(0, i * UNIT_SIZE);
glVertex2i(COL * UNIT_SIZE, i * UNIT_SIZE);
}
glEnd();
}
// 绘制食物
void drawFood() {
glColor3f(1.0, 0.0, 0.0); // 设置食物颜色为红色
glRectf(foodX, foodY, foodX + UNIT_SIZE, foodY + UNIT_SIZE);
}
// 绘制蛇
void drawSnake() {
glColor3f(0.0, 1.0, 0.0); // 设置蛇的颜色为绿色
for (int i = 0; i < snakeLength; i++) {
glRectf(snakeX[i], snakeY[i], snakeX[i] + UNIT_SIZE, snakeY[i] + UNIT_SIZE);
}
}
// 更新蛇的位置
void updateSnake() {
for (int i = snakeLength - 1; i > 0; i--) {
snakeX[i] = snakeX[i - 1];
snakeY[i] = snakeY[i - 1];
}
switch (direction) {
case GLUT_KEY_UP:
snakeY[0] += UNIT_SIZE;
break;
case GLUT_KEY_DOWN:
snakeY[0] -= UNIT_SIZE;
break;
case GLUT_KEY_LEFT:
snakeX[0] -= UNIT_SIZE;
break;
case GLUT_KEY_RIGHT:
snakeX[0] += UNIT_SIZE;
break;
}
}
// 检查是否碰撞到边界或自身
void checkCollision() {
if (snakeX[0] < 0 || snakeX[0] >= COL * UNIT_SIZE || snakeY[0] < 0 || snakeY[0] >= ROW * UNIT_SIZE) {
gameover = 1; // 碰到边界,游戏结束
return;
}
for (int i = 1; i < snakeLength; i++) {
if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
gameover = 1; // 碰到自身,游戏结束
return;
}
}
}
// 检查是否吃到食物
void eatFood() {
if (snakeX[0] == foodX && snakeY[0] == foodY) {
score += 10; // 加分
snakeLength++; // 增加蛇的长度
foodX = rand() % (COL - 1) * UNIT_SIZE; // 随机生成新的食物
foodY = rand() % (ROW - 1) * UNIT_SIZE;
}
}
// 显示得分
void showScore() {
glColor3f(1.0, 1.0, 1.0); // 设置文字颜色为白色
glRasterPos2i(10, ROW * UNIT_SIZE - 20);
char str[20];
sprintf(str, "Score: %d", score);
for (int i = 0; str[i] != '\0'; i++) {
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, str[i]);
}
}
// 显示游戏结束信息
void showGameOver() {
glColor3f(1.0, 1.0, 1.0); // 设置文字颜色为白色
glRasterPos2i(COL * UNIT_SIZE / 2 - 60, ROW * UNIT_SIZE / 2);
char str[20];
sprintf(str, "Game Over! Score: %d", score);
for (int i = 0; str[i] != '\0'; i++) {
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, str[i]);
}
}
// 显示画面
void display() {
glClear(GL_COLOR_BUFFER_BIT);
drawGrid();
drawFood();
drawSnake();
showScore();
if (gameover) {
showGameOver();
}
glutSwapBuffers();
}
// 处理键盘事件
void keyboard(int key, int x, int y) {
switch (key) {
case GLUT_KEY_UP:
case GLUT_KEY_DOWN:
case GLUT_KEY_LEFT:
case GLUT_KEY_RIGHT:
if (abs(direction - key) != 2) { // 不能直接掉头
direction = key;
}
break;
}
}
// 更新画面
void timer(int value) {
if (!gameover) {
updateSnake();
checkCollision();
eatFood();
}
glutPostRedisplay();
glutTimerFunc(100, timer, 0);
}
int main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(COL * UNIT_SIZE, ROW * UNIT_SIZE);
glutCreateWindow("Snake Game");
init();
glutDisplayFunc(display);
glutSpecialFunc(keyboard);
glutTimerFunc(100, timer, 0);
glutMainLoop();
return 0;
}
```
该程序使用OpenGL库实现了一个基本的贪吃蛇游戏,具有以下特点:
- 可以控制蛇的方向,不能直接掉头;
- 食物随机生成,吃到食物可以加分;
- 碰到边界或自身会游戏结束;
- 显示得分和游戏结束信息。
你可以根据需要进行修改和优化。
阅读全文