使用opengl制作简易贪吃蛇小游戏

 这个代码主要运用链表来表示蛇和模拟蛇行动,编译一下就能用。。。。

#include<iostream>
#include<algorithm>
#include<functional>
#include<cstdlib>
#include<cstdio>
#include<gl/glut.h>
#include<vector>
#include<Windows.h>
#include<cmath>
#include<map>
using namespace std;
int TILE_WIDTH = 32;
int TILE_HEIGHT = 32;
const int TILE_COLUMN = 20;
const int TILE_ROW = 20;
const int dt = 33;
#define DIR_UP    0
#define DIR_DOWN  1
#define DIR_LEFT  2
#define DIR_RIGHT 3
#define GL_PI 3.1415f
int dir = DIR_RIGHT;
int flag = 1;
GLint gg = 0;
GLint kk = 0;
int aa, bb;
int x, y, yes = 0;
int Dir=0;
float snake_x = 0;
float snake_y = 0;
float snake_v = 3;
float food_x = 10;
float food_y = 5;
int time = 300;
struct snake {
	int head_x;
	int head_y;
	struct snake *next;
};
snake *h = new snake;
map<vector<int> , int> m;
map< vector<int>, int>::iterator iter;
void ChangeSize(int w, int h)
{
	GLfloat nRange = 100.0f;
	if (h == 0)
		h = 1;
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(0.0f, TILE_COLUMN*TILE_WIDTH, TILE_ROW*TILE_HEIGHT, 0, -1, 1);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}
void SetupRC()
{
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
	glColor3f(0.0f, 1.0, 0.0f);
}
void snake_M()
{
	snake *head;
	snake *node;
	head = h;
	head->head_x = 2;
	head->head_y = 0;
	for (int i = 1; i >=0; i--)
	{
		node = new snake;
		node->head_x = i;
		node->head_y = 0;
		head->next = node;
		head = node;
	}
	node->next = NULL;
	vector<int> s;
	s.push_back(2);
	s.push_back(0);
	m[s] = 1;
	s.clear();
	s.push_back(1);
	s.push_back(0);
	m[s] = 1;
	s.clear();
	s.push_back(0);
	s.push_back(0);
	m[s] = 1;
	return;
}
void RenderScene(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
	glPointSize(TILE_HEIGHT);
	glColor3f(0.0f, 0.0, 1.0f);
	glBegin(GL_POINTS);
	if (flag)
	{
		glVertex3f((TILE_WIDTH)*(h->head_x) + (TILE_WIDTH / 2), (TILE_HEIGHT)*(h->head_y) + (TILE_HEIGHT / 2), 0.0f);
		snake *hh;
		hh = h->next;
		glColor3f(0.0f, 1.0f, 0.0f);
		while (1)
		{
			glVertex3f((TILE_WIDTH)*(hh->head_x) + (TILE_WIDTH / 2), (TILE_HEIGHT)*(hh->head_y) + (TILE_HEIGHT / 2), 0.0f);
			if (hh->next == NULL)
			{
				if (yes)
				{
					int ans = 0;
					snake *ss = new snake;
					ss->head_x = x;
					ss->head_y = y;
					hh->next = ss;
					ss->next = NULL;
					glVertex3f((TILE_WIDTH)*(ss->head_x) + (TILE_WIDTH / 2), (TILE_HEIGHT)*(ss->head_y) + (TILE_HEIGHT / 2), 0.0f);
					yes = 0;
				}
				break;
			}
			hh = hh->next;
		}
		glColor3f(1.0f, 0.0f, 0.0f);
		glVertex3f((TILE_WIDTH)*aa + (TILE_WIDTH / 2), (TILE_HEIGHT)*bb + (TILE_HEIGHT / 2), 0.0f);
		glEnd();
	}
	else
	{
		glPointSize(1.0f);
		glClear(GL_COLOR_BUFFER_BIT);
		glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
		glBegin(GL_TRIANGLE_FAN);
		glColor3f(1.0f, 1.0f, 1.0f);
		glVertex2f(0.0f, 0.0f);
		for (int i = 0; i <= 8; i++)
		{
			glColor3f(i & 0x04, i & 0x02, i & 0x01);
			glVertex2f(cos(i*GL_PI / 4), sin(i*GL_PI / 4));
		}
		glEnd();
		glFlush();
	}
	glPopMatrix();
	glutSwapBuffers();
}
void processNormalKeys(int key, int x, int y)
{
	switch (key)
	{
	case GLUT_KEY_RIGHT: {
		Dir = 3;
		break;
	}
	case GLUT_KEY_LEFT: {
		Dir = 4;
		break;
	}
	case GLUT_KEY_UP: {
		Dir = 2;
		break;
	}
	case GLUT_KEY_DOWN: {
		Dir = 1;
		break;
	}
	}
	return;
}
void timerFunction(int value)
{
	snake *Z;
	int xx, yy;
	if (Dir != 0)
	{
		int ans = 1;
		Z = h->next;
		x = h->head_x;
		y = h->head_y;
		while (1)
		{
			xx = Z->head_x;
			yy = Z->head_y;
			Z->head_x = x;
			Z->head_y = y;
			x = xx;
			y = yy;
			Z = Z->next;
			if (Z == NULL)
				break;
		}
	}
	vector<int> s2;
	s2.push_back(x);
	s2.push_back(y);
	switch (Dir)
	{
	case 0: {
		break;
	}
	case 1: {
		h->head_y++;
		if (h->head_y == 20)
			h->head_y = 0;
		break;
	}
	case 2: {
		h->head_y--;
		if (h->head_y == -1)
			h->head_y = 19;
		break;
	}
	case 3: {
		h->head_x++;
		if (h->head_x == 20)
			h->head_x = 0;
		break;
	}
	case 4: {
		h->head_x--;
		if (h->head_x == -1)
			h->head_x = 19;
		break;
	}
	}
	if (h->head_x == aa && h->head_y == bb)
	{
		if(time!=50)
			time -= 10;
		aa = rand() % 19;
		bb = rand() % 19;
		vector<int>s5;
		s5.push_back(aa);
		s5.push_back(bb);
		iter = m.find(s5);
		while (iter != m.end())
		{
			aa = rand() % 19;
			bb = rand() % 19;
			s5.clear();
			s5.push_back(aa);
			s5.push_back(bb);
			iter = m.find(s5);
		}
		yes = 1;
	}
	else
	{
		if (Dir != 0)
		{
			iter = m.find(s2);
			if (iter != m.end())
				m.erase(iter);
		}
	}
	vector<int>s1;
	s1.push_back(h->head_x);
	s1.push_back(h->head_y);
	iter = m.find(s1);
	if (iter != m.end()&&Dir!=0)
	{
		flag = 0;
	}
	m[s1] = 1;
	glutPostRedisplay();
	if(flag)
	glutTimerFunc(time, timerFunction, 1);
}
int main(int argc, char* argv[])
{
	aa = rand()%19;
	bb = rand()%19;
	snake_M();
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
	glutInitWindowSize(TILE_WIDTH*TILE_COLUMN, TILE_HEIGHT*TILE_ROW);
	glutCreateWindow("Snake");
	glutReshapeFunc(ChangeSize);
	glutDisplayFunc(&RenderScene);
	glutSpecialFunc(processNormalKeys);
	glutTimerFunc(time, timerFunction, 1);
	//SetupRC();
	glutMainLoop();
//	pair<int, int> p;
}

猜你喜欢

转载自blog.csdn.net/usernamezzz/article/details/82777120