小白入门——easyx界面版“贪吃蛇”的C语言实现(详细)

作者:顽石

前言:C语言初学者都是在控制台上开发一些小游戏什么,由于没有界面(比如图片、音乐,不能做出拥有自己风格的程序)学起来比较乏味,很难坚持下去。所以我在这里就教大家使用简单的图形化工具——easyx图形界面库,开发贪吃蛇小游戏,让初学者也能感受界面的魅力。做的不是很完善,希望大家可以自己动手完善它!

我们开始说思路。

1,我们需要一张地图,图形库初始化的窗口是自带坐标的(左上角为0,0)。

2,我们需要一条蛇,这条蛇由蛇头和蛇身组成(这里我们初始化三节蛇)。

3,我们需要食物,并且在蛇吃掉食物之后将蛇的身体变长,而且重新生成一个食物。

4,蛇需要移动,这应该是最难实现的(实现蛇身坐标的传值,除蛇头以外,每一节蛇的坐标都是上节蛇的上一次运动之前的坐标,有点绕~)。

5,蛇撞到墙或者撞到自己的身体就会死亡(判断坐标是否重合就可以)。

6,我们需要能用键盘控制蛇的运动方向,这个会和蛇的移动有一些联系。

下面我们来写代码。

首先是头文件snake.h部分,我们把一些函数的申明,和结构体的定义放在头文件中:

#define _CRT_SECURE_NO_WARNINGS

#ifndef __SNAKE_H_

#define __SNAKE_H_

#define MAX 500

#pragma message("我的贪吃蛇!")

#include

#include

#include

//初始化蛇

void insnake();

//绘制蛇

void inisnake();

//蛇的移动

void way();

//蛇的方向

void snakemove();

//蛇的食物

void foodxy();

//食物绘制

void inifood();

//判断蛇是否吃掉食物

void eatfood();

//判断蛇是否吃挂掉

void snakedie();

//游戏过程中,按 空格 可以对游戏进行暂停、开始

void again();

//存储蛇的坐标的结构体

typedef struct coor

{

int x;

int y;

}coor;

//蛇的基本属性

struct snake

{

int num;//蛇的总节数

coor xy[MAX];//存储蛇的坐标的结构体数组

char way;

}snake;

//食物的基本属性

struct food

{

coor fdxy;

int flag=0;

int eatgrade = 0;

}food;

//方向枚举

enum way

{

right=72,

left=75,

down=77,

up=80

};

#endif

OK,头文件部分完毕,接下来进入snake.cpp代码编写环节。

(图形库需要在xxx.CPP下编写,在xxx.C可能会出错)

#include"snake.h"

#include//easyx图形库头文件

#define Azure 0xA4D3EE//自己定义的一个颜色 忘记了...

int main()

{

srand((unsigned int)time(NULL));//随机数种子,后面随机产生蛇的食物要用到

insnake();

while (1)

{

cleardevice();

if (food.flag == 0)

{

foodxy();

}

inifood();

inisnake();

snakedie();

eatfood();

way();

Sleep(100);

while (_kbhit())//这里是按上下左右键控制蛇的移动

{

again();

snakemove();

}

}

while (1);

closegraph();

return 0;

}

//初始化蛇

void insnake(){

initgraph(640, 480);

setbkcolor(Azure);

snake.xy[2].x = 0;

snake.xy[2].y = 0;

snake.xy[1].x = 10;

snake.xy[1].y = 0;

snake.xy[0].x = 20;

snake.xy[0].y = 0;

snake.num = 3;

snake.way = right;

food.flag = 0;

}

//绘制蛇

void inisnake()

{

for (int i = 0; i < snake.num; i++)

{

setlinecolor(BLUE);

setfillcolor(YELLOW);

fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);

}

}

//蛇的移动

void way()

{

//除了第一节蛇,后面每节都是前面一节蛇的前一次坐标

for (int i = snake.num-1; i >0; i--)

{

snake.xy[i].x = snake.xy[i-1].x;

snake.xy[i].y = snake.xy[i-1].y;

}

switch (snake.way)

{

case right:

snake.xy[0].x += 10;

break;

case left:

snake.xy[0].x -= 10;

break;

case down:

snake.xy[0].y += 10;

break;

case up:

snake.xy[0].y -= 10;

break;

default:

break;

}

}

