c语言贪吃蛇详解-2.画出蛇

前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解。我将分几步来教大家写一个贪吃蛇小游戏。由于大家c语言未学完,这个教程只涉及数组和函数等知识点。

蛇的身体就是一些点,我们可以用二维数组把这些点的坐标存起来。

先声明一个足够大的二维数组。虽然我觉得你们玩不了这么长(手动滑稽)。

int s[H*W][2];

这样s[0][0]表示蛇头的i坐标,s[0][1]表示蛇头的j坐标。s[i][0]表示蛇第i+1个点的i坐标。s[i][1]同理。

然后再声明一个int变量存储蛇的长度。然后把这些初始化操作都放进上面init函数里面。

int sLength;        //蛇的长度
sLength=4;          //让蛇的最初长度为4

然后给刚开始的蛇身几个初始坐标

s[0][0]=H/2;
s[0][1]=W/2;      
for(i=1;i<4;i++)
{
  s[i][0]=s[0][0]+i;
  s[i][1]=s[0][1]; //给刚开始的蛇身几个初始坐标
}

然后接下来我们把蛇画出来,我这里有一个函数(百度的),可以实现移动光标到指定点。注:要添加头文件windows.h

如下:

void gotoxy(int i,int j)
{
COORD position={j,i};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);
}

然后就可以先画地图,然后通过移动光标在地图上画出蛇。

void drawSnake()
{
int i;
for(i=0;i<sLength;i++)
{
gotoxy(s[i][0],s[i][1]); //移动关标到蛇的坐标
printf("@"); //在这个位置画蛇
}
}

好,看看效果

蛇确实出来了,但是那个光标很碍事,在init函数开始时加入下面代码可隐藏关标

CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);

这样就没有光标了。

到现在为止的代码。

#include <stdio.h>
#include <stdlib.h>
#include<windows.h> #define H 23
#define W 75 int a[H][W]; //地图数组
int s[H*W][2]; //蛇身坐标数组
int sLength; //蛇的长度
void init() //程序开始时的初始化操作
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); //隐藏关标
int i,j;
for(i=0; i<H; i++)
{
a[i][0]=1; //让第一列为1
a[i][W-1]=1; //让最后一列为1
}
for(j=0; j<W; j++)
{
a[0][j]=1; //让第一行为1
a[H-1][j]=1; //让最后一行为1
}
sLength=4; //让蛇的最初长度为4
s[0][0]=H/2;
s[0][1]=W/2; //给蛇头坐标赋值
for(i=1;i<4;i++)
{
s[i][0]=s[0][0]+i;
s[i][1]=s[0][1]; //给刚开始的蛇身几个初始坐标
} } void gotoxy(int i,int j) //移动光标
{
COORD position={j,i};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),position);
} void drawMap() //画地图
{
int i,j;
for(i=0;i<H;i++)
{
for(j=0;j<W;j++) //两重for循环遍历数组
{
if(a[i][j]==0) //为0输出空格
printf(" ");
else //为1输出#
printf("#");
}
printf("\n"); //别忘了换行
}
} void drawSnake() //画蛇
{
int i;
for(i=0;i<sLength;i++)
{
gotoxy(s[i][0],s[i][1]); //移动关标到蛇的坐标
printf("@"); //在这个位置画蛇
}
} int main()
{
init(); //程序开始时的初始化操作
drawMap(); //画地图
drawSnake(); //画蛇
getchar();
return 0;
}

