C语言实现贪吃蛇
日期:2018.9.11
用时:150min
项目:贪吃蛇(C语言--数组 结构体实现)
开发工具:vs2013
关键知识:数组,结构体,图形库,键位操作
源代码:
#include<stdio.h>
#include<graphics.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h> #define N 200
int i, key;
int score = ;
int gamespeed = ; void init(void);
void Draw();
void Playgame();
void Prscore();
void Gameover(); struct Food {
int x;
int y;
int yes;
}food; struct Snake{
int x[N];
int y[N];
int node;
int direcion;
int life;
}snake; void main()
{
init();
Draw();
Playgame();
_getch();
} void init(void)
{
initgraph(,);
setbkcolor(WHITE);
cleardevice();
} void Draw()
{
setcolor(BLACK);
for (i = ; i <= ; i += )
{
rectangle(i, , i + , );
rectangle(i, , i + , );
}
for (i = ; i <= ; i += )
{
rectangle(, i, , i + );
rectangle(, i, , i + );
}
} void Playgame()
{
srand((unsigned)time(NULL));//用时间做种,每次产生的随机数不一样。
food.yes = ;//1表示需要出现食物,0表示已有食物
snake.life = ;//0,活着,1 死亡
snake.direcion = ;
snake.x[] = ; snake.y[] = ;
snake.x[] = ; snake.y[] = ;
snake.node = ;
Prscore();
while ()
{
while (!_kbhit())
{
if (food.yes == )
{
food.x = rand() % + ;
food.y = rand() % + ;
while (food.x % != )
food.x++;
while (food.y % != )
food.y++;
food.yes = ;
}
if (food.yes == )
{
setcolor(RED);
rectangle(food.x, food.y, food.x + , food.y + );
}
for (i = snake.node - ; i > ; i--)
{
snake.x[i] = snake.x[i - ];
snake.y[i] = snake.y[i - ];
}
switch (snake.direcion)
{
case :snake.x[] += ; break;
case :snake.x[] -= ; break;
case :snake.y[] -= ; break;
case :snake.y[] += ; break;
}
for (i = ; i < snake.node; i++)
{
if (snake.x[i] == snake.x[] && snake.y[i] == snake.y[])
{
Gameover();
snake.life = ;
break;
}
}
if (snake.x[]< || snake.x[]> || snake.y[]< || snake.y[]>)
{
Gameover();
snake.life = ;
}
if (snake.life == )
break;
if (snake.x[] == food.x&&snake.y[] == food.y)
{
setcolor(BLACK);
rectangle(food.x, food.y, food.x + , food.y + );
snake.x[snake.node] = -; snake.y[snake.node] = -;
snake.node++;
food.yes = ;
score += ;
Prscore();
}
setcolor(GREEN);
for (i = ; i < snake.node; i++)
rectangle(snake.x[i], snake.y[i],snake.x[i] + , snake.y[i] + );
if (food.yes == )
{
if (gamespeed >= )
gamespeed -= ;// 速度最大不超过
} Sleep(gamespeed);
setcolor(WHITE);
rectangle(snake.x[snake.node - ], snake.y[snake.node - ], snake.x[snake.node-] + , snake.y[snake.node - ] + );
}
if (snake.life == )
break;
switch (_getch())
{
case 'w':
case 'W':
if (snake.direcion != )
{
snake.direcion = ;
}
break;
case 'd':
case 'D':
if (snake.direcion != )
{
snake.direcion = ;
}
break;
case 'a':
case 'A':
if (snake.direcion != )
{
snake.direcion = ;
}
break;
case 's':
case 'S':
if (snake.direcion != )
{
snake.direcion = ;
}
break;
}
}
} void Prscore()
{
char str[];
setfillstyle(SOLID_FILL, YELLOW);
bar(, , , );
setcolor();
sprintf_s(str, "score:%d", score);
outtextxy(, , str);
} void Gameover()
{
cleardevice();
setbkcolor(WHITE);
Prscore();
setcolor(RED);
settextstyle(, , "楷体");
outtextxy(, , "GAME OVER");
_getch();
}
运行截图:


