---恢复内容开始---

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>

//描述蛇的节点信息
typedef struct SnakeNode
{
int x;
int y;
} Snode;

//箱子:放置蛇的所有节点
Snode snakes[100];
//保存用户选择的方向
char dir='l'; // u d l r
//保存食物
Snode food;
//蛇身有效长度
int size=5;
//速度
int speed=300;

/**
自定义一个功能函数:给我一个坐标,我就能够把你定位
*/
void setPosition(int x,int y)
{
COORD point;
point.X=x;
point.Y=y;
//重置坐标
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),point);
}

/**
显示友好的游戏界面
*/
void wellcome()
{
setPosition(30,10);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),9);
printf("欢迎来到贪吃蛇的世界!");
setPosition(30,15);
//暂停
system("pause");
//清屏createFood
system("cls");
//输出操作提示
setPosition(30,10);
printf("使用向上、向下、向左、向右的方向键控制蛇的方向");
setPosition(30,11);
system("pause");
system("cls");
}

/*
功能模块:绘制围墙 1B=8bit A:1B 中文:2B
*/
void paintWall()
{
int index=0;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),11);
//上边。下边
for(index=0; index<58; index=index+2)
{
setPosition(index,0);
printf("■");
setPosition(index,26);
printf("■");
}
//左边、右边akes[0].x=oldX+2;
for(index=1; index<=26; index++)
{
setPosition(0,index);
printf("■");
setPosition(56,index);
printf("■");
}
}

/*检查新生成的食物的坐标是否和蛇身重合
*/
int isTogether(int x,int y)
{
int index=0;
for(index=0; index<size; index++)
{
if(snakes[index].x==x && snakes[index].y==y)
{
//重合
return 1;
}
}
//没有重合
return 0;
}

/*
创建食物
*/
void createFood()
{
//随机数字
//随机种子
int randX=0;
int randY=0;
srand(time(0));
//食物坐标随机
randY=rand()%24+1;
do
{
//只是能偶数
randX=rand()%54+2;
//检查是否和蛇身重合
}
while(!(randX%2==0 && isTogether(randX,randY)==0)) ;

food.x=randX;
food.y=randY;
setPosition(food.x,food.y);
printf("■");
}

/*
显示蛇:节点 蛇头 5节点
*/
void initSnake()
{
//蛇的节点起点位置
int x=24;
int y=5;
int index=0;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
//输出5个节点
for(index=0; index<size; index++, x=x+2)
{
//设置节点的坐标
snakes[index].x=x;
snakes[index].y=y;
setPosition(snakes[index].x,snakes[index].y);
printf("■");
}
}

/*
清除蛇身图形
*/
void clearSnake()
{
int index=0;
for(index=0; index<size; index++)
{
setPosition(snakes[index].x,snakes[index].y);
printf(" ");
}
}

/*
解析用户的按键,改变方向值
*/
void selDir()
{

if(GetAsyncKeyState(VK_UP) && dir!='d' )
{
dir='u';
}
else if(GetAsyncKeyState(VK_DOWN) && dir!='u' )
{
dir='d';
}
else if(GetAsyncKeyState(VK_LEFT) && dir!='r')
{
dir='l';
}
else if(GetAsyncKeyState(VK_RIGHT) && dir!='l')
{
dir='r';
}
}

/*
移动蛇
*/
void moveSnake()
{

//蛇头的原来坐标
int oldX=snakes[0].x;
int oldY=snakes[0].y;
//两个临时变量
int tempX=0;
int tempY=0;
int index=0;
//重置一个新坐标
switch(dir)
{
case 'u':
snakes[0].x=oldX;
snakes[0].y=oldY-1;
break;
case 'd':
snakes[0].x=oldX;
snakes[0].y=oldY+1;
break;
case 'l':
snakes[0].x=oldX-2;
snakes[0].y=oldY;
break;
case 'r':
snakes[0].x=oldX+2;
snakes[0].y=oldY;
break;
}

//检查蛇头是否和食物重合
if(snakes[0].x==food.x && snakes[0].y==food.y)
{
size++;
createFood();
speed-=50;
if(speed<=0){
speed=10;
}
}
//检查蛇头是否碰到墙
if( snakes[0].x<=2 || snakes[0].x>54 || snakes[0].y<1 || snakes[0].y>26 )
{
//碰到墙
system("cls");
printf("gameover");
system("pause");
exit(0);
}
//自己吃自己
for(index=1; index<size; index++)
{
if(snakes[0].x==snakes[index].x && snakes[0].y==snakes[index].y)
{
//碰到墙
system("cls");
printf("gameover");
system("pause");
exit(0);
}
}

setPosition(snakes[0].x,snakes[0].y);
printf("■");
//移动除了蛇头之外的节点
for(index=1; index<size; index++)
{
//在移动节点之前保存节点的坐标
tempX=snakes[index].x;
tempY=snakes[index].y;
//重新指定新坐标,前一个节点留下的空白
snakes[index].x=oldX;
snakes[index].y=oldY;
//指定光标点
setPosition(snakes[index].x,snakes[index].y);
printf("■");
//重置原坐标
oldX=tempX;
oldY=tempY;
}
}