//蛇的方向控制

void snakemove()

{

char ch = 0;

ch = _getch();

switch (ch)

{

case 72:

if (snake.way != down)

snake.way = up;

break;

case 75:

if (snake.way != right)

snake.way = left;

break;

case 77:

if (snake.way != left)

snake.way = right;

break;

case 80:

if (snake.way != up)

snake.way = down;

break;

default:

break;

}

}

//食物坐标获取

void foodxy()

{

//蛇坐标0 10 20 30 n*10

//食物 如果rand() % 650那么坐标0 1 2 3 4蛇将吃不到食物 坐标重合低

food.fdxy.x = rand() % 65 * 10;

food.fdxy.y = rand() % 48 * 10;

food.flag = 1;

for (int i = 0; i > snake.num; i++)

{

if (food.fdxy.x == snake.xy[i].x && food.fdxy.y == snake.xy[i].y)

{

food.fdxy.x = rand() % 65 * 10;

food.fdxy.y = rand() % 48 * 10;

}

}

}

//绘制食物

void inifood()

{

fillrectangle(food.fdxy.x, food.fdxy.y, food.fdxy.x + 10, food.fdxy.y + 10);

}

//吃食物的判断

void eatfood()

{

if (snake.xy[0].x == food.fdxy.x && snake.xy[0].y == food.fdxy.y)

{

snake.num++;

food.eatgrade += 10;

food.flag = 0;

}

}

//判断蛇是否死亡

void snakedie()

{

{ //分数

char grade[100] = { 0 };

sprintf(grade, "%d", food.eatgrade);

setbkmode(0);//文字背景透明

outtextxy(570, 20, "分数:");

outtextxy(610, 20, grade);

}

if (snake.xy[0].x > 640 || snake.xy[0].x < 0 || snake.xy[0].y > 480 || snake.xy[0].y<0)

{

outtextxy(240, 320, "撞墙了,游戏结束!加C/C++学习交流Qun:231662552");

MessageBox(0, "撞墙了!游戏结束!加C/C++学习交流Qun:231662552", "暴力提示!", 0);

getchar();

}

for (int i = 1; i < snake.num; i++)

{

if (snake.xy[0].x == snake.xy[i].x &&snake.xy[0].y == snake.xy[i].y)

{

outtextxy(240, 320, "你咬死了自己,游戏结束!加C/C++学习交流Qun:231662552");

getchar();

}

}

}

void again()

{

if (_getch() == 32)

{

while (getch() != 32);

}

}

好了贪吃蛇代码写完了,我们来看一下效果:

蛇开始是一直向右运动的!我们按下下方向键:

看见没有,我顺便完了两下,吃了食物蛇是不是变长了!

来,我们去撞下墙【皮~】:

哎呀,我去,本来是撞墙的,结果自己咬死了自己!

好了,还没看过瘾的,赶快自己去编写实现吧!有问题或要图形库的可以加上面图片里的交流qun!拜拜!