C语言实现贪吃蛇的更多相关文章
- C语言之贪吃蛇
利用链表的贪吃蛇,感觉自己写的时候还是有很多东西不熟悉, 1.预编译 2.很多关于系统的头文件也不是很熟悉 3.关于内存 第一个是.h头文件 #ifndef _SNAKE_H_H_H #define ...
- c语言版贪吃蛇小游戏
编译环境:windows 7 64位 编译工具:codeblocks 13.12 备注:未使用graphics.h 声明:个人原创,未经允许,禁止转载!!! 数据结构:双向链表 1.程序未使用grap ...
- C语言实现贪吃蛇游戏
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/times.h> ...
- C语言实现贪吃蛇源码
先放效果 源代码 //2016-2-12 //zhaoyu //Gmail:zhaoyu1995.com@gmail.com //Language: C //Platform:Code::Blocks ...
- 小项目特供 贪吃蛇游戏(基于C语言)
C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...
- C语言 小游戏之贪吃蛇
还记得非常久曾经听群里人说做贪吃蛇什么的,那时候大一刚学了C语言,认为非常难,根本没什么思路. 前不久群里有些人又在谈论C语言贪吃蛇的事了,看着他们在做,我也打算做一个出来. 如今大三,经过了这一年半 ...
- 贪吃蛇小游戏-----C语言实现
1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...
- C/C++编程笔记:C语言贪吃蛇源代码控制台(二),分数和食物!
接上文<C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!>如果你在学习C语言开发贪吃蛇的话,零基础建议从上一篇开始哦!接下来正式开始吧! 三.蛇的运动 上次我已经教大家画 ...
- C语言用面向对象的思想写贪吃蛇
大概一年前这时候,接触C语言一个月,那时候知之甚少,对面向对象只觉”可远观而不可亵玩“,而且会看到很多言论说C语言就是面向过程的语言,C++就是面向对象的语言.不过,不记得什么时候在网上看到过一篇博文 ...
随机推荐
- 1-5设定NetCore监听端口
问题的起源:启动一个.netCore项目,默认使用的是5000端口,当我们有很多个项目的时候(集群),不可能都使用5000端口. 方法1:set ASPNETCORE_URLS=http://127. ...
- Windows 10 子系统Linux重启(不重启Win10)
Using CMD (Administrator) net stop LxssManager net start LxssManager
- BSD介绍
BSD许可证模板 * Copyright (c) 1998, Regents of the University of California * All rights reserved. * ...
- JScript运行批处理命令的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 有时需要在JScript调用批处理命令,因为这样可以将二者的优势结合起来.今天发现调用WScript.Shell对象的 ...
- sql server中使用链接服务器访问oracle数据库
一. 安装配置oracle客户端 要访问orcale数据,必须在访问的客户端机器上安装oracle客户端. Orcale有两种形式的客户端: l 完整的客户端 包括访问服务器端数据库 ...
- ORACLE 时间加减操作
DATE和timestamp类型都可以进行加减操作.可以对当前日期加年.月.日.时.分.秒,操作不同的时间类型,有三种方法: 1 使用内置函数numtodsinterval增加小时,分钟和秒2 加一个 ...
- WPF - Group分组对ListBox等列表样式的约束
原文:WPF - Group分组对ListBox等列表样式的约束 在做WPF主题支持时,出现一个分组引起的莫名错误,可是折腾了我一番.在没有使用样式时,列表分组很正常,使用了别人写的ListBox列表 ...
- MVVM讲解
一,MVVM理论知识 从上一篇文章中,我们已经知道,WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通 ...
- js 注册事件
<!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- ASP.NET MVC 下UpdateModel可空未填写的参数为Null,为何不是空字符串
查了好久,终于收到原因: if (bindingContext.ModelMetadata.ConvertEmptyStringToNull && Object.Equals(valu ...