在800*600的地图上,蛇的初始长度为3节,用数组记录每一节的位置(每个正方形左上角的坐标),每一节为长度为10的正方形,初始方向向右。随机生成30个障碍物的的位置,随机生成食物的位置。吃到食物之后(即蛇头与食物位置相同),蛇的长度增加一节,每次移动时将数组的每一个元素向后移一位,第一位根据方向改变坐标。这样最后一位坐标在没吃到食物时会移到无法表现出来的位置,也可以用于吃到食物时的增长。

移动之后判断是否碰到障碍物或出界或咬到自身,用窗口命令提示游戏结束,并跳出死循环,程序结束。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<graphics.h>
#include<time.h>
#include<conio.h>
using namespace std;
struct point{
int x,y;
}obstacle[];
struct {
int num;
struct point xy[];
int dir;
}snake;
struct {
struct point xy;
int flag; }food;
void drawsnake() {
int i;
for (i = ; i < snake.num; i++) {
setlinecolor(BLACK);
setfillcolor(RGB((rand() % ), (rand() % ), (rand() % )));
fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + , snake.xy[i].y + );
}
}
void movesnake() {
int i = snake.num;
for (; i > ; i--) {
snake.xy[i].x = snake.xy[i - ].x;
snake.xy[i].y = snake.xy[i - ].y;
}
switch (snake.dir) {
case :snake.xy[].y -= ;
break;
case :snake.xy[].y += ;
break;
case :snake.xy[].x -= ;
break;
case :snake.xy[].x += ;
break;
}
}
bool check() {
int i;
for (i = ; i < snake.num; i++) {
if (snake.xy[].x == snake.xy[i].x&&snake.xy[].y == snake.xy[i].y) {
return false;
}
}
if (snake.xy[].x < || snake.xy[].y < || snake.xy[].y> || snake.xy[].x>) {
return false;
}
for (i = ; i < ; i++) {
if (snake.xy[].x == obstacle[i].x&&snake.xy[].y == obstacle[i].y) {
return false;
}
}
}
void keyDown() {
char ch = '\0';
ch = _getch();
switch (ch) {
case 'd':
case 'D':
if (snake.dir != ) {
snake.dir = ;
}
break;
case 'w':
case 'W':
if (snake.dir != ) {
snake.dir = ;
}
break;
case 'a':
case 'A':
if (snake.dir != ) {
snake.dir = ;
}
break;
case 's':
case 'S':
if (snake.dir != ) {
snake.dir = ;
}
break;
default:
break;
}
}
void drawob() {
int i;
setlinecolor(BLACK);
setfillcolor(BLACK);
for (i = ; i < ; i++) {
fillrectangle(obstacle[i].x, obstacle[i].y, obstacle[i].x + , obstacle[i].y + );
}
}
int main() {
srand((unsigned int)time());
HWND hwnd=initgraph(, );
setbkcolor(RGB(, , ));
cleardevice();
snake.num = ;
snake.xy[].x = ;
snake.xy[].x = ;
snake.xy[].x = ;
snake.xy[].y = ;
snake.xy[].y = ;
snake.xy[].y = ;
snake.dir = ;
food.flag = ;
int i; for (i = ; i < ; i++) {
obstacle[i].x = rand() % * + ;
obstacle[i].y = rand() % * + ; }
drawsnake();
while () {
if (food.flag == ) {
food.flag = ;
food.xy.x = rand() % * ;
food.xy.y = rand() % * ;
}
movesnake();
if (snake.xy[].x == food.xy.x&& snake.xy[].y == food.xy.y) {
food.flag = ;
snake.num++;
}
if (check() == false) {
MessageBox(hwnd, "Gameover","Game over!",);
break;
}
cleardevice();
setlinecolor(BLACK);
setfillcolor(WHITE);
fillrectangle(food.xy.x, food.xy.y, food.xy.x + , food.xy.y + );
drawsnake();
drawob();
char text[];
settextcolor(BLACK);
outtextxy(, , "WASD控制");
sprintf(text, "num=%d", snake.num);
outtextxy(, , text);
while (_kbhit() ){
keyDown();
}
Sleep();
}
//system("pause");
return ;
}