c语言制作贪吃小白入门,小白入门——easyx界面版“贪吃蛇”的C语言实现(详细)...相关推荐

  1. c语言创建可视化窗口,一种基于可视化界面绘制图形自动生成C语言代码软件的设计与实现...

    第 35 卷第 9 期 计算机应用与软件 Vol. 35 No. 9 2018 年 9 月 Computer Applications and Software Sep. 2018 一种基于可视化界面 ...

  2. 用c++和SFML实现简易的界面版贪吃蛇

    运行截图 等待开始界面 运行过程 失败界面截图 SFML配置 csdn上面已经有很多SFML配置的blog,随便就能搜到.正常配置好SFML后,还需要将字体ttf文件放在源代码同一目录和exe同一目录 ...

  3. 视频教程-2020新版C语言程序设计零基础入门小白自学编程-C/C++

    2020新版C语言程序设计零基础入门小白自学编程 7年的开发架构经验,曾就职于国内一线互联网公司,开发工程师,现在是某创业公司技术负责人, 擅长语言有node/java/python,专注于服务端研发 ...

  4. 【从入门到入土系列】C语言制作小游戏-贪吃蛇:Copy+运行即可另附注释

    系列文章 本系列持续更新中,欢迎您的访问! 系列简介 本系列由唐文疏撰写,负责记录博主的学习生涯中的一点一滴.独乐乐不如众乐乐,故此分享给大家.欢迎大家一起讨论.学习和批评指点. 博主只是一个普普通通 ...

  5. ab753变频器参数怎么拷贝到面板_【干货】一文让你从入门小白进阶为变频器高手...

    点击蓝字 关注我们 为确保 SINAMICS G120 的操作及监控便捷高效,提供了三种不同的操作面板: 1.基本操作面板(BOP-2). 2.智能操作面板(IOP-2) 3.智能连接模块(G120 ...

  6. python和循环语句_Python 小白零基础入门 -- 条件语句和循环语句

    Python 小白零基础入门 -- 条件语句和循环语句 点击上方 "Python 读数", 选择 "星标" 公众号 重磅干货, 第一时间送达 Python 零基 ...

  7. 新手小白HTML代码入门

    新手小白HTML代码入门 前言 第一次写博客,希望能为刚入门的提供帮助 一.HTML是什么? HTML全称Hyper Text Markup Language,中文名叫做超文本标记语言,主要作用是做数 ...

  8. ztree树封装 json实例_小白7天入门PHP Web开发 - Day 6[下](综合)个人博客实例讲解用户数据的存储...

    <小白7天入门PHP Web开发>系列文章,面向单纯善良的完全不懂Web开发编程的入门速成课程,小白们如果感兴趣可以研读此系列文章,也可以连线提问.各路大神有何指教还请指点一二.希望各路大 ...

  9. python视频教程从入门到精通全集-零基础小白python从入门到精通视频(全60集)...

    零基础小白python从入门到精通视频(全60集)课程目录: [真心软件]01Python编程语言历史及特性.mp4 [真心软件]02Python编程语言初接触.mp4 [真心软件]03Python程 ...

最新文章

  1. 图灵喜获Stevens名著《TCP/IP Illustrated》影印版权
  2. 28 多进程之数据交换Pipe
  3. websoc是什么可以卸载吗_函授可以考公务员吗?什么是函授?
  4. MySQL与Python交互入门
  5. linux 网卡 开启dhcp,Linux DHCP如何绑定指定的网卡???
  6. matlab下三维dla模型模拟,Matlab下三维DLA模型模拟
  7. 数据结构(哈夫曼树+KMP)之 数据加密+解密
  8. 机器学习线性回归案例讲解_09机器学习实战之简单线性回归
  9. make xdb file.php,SCWS入门使用指南
  10. 使用Blend开发Silverlight VSM
  11. Android 数据库 在使用 update更新的时候,总是无法更新,还没有异常抛出!
  12. nyoj461 Fiboncci数列(4)解通项公式
  13. Marvell车载以太网交换机芯片88Q5050
  14. Springboot实现拦截器与过滤器
  15. attention 文字识别算法_一文带你了解文字识别
  16. 阿里云服务器安全组配置
  17. Unity Shader - Standard Shader 标准着色器
  18. 360修复服务器漏洞,360安全漏洞不需要修复怎么设置
  19. 破防了,这4款良心高效的优质软件,着实把我感动到了
  20. [Datawhale-李宏毅机器学习-39期]-005-网络设计技巧

热门文章

  1. 为什么开发者将迎来万亿美元黄金时代
  2. 大剧播出无人值守“心里不慌”,优酷全链路技术齐上阵
  3. 百度否认退市;微信官方回应「个人影响度报告」;微软公布 C# 9.0 计划 | 极客头条...
  4. 写了Bug,误执行 rm -fr /*,我删删删删库了,要跑路吗?| 原力计划
  5. “生命游戏之父”因新冠肺炎逝世,回顾数学顽童的一生
  6. 百年 IBM 终于 All In 人工智能和混合云!
  7. Java 稳步成长、Kotlin 崛起、Go 保持独特风格,2020 年各大编程语言发展趋势一览...
  8. 不为人知的 35 个 More Effective C++ 改善编程与设计的最佳方法 | 原力计划
  9. App 开发穷途末路?
  10. 国产数据库崛起 Gartner!