//主函数:语法结构(固定)运行时候,起点
int main()
{
wellcome();
//绘制围墙
paintWall();
initSnake();
createFood();
//清除蛇原来的图形
while(1)
{
selDir();
clearSnake();
moveSnake();
Sleep(speed);
}
return 0;
}

---恢复内容结束---

c语言 贪食蛇小游戏的更多相关文章

  1. Javascript贪食蛇小游戏

    试玩:http://hovertree.com/game/9/ 贪吃蛇是一种风靡全球的小游戏,就是一条小蛇,不停地在屏幕上游走,吃各个方向出现的蛋,越吃越长.只要蛇头碰到屏幕四周,或者碰到自己的身子, ...

  2. 简单的C语言猜数字小游戏

    猜数字小游戏可谓是C语言最为基础的一个知识点了,我们可以在此基础上进行延伸,实现随机数的猜测,然后是加入再来一局的模式,等等.这里是抛砖引玉,希望你能做出你的经典之作. #include <st ...

  3. C语言实现2048小游戏

    目录 2048 一.设计思路 1.游戏规则 2.思路 二.代码实现 1.存储结构 2.初始化游戏数据 3.向左合并 4.其他方向合并 5.产生新的方块 6.源代码 7.实例演示 三.问题 2048 一 ...

  4. c语言----<项目>_小游戏<2048>

    2048 小游戏 主要是针对逻辑思维的一个训练. 主要学习方面:1.随机数产生的概率.2.行与列在进行移动的时候几种情况.3.MessageBox的使用 #include <iostream&g ...

  5. 【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!

    俄罗斯方块的核心玩法非常简单,所以制作起来并不是很复杂,我准备先用2篇文字的篇幅详细讲解一下俄罗斯方块的制作方法. 今天咱们算是第一篇,主要讲解俄罗斯方块中如何定义方块,以及如何实现方块的移动.旋转. ...

  6. 【C语言程序设计】小游戏之俄罗斯方块(二)!适合初学者上手、练手!

    第二篇,主要实现俄罗斯方块中的主体部分,包括容器的数据结构以及容器的相关操作,特别是大方块和容器之间的交互逻辑,包括碰撞检测,消除检测等等. 1. 容器的表示 大方块的实现涉及到位运算,而容器同样如此 ...

  7. C语言实现迷宫小游戏

    代码如下,时间太晚,有空补注释: #include<stdio.h> #include<string.h> #include<time.h> #include< ...

  8. c语言 弹弹球小游戏

    #include <stdio.h>#include <stdlib.h>#include <windows.h>#include <time.h>#i ...

  9. JavaScript贪食蛇游戏制作详解

    之前闲时开发过一个简单的网页版贪食蛇游戏程序,现在把程序的实现思路写下来,供有兴趣同学参考阅读. 代码的实现比较简单,整个程序由三个类,一组常量和一些游戏逻辑以外的初始化和控制代码组成,总共400多行 ...

随机推荐

  1. QTREE5 - Query on a tree V——LCT

    QTREE5 - Query on a tree V 动态点分治和动态边分治用Qtree4的做法即可. LCT: 换根后,求子树最浅的白点深度. 但是也可以不换根.类似平常换根的往上g,往下f的拼凑 ...

  2. 框架: Struts2 讲解 1

    一.框架概述 1.框架的意义与作用: 所谓框架,就是把一些繁琐的重复性代码封装起来,使程序员在编码中把更多的经历放到业务需求的分析和理解上面. 特点:封装了很多细节,程序员在使用的时候会非常简单. 2 ...

  3. C++ template一些体悟(3)

    其实没啥体悟,因为还没有感受到这些例子的作用,记一下先 #include <iostream> using namespace std; class alloc { }; template ...

  4. Adapter的getView

    http://blog.csdn.net/yelbosh/article/details/7831812 BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组 ...

  5. 拓展Unity3D编辑器

    /*** * * 编辑器创建新窗口,并设置窗口布局 * * * * * */ using System.Collections; using System.Collections.Generic; u ...

  6. 委托delegate

    委托delegate没有函数体.委托可以指向函数(要与指向的函数格式.类型相一致) namespace demo { public delegate double MyDelegate(double ...

  7. cookie猜数字游戏(下)------------以及cookie使用的不安全之处

    1.通过cookie可以解决上篇中多个用户对数据的修改,每个COOKIE保存不同用户的数据 <?php if(empty($_COOKIE['num'])||empty($_GET['num'] ...

  8. C++: 可变参数;

    可变参数,即参数的个数是动态变化的, 可多可少. 1. 可变参数: 可变参数一般采用”..."表示,用在宏上表示变参宏, 如: #define WriteLine(format,...) p ...

  9. python自动化开发-[第十一天]-Mysql

    今日概要: 1.初识mysql 2.MySQL的增删改查 3.主键.外键 4.组合和分组 一.数据库的由来 1.什么是数据库? 数据的仓库,在ATM,购物车中存储数据为目录,称为数据库 1.数据以表格 ...

  10. Linux系统中/etc/rc.local和/etc/rc.d/rc.local的区别

    /etc/rc.d/rc.local 用于添加开机启动命令 /etc/rc.local是/etc/rc.d/rc.local的软连接