C++简单项目--贪吃蛇的更多相关文章

  1. GUI简单实战——贪吃蛇

    将前面学到的GUI基础知识完成实战,完成一个简单的贪吃蛇项目 项目功能 用键盘上下左右实现贪吃蛇的自动移动 贪吃蛇吃到食物后,长度加一,分数加一 贪吃蛇吃到自己的身体,则游戏结束 按空格键实现游戏的暂 ...

  2. C#简单实现贪吃蛇程序(LinQ + Entity)

    做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity) 最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类 ...

  3. TOJ 3973 Maze Again && TOJ 3128 简单版贪吃蛇

    TOJ3973传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3973 时间限制(普通 ...

  4. Java一个简单的贪吃蛇

    Java一个简单的贪吃蛇 虽然GUI已经要淘汰了,但是手动写写界面还是有助于理解语法的,像构造函数 ,函数调用,内部类,继承,接口.有助于半初学者强化理解. 直接上代码 游戏主体类: package ...

  5. 做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)

    最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类似的情况,白天一直想不通的问题,晚上做梦有时会想到更好的版本,于是 ...

  6. JavaScript实践-简单的贪吃蛇小游戏

    实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...

  7. d3.js 制作简单的贪吃蛇

    d3.js是一个不错的可视化框架,同时对于操作dom也是十分方便的.今天我们使用d3.js配合es6的类来制作一个童年小游戏–贪吃蛇.话不多说先上图片. 1. js snaker类 class Sna ...

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

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

  9. 用OpenGL简单编写的一个最简单贪吃蛇游戏

    刚学OpenGL的时候,写的一个最简单的贪吃蛇游戏代码 如下: //贪吃蛇游戏 #include<stdio.h> #include<stdlib.h> #include< ...

随机推荐

  1. mysql数据库之单表查询

    单标查询 单表查询语句 关键字执行的优先级 简单查询 where约束 group by 聚合函数 HAVING过滤 order by 查询排序 LIMIT限制查询的记录数 使用正则表达式查询 单表查询 ...

  2. mysql数据库之mysql下载与设置

    下载和安装mysql数据库 mysql为我们提供了开源的安装在各个操作系统上的安装包,包括ios,liunx,windows. mysql的安装,启动和基础配置-------linux版本 mysql ...

  3. 2019徐州网络赛 I.query

    这题挺有意思哈!!!看别人写的博客,感觉瞬间就懂了. 这道题大概题意就是,给一串序列,我们要查找到l-r区间内,满足min(a[ i ],a[ j ]) = gcd(a[ i ],a[ j ]) 其实 ...

  4. springboot&mybatis 增删改查系列(一)

    创建父项目 首先,我们需要创建一个Maven项目. 在这个项目的pom文件中加入以下几个依赖: <!-- spring boot --> <parent> <groupI ...

  5. SSM整合 mybatis多条件查询与分页

    多条件查询与分页: 通过页面的houseName.floorage获取值传到前端视图(HouseSearchVO)实体类中的houseName,floorage建立houseSearchVO对象. 通 ...

  6. H3C 虚拟模板方式配置PPP MP

  7. 基于ThinkPHP与阿里大于的PHP短信验证功能

    https://blog.csdn.net/s371795639/article/details/53381274 PHP阿里大鱼短信验证 第一步 登陆阿里大于注册账号,在用户管理中心创建应用,确定A ...

  8. P1103 走迷宫三

    题目描述 大魔王抓住了爱丽丝,将她丢进了一口枯井中,并堵住了井口. 爱丽丝在井底发现了一张地图,他发现他现在身处一个迷宫当中,从地图中可以发现,迷宫是一个N*M的矩形,爱丽丝身处迷宫的左上角,唯一的出 ...

  9. H3C 动态路由协议在协议栈中的位置

  10. C# 在 8.0 对比 string 和 string? 的类型

    在 C# 8.0 的时候提供了可空字符串的判断,但是可空字符串和字符串的类型是不是不同的? 打开 VisualStudio 2019 这时就不能再使用 VisualStudio 2017 因为不支持 ...