刚学OpenGL的时候,写的一个最简单的贪吃蛇游戏代码 如下:

//贪吃蛇游戏
#include<stdio.h>
#include<stdlib.h>
#include<gl/GLUT.H>
#include<time.h>
#define UP 10 //上
#define DOWN -10//下
#define LEFT -1//左
#define RIGHT 1//右
#define NODE_WIDTH 10;//蛇身节点正方形的宽度
#define STEP_SIZE 10;//运动步长
#define PANEL_WIDTH 500;//面板长度
#define PANEL_HEIGHT 400;//面板宽度
int dir = RIGHT;//运动方向,初始化为右
struct node//节点结构
{
int x;//x坐标
int y;//y坐标
struct node *prev;//前一个节点
struct node *next;//后一个节点
};
struct snake//蛇结构
{
struct node *head;//头部
struct node *tail;//尾部
int node_count;//节点个数
};
struct snake *sn;//蛇
struct node *food;//食物
void snake_init()//蛇的初始化
{
sn = (struct snake *)malloc(sizeof(struct snake));
food = (struct node *)malloc(sizeof(struct node));
food->x = ;
food->y = ;
node *head = (struct node *)malloc(sizeof(struct node));
node *tail = (struct node *)malloc(sizeof(struct node));
head->x = ;
head->y = ;
tail->x = ;
tail->y = ;
head->next = tail;
tail->prev = head;
sn->head = head;
sn->tail = tail;
sn->node_count = ;
}
//添加一个节点到头部
void add_head(node *n)
{
n->next = sn->head;
sn->head->prev = n;
sn->head = n;
}
//删除尾部
void remove_tail()
{
node *old_tail = sn->tail;
sn->tail = sn->tail->prev;//重新指定尾节点
free(old_tail);//释放删除的尾节点
}
bool snake_contain(int x, int y)
{
node *node = sn->head;
for (int i = ; i < sn->node_count; i++)
{
if ((abs(node->x - x)<=&&abs(node->y - y)<=))//食物与蛇身的距离不能同时小于6才不会碰到,反正同时小于6就会包含
{
return true;
}
node = node->next;
}
return false;
}
//新食物
void new_food()
{
int width = PANEL_WIDTH;
int height = PANEL_HEIGHT;
int node_width = NODE_WIDTH;
int x = rand()%width;
int y = rand()%height;
//要满足的条件
// x < PANEL_WIDTH - NODE_WIDTH; PANEL_HEIGHT-NODE_WIDTH< y
// abs(x- sn->head)&&abs(x->)
while (snake_contain(x, y) && x < (height - node_width) && y>(height - node_width))
{
x = rand()%PANEL_WIDTH;
y = rand()%PANEL_HEIGHT;
}
food->x = x;
food->y = y;
} bool is_eat(node * n)
{
return abs(n->x - food->x)< &&abs(n->y - food->y)< ;
}
//前进
void step(int go_dir)
{
if ((dir + go_dir) != )//如果不是朝相反的方向
{
dir = go_dir;
//求蛇运动下一步的坐标点,这里运用了数字技巧
int x = sn->head->x + (dir%)*STEP_SIZE;
int y = sn->head->y + (dir/)*STEP_SIZE;
struct node *n = (struct node *)malloc(sizeof(struct node));
n->x = x;
n->y = y;
if (is_eat(n))
{
add_head(n);
new_food();
sn->node_count++;
}
else
{
add_head(n);
remove_tail();
} } }
//重绘
void repaint(int a)
{
//画蛇身
node *node = sn->head;
for (int i = ; i < sn->node_count; i++)
{
int x = node->x;
int y = node->y;
int lx = x-NODE_WIDTH;
int ly = y;
int rx = x;
int ry = y-NODE_WIDTH;
//glColor3f(1.0f, 0.0f, 0.0f);
glRectf(lx,ly,rx,ry);
node = node->next;
}
//画食物
int lx = food->x - NODE_WIDTH;
int ly = food->y;
int rx = food->x;
int ry = food->y - NODE_WIDTH;
glRectf(lx,ly,rx,ry);
}
void time_func(int a)
{
step(dir);
glutPostRedisplay();//重绘
glutTimerFunc(,time_func,);
} void Initial(void)
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //设置窗口背景色为白色
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,500.0,0.0,400.0);
} void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);//用当前背景色填充窗口
glColor3f(1.0f, 0.0f, 0.0f);//设置当前的绘图颜色为红色
//glRectf(50.0f, 100.0f, 60.0f, 90.0f);//绘制一个矩形
/*glBegin(GL_TRIANGLES);
glColor3f(1, 1, 0);
glVertex2f(250, 400);
glColor3f(0, 1, 1);
glVertex2f(50, 300);
glColor3f(1, 0, 1);
glVertex2f(450, 300);
glEnd();
*/
repaint(dir);
glFlush();
} void key_turn(unsigned char key, int x, int y)
{
switch (key)
{
case 'w':
step(UP);
break;
case 's':
step(DOWN);
break;
case 'a':
step(LEFT);
break;
case 'd':
step(RIGHT);
break;
}
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
snake_init();
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);//初始化窗口的显示模式
glutInitWindowSize(, );//设置窗口的尺寸
glutInitWindowPosition(, ); //设置窗口的位置
glutCreateWindow("矩形"); //创建一个名为矩形的窗口
glutDisplayFunc(Display);
Initial();
glutKeyboardFunc(key_turn);
glutTimerFunc(,time_func,);//计数器
glutMainLoop();
return ;
}

