在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. @atcoder - Japanese Student Championship 2019 Qualification - F@ Candy Retribution

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 请找到满足以下条件的长度为 N 的非负整数序列 A1, A2, ...

  2. Android 开源库StickyListHeadersListView来实现ListView列表分组效果

    项目中有一新的需求,要求能像一些Android机带"联系人列表"一样,数据可以自动分组,且在列表滑动过程中,列表头固定在顶部,效果图如下: 下面就带大家实现上面的效果, 首先,我们 ...

  3. Python--day72--Django内置的serializers序列化介绍

    序列化 Django内置的serializers def books_json(request): book_list = models.Book.objects.all()[0:10] from d ...

  4. Python--day19--time模块

    时间戳转化成结构化时间: 本地时间转换成时间字符串: 时间模块 和时间有关系的我们就要用到时间模块.在使用模块之前,应该首先导入这个模块. #常用方法 1.time.sleep(secs) (线程)推 ...

  5. POJ 1961 Period 还是next数组的含义、

    题意:求所给串的前缀(包括原串)中有多少循环串(子串长度至少要是周期的两倍) 思路:还是next数组的应用问题.如果不懂next数组的话 http://www.cnblogs.com/sasuke-/ ...

  6. PHP两个变量值互换(不用第三变量)

    <?php /**  * 双方变量为数字或者字符串时  * 使用list()和array()方法可以达到交换变量值得目的  */ $a = "This is A"; // a ...

  7. HDU 1051

    题意:给你n个木块的长和宽,现在要把它送去加工,这里怎么说呢,就是放一个木块花费一分钟,如果后面木块的长和宽大于等于前面木块的长和宽就不需要花费时间,否则时间+1,问把这个木块送去加工的最短时间. 思 ...

  8. [转载] linux、Solaris下xdmcp远程桌面服务

    原文链接 http://youlvconglin.blog.163.com/blog/static/52320420106243857254/ 使用图形界面远程登录linux和Solaris,首先要在 ...

  9. Spring Security-利用URL地址进行权限控制

    目的是:系统内存在很多不同的用户,每个用户具有不同的资源访问权限,具体表现就是某个用户对于某个URL是无权限访问的.需要Spring Security忙我们过滤. 参考:http://www.cnbl ...

  10. 买房的贷款时间是否是越长越好?https://www.zhihu.com/question/20842791

    买房的贷款时间是否是越长越好?https://www.zhihu.com/question/20842791