可以提供一个C语言OpenGL编写的双人贪吃蛇代码吗
时间: 2024-02-09 16:08:40 浏览: 25
当然可以,以下是一个简单的C语言OpenGL编写的双人贪吃蛇游戏代码,代码实现了基本的双人贪吃蛇游戏功能,包括两个玩家的控制、蛇的移动、食物的生成、碰撞检测等。
```c
#include <GL/glut.h>
#include <stdlib.h>
#include <time.h>
// 定义窗口大小
#define WINDOW_WIDTH 600
#define WINDOW_HEIGHT 600
// 定义蛇的长度和方向
#define SNAKE_MAX_LENGTH 100
#define SNAKE_LEFT 0
#define SNAKE_RIGHT 1
#define SNAKE_UP 2
#define SNAKE_DOWN 3
// 定义游戏状态
#define GAME_START 0
#define GAME_OVER 1
int game_state = GAME_START;
int winner = 0;
int snake_length[2] = {4, 4};
int snake_direction[2] = {SNAKE_RIGHT, SNAKE_LEFT};
int snake_x[2][SNAKE_MAX_LENGTH];
int snake_y[2][SNAKE_MAX_LENGTH];
int food_x, food_y;
void init()
{
// 初始化蛇的位置和长度
snake_x[0][0] = 10;
snake_y[0][0] = 10;
snake_x[0][1] = 9;
snake_y[0][1] = 10;
snake_x[0][2] = 8;
snake_y[0][2] = 10;
snake_x[0][3] = 7;
snake_y[0][3] = 10;
snake_x[1][0] = WINDOW_WIDTH / 10 - 11;
snake_y[1][0] = WINDOW_HEIGHT / 10 - 11;
snake_x[1][1] = WINDOW_WIDTH / 10 - 10;
snake_y[1][1] = WINDOW_HEIGHT / 10 - 11;
snake_x[1][2] = WINDOW_WIDTH / 10 - 9;
snake_y[1][2] = WINDOW_HEIGHT / 10 - 11;
snake_x[1][3] = WINDOW_WIDTH / 10 - 8;
snake_y[1][3] = WINDOW_HEIGHT / 10 - 11;
// 初始化食物的位置
srand((unsigned)time(NULL));
food_x = rand() % (WINDOW_WIDTH / 10);
food_y = rand() % (WINDOW_HEIGHT / 10);
}
void draw_snake(int player)
{
int i;
if (player == 0) {
glColor3f(1.0, 0.0, 0.0); // 设置蛇的颜色
} else {
glColor3f(0.0, 0.0, 1.0); // 设置蛇的颜色
}
for (i = 0; i < snake_length[player]; i++) {
glRectd(snake_x[player][i] * 10, snake_y[player][i] * 10, (snake_x[player][i] + 1) * 10, (snake_y[player][i] + 1) * 10);
}
}
void draw_food()
{
glColor3f(0.0, 1.0, 0.0); // 设置食物的颜色
glRectd(food_x * 10, food_y * 10, (food_x + 1) * 10, (food_y + 1) * 10);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT); // 清空屏幕
if (game_state == GAME_START) {
draw_snake(0); // 绘制蛇1
draw_snake(1); // 绘制蛇2
draw_food(); // 绘制食物
} else {
// 游戏结束,显示提示信息
char str[20];
if (winner == 0) {
sprintf(str, "Player 1 Wins!");
glColor3f(1.0, 0.0, 0.0);
} else {
sprintf(str, "Player 2 Wins!");
glColor3f(0.0, 0.0, 1.0);
}
glRasterPos2d(WINDOW_WIDTH / 2 - 80, WINDOW_HEIGHT / 2);
glutBitmapString(GLUT_BITMAP_HELVETICA_18, str);
}
glFlush();
}
void move_snake(int player)
{
int i;
// 移动蛇的身体
for (i = snake_length[player] - 1; i > 0; i--) {
snake_x[player][i] = snake_x[player][i - 1];
snake_y[player][i] = snake_y[player][i - 1];
}
// 移动蛇的头部
switch (snake_direction[player]) {
case SNAKE_LEFT:
snake_x[player][0]--;
break;
case SNAKE_RIGHT:
snake_x[player][0]++;
break;
case SNAKE_UP:
snake_y[player][0]++;
break;
case SNAKE_DOWN:
snake_y[player][0]--;
break;
}
// 判断是否吃到食物
if (snake_x[player][0] == food_x && snake_y[player][0] == food_y) {
snake_length[player]++;
// 重新生成食物
food_x = rand() % (WINDOW_WIDTH / 10);
food_y = rand() % (WINDOW_HEIGHT / 10);
}
// 判断是否碰到边界或自身
if (snake_x[player][0] < 0 || snake_x[player][0] >= WINDOW_WIDTH / 10 || snake_y[player][0] < 0 || snake_y[player][0] >= WINDOW_HEIGHT / 10) {
game_state = GAME_OVER; // 碰到边界,游戏结束
if (player == 0) {
winner = 1;
} else {
winner = 0;
}
}
for (i = 1; i < snake_length[player]; i++) {
if (snake_x[player][0] == snake_x[player][i] && snake_y[player][0] == snake_y[player][i]) {
game_state = GAME_OVER; // 碰到自身,游戏结束
if (player == 0) {
winner = 1;
} else {
winner = 0;
}
}
}
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'w':
if (snake_direction[0] != SNAKE_DOWN) {
snake_direction[0] = SNAKE_UP;
}
break;
case 's':
if (snake_direction[0] != SNAKE_UP) {
snake_direction[0] = SNAKE_DOWN;
}
break;
case 'a':
if (snake_direction[0] != SNAKE_RIGHT) {
snake_direction[0] = SNAKE_LEFT;
}
break;
case 'd':
if (snake_direction[0] != SNAKE_LEFT) {
snake_direction[0] = SNAKE_RIGHT;
}
break;
case 'i':
if (snake_direction[1] != SNAKE_DOWN) {
snake_direction[1] = SNAKE_UP;
}
break;
case 'k':
if (snake_direction[1] != SNAKE_UP) {
snake_direction[1] = SNAKE_DOWN;
}
break;
case 'j':
if (snake_direction[1] != SNAKE_RIGHT) {
snake_direction[1] = SNAKE_LEFT;
}
break;
case 'l':
if (snake_direction[1] != SNAKE_LEFT) {
snake_direction[1] = SNAKE_RIGHT;
}
break;
case 'r':
if (game_state == GAME_OVER) {
game_state = GAME_START;
winner = 0;
snake_length[0] = 4;
snake_length[1] = 4;
init();
}
break;
}
}
void timer(int value)
{
if (game_state == GAME_START) {
move_snake(0); // 移动蛇1
move_snake(1); // 移动蛇2
}
glutPostRedisplay();
glutTimerFunc(100, timer, 0);
}
int main(int argc, char**