用OpenGL简单编写的一个最简单贪吃蛇游戏的更多相关文章

  1. 一个原生JS实现的不太成熟的贪吃蛇游戏

    一个初初初初级前端民工 主要是记录一下写过的东西,复习用 大佬们如果看到代码哪里不符合规范,或者有更好写法的,欢迎各位批评指正 十分感谢 实现一个贪吃蛇游戏需要几步? 1.有地图 2.有蛇 3.有食物 ...

  2. 使用TypeScript实现简单的HTML5贪吃蛇游戏

    TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架构师,已 ...

  3. js编写简单的贪吃蛇游戏

    css代码 *{ margin:; padding:; } td{ width: 4px; height: 4px; background: #ccc; border: 2px solid #ccc; ...

  4. Android快乐贪吃蛇游戏实战项目开发教程-03虚拟方向键(二)绘制一个三角形

    该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.绘制三角形 在上一篇文章中,我们已经新建了虚拟方向键的自定义控件Direct ...

  5. python 写一个贪吃蛇游戏

    #!usr/bin/python #-*- coding:utf-8 -*- import random import curses s = curses.initscr() curses.curs_ ...

  6. 第一个windows 小游戏 贪吃蛇

    最近用dx尝试做了一个小的贪吃蛇游戏,代码放到github上面:https://github.com/nightwolf-chen/MyFreakout 说一下自己实现的过程: 首先,我把蛇这个抽象成 ...

  7. Python实例:贪吃蛇(简单贪吃蛇编写)🐍

    d=====( ̄▽ ̄*)b 叮~ Python -- 简易贪吃蛇实现 目录: 1.基本原理 2.需要学习的库 3.代码实现 1.基本原理 基本贪吃蛇所需要的东西其实很少,只需要有一块让蛇动的屏幕, 在 ...

  8. 如何用Python写一个贪吃蛇AI

    前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势的地方了. 问题的关键在于,图片中的贪吃蛇真的很贪吃XD, ...

  9. 贪吃蛇小游戏—C++、Opencv编写实现

    贪吃蛇游戏,C++.Opencv实现 设计思路: 1.显示初始画面,蛇头box初始位置为中心,食物box位置随机 2.按随机方向移动蛇头,按a.s.d.w键控制移动方向,分别为向左,向下,向右,向上 ...

随机推荐

  1. Linux下设置文件权限

    文件权限示意图: 第一步:在终端创建用户 增加用户 useradd 用户名 设置密码 passwd 用户名 通过上述两条命令创建a1,a2两个用户. 第二步:在根目录使用管理员账号创建一个文件 在使用 ...

  2. Java常见面试题总结

    一.Java基础 1.String类为什么是final的. 2.HashMap的源码,实现原理,底层结构. 3.说说你知道的几个Java集合类:list.set.queue.map实现类咯... 4. ...

  3. SCOI2015酱油记

    Orz怒跪ns高一进A队,常规还是年级rank1,把gerw都下了一跳. Day1还是拿了点分的,调了半天T3终于调出来了(果然xlk大神可信),加上T1暴力有120(跟爆蛋有什么区别).T1大概有2 ...

  4. 搜索-hdu-3720-Arranging Your Team

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3720 题目大意: 有23个人,告诉每个人的名字,能力值,以及踢球的位置.要求选出1个守门员,2个前锋 ...

  5. RT: np - new sbt project generation made simple(r)

    np - new sbt project generation made simple(r) As pointed out in the comments by @0__ below, there's ...

  6. [转] linux系统文件流、文件描述符与进程间关系详解

    http://blog.sina.com.cn/s/blog_67b74aea01018ycx.html linux(unix)进程与文件的关系错综复杂,本教程试图详细的阐述这个问题. 包括:     ...

  7. Android - 软件自动更新的实现(转)

    在客户端实现更新操作 涉及到三个技术: 1.xml文件的解析 2.HttpURLConnection连接 3.文件流I/O 这里创建一个解析xml文件的服务类:ParXmlService.java p ...

  8. Android(java)学习笔记220:开发一个多界面的应用程序之界面间数据传递

    1.界面跳转的数据传递 (1)intent.setData() --> intent.getData():     传递的数据比较简单,一般是文本类型的数据String:倘若我们传递的数据比较复 ...

  9. Android(java)学习笔记248:ContentProvider使用之虚拟短信

    1.虚拟短信应用场景:   急着脱身?应付老婆(老公.男女朋友查岗)?   使用虚拟通话短信吧.您只需通过简单设置,软件就会在指定时间会模拟一个“真实”来电或短信来迷惑对方,通过“真实”的证据让对方相 ...

  10. sublime text3 插件配置

    (转) sublme text 全程指引:http://www.cnblogs.com/figure9/p/sublime-text-complete-guide.html 使用Package Con ...