c语言贪吃蛇详解-2.画出蛇的更多相关文章

  1. c语言贪吃蛇详解1.画出地图

    c语言贪吃蛇详解-1.画出地图 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 首先 ...

  2. c语言贪吃蛇详解3.让蛇动起来

    c语言贪吃蛇详解3.让蛇动起来 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 上次 ...

  3. c语言贪吃蛇详解5.GameOver功能与显示成绩

    c语言贪吃蛇详解5.GameOver功能与显示成绩 以前我们已经做出来了一个能吃东西变长的蛇.不过它好像不会死... 现在就来实现一下game over的功能吧. 写个函数判断蛇是否撞到自己或者撞到墙 ...

  4. c语言贪吃蛇详解4.食物的投放与蛇的变长

    c语言贪吃蛇详解4.食物的投放与蛇的变长 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识 ...

  5. C语言内存对齐详解(2)

    接上一篇:C语言内存对齐详解(1) VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式.VC 中提供了#pr ...

  6. C语言内存对齐详解(3)

    接上一篇:C语言内存对齐详解(2) 在minix的stdarg.h文件中,定义了如下一个宏: /* Amount of space required in an argument list for a ...

  7. 一个简单的C语言程序(详解)

    C Primer Plus之一个简单的C语言程序(详解) #include <stdio.h> int main(void) //一个简单的 C程序 { int num; //定义一个名为 ...

  8. [转帖]rename(Perl语言版本) 详解

    rename(Perl语言版本) 详解 2019-03-19 22:51:23 wayne17 阅读数 464更多 分类专栏: Ubuntu之路   版权声明:本文为博主原创文章,遵循CC 4.0 B ...

  9. C语言memset函数详解

    C语言memset函数详解 memset() 的作用:在一段内存块中填充某个给定的值,通常用于数组初始化与数组清零. 它是直接操作内存空间,mem即“内存”(memory)的意思.该函数的原型为: # ...

随机推荐

  1. PhiloGL学习(1)——场景创建及方块欲露还羞出水面

    前言 上一篇文章中介绍了我认识PhiloGL框架的机缘以及初步的探讨(见JS前端三维地球渲染--中国各城市航空路线展示),在此文中仅仅对此框架进行了简单介绍并初步介绍了一些该框架的知识.首先三维这个东 ...

  2. python中openpyxl的用法【安装,以及一些基本的操作】

    概述 Openpyxl是python中简单易用的操作excel电子表格的一个模块.接下来呢,跟博主一起学习一下吧  ----_<_>_---- 首先先清楚一些excel的基本概念: 在op ...

  3. [译]ASP.NET Core 2.0 视图引擎

    问题 如何在ASP.NET Core 2.0中使用Razor引擎来创建视图? 答案 新建一个空项目,修改Startup.cs,添加MVC服务和请求中间件: public void ConfigureS ...

  4. CodePath Android CliffNotes 之 Effective Java for Android 翻译

    概述: 这篇文章的目的是作为这篇博文的开源版本,而netcyrax是该指南的原始文章的唯一作者. 请在下面添加您自己的在Android中Java最佳实践.技巧和巧妙! 建造者模式 当你拥有一个需要超过 ...

  5. Re.findall() & Re.finditer()的用法

    re.findall(pattern, string, flags=0) Return all non-overlapping matches of pattern in string, as a l ...

  6. 聊聊RPC及其原理

    什么是RPC? RPC是Remote Procedure Call的缩写,想Client-Servier一样的远程过程调用,也就是调用远程服务就跟调用本地服务一样方便,一般用于将程序部署在不同的机器上 ...

  7. PHP静态化技术

    很多框架的模板引擎都有页面静态化的功能  目的是为了优化网站运行时间 静态化分两种  纯静态和伪静态 一. 纯静态 纯静态展示的是实实在在的静态页面 运行PHP程序 判断是否存在静态页 如果存在 展示 ...

  8. linux-head

    linux-head 用来查看文件的内容的命令 命令参数 -n  num:显示指定文件的前num行 -c num:显示指定文件的前num个字符 命令:head b.txt   :  如果不加参数就默认 ...

  9. 《项目架构那点儿事》——快速构建Junit用例

    [前 言]按照惯例,在实际项目中我往往会对自己编写的程序进行测试,当测试通过后才能将其用于实战中,当然,编写单元测试是不可避免的,可以直接清晰的检验出 我们程序的可靠性.可只执行性,从中发现问题从而得 ...

  10. ubuntu小技巧(不定期更新)

    1.gedit打开windows保存的txt出现乱码 默认情况下,用ubuntu打开windows保存含有中文的txt文件时会出现乱码. 只需在终端运行以下两条命令则可解决. gsettings se ...