1.设计思路

总的来说,贪吃蛇这个小游戏涉及到的东西不多,但是对逻辑思维是比较吃基本功的。

贪吃蛇,显示给我们看的有三部分:蛇、食物、地图边界。

我们可以用一个二维数组来标记这些部分:

例如这里我创建了一个 5*10 的二维数组,其中 -1 表食物, 1 表蛇头,2、3、4、5表蛇身,0表示空地。

如果我们想要蛇移动起来,只需要将 蛇尾置0 ,其余部分+1 就行了。

另外需要说明的是,我们使用 a s d w 来控制方向,这四个方向对应的整数分别是:3、2、1、0。

2.具体流程

3.源文件(主函数)main.c

#include "head.h"
int main()
{int map[SIZE][SIZE] = { 0 };//定义二维数组int len = 0;//定义长度int state = 0;//定义游戏状态int direc = 0;//定义方向Init_map(map, &len, &direc);//初始化地图while (1){direc = get_direc(direc);//键盘读入方向state = move(map, direc, &len);//蛇的移动,在函数内部判断蛇头状态并返回值if (state == 0)//返回0表游戏结束break;else//继续游戏print(map);//打印Sleep(100);}return 0;
}

4.头文件head.h

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <math.h>#define SIZE 19void Init_map(int map[SIZE][SIZE], int* len, int* direc);
int get_direc(int direc);
int move(int map[SIZE][SIZE], int direc, int* len);
void print(int map[SIZE][SIZE]);

5.源文件(函数内部)func.c

void Init_map(int map[SIZE][SIZE], int* len, int* direc)
{*len = 3;//初始化长度*direc = 2;//初始化方向map[5][5] = -1;//初始化食物//初始化蛇身map[3][3] = 3;map[4][3] = 2;map[5][3] = 1;//初始化蛇头
}int get_direc(int direc)
{int tmp = -1;//定义一个用来接收键盘值的变量if (_kbhit())//如果键盘被敲击,kbhit()返回一个非0值{switch (_getch())//从键盘读入{case 'W':case 'w':tmp = 0; break;case 'D':case 'd':tmp = 1; break;case 'S':case 's':tmp = 2; break;case 'A':case 'a':tmp = 3; break;}//读入的键盘只能是 w、d、s、a,并且蛇不能掉头if (tmp != -1 && abs(direc - tmp) != 2)//abs函数是求绝对值direc = tmp;}return direc;
}int move(int map[SIZE][SIZE], int direc, int* len)
{int i = 0;int j = 0;//定义蛇头位置int head_x = 0;int head_y = 0;//循环遍历数组for (i = 0; i < SIZE; i++){for (j = 0; j < SIZE; j++){if (map[i][j] == *len)//如果是蛇尾map[i][j] = 0;if (map[i][j] > 1)//如果是蛇身map[i][j] += 1;if (map[i][j] == 1)//如果是蛇头{map[i][j] += 1;//此时蛇头+1了,已经没有蛇头了,现在就要找到一个新的蛇头// //找到原蛇头的原位置head_x = i;head_y = j;//找到蛇头移动后的位置switch (direc){case 0:head_x = i - 1; head_y = j; break;case 1:head_x = i; head_y = j + 1; break;case 2:head_x = i + 1; head_y = j; break;case 3:head_x = i; head_y = j - 1; break;}}}}if (map[head_x][head_y] == -1)//如过蛇头位置是食物{*len = *len + 1;//吃掉食物,长度+1map[head_x][head_y] = 1;//吃掉食物,食物变成蛇头//重新生成食物while (1){i = rand() % SIZE;j = rand() % SIZE;if (map[i][j] == 0){map[i][j] = -1;break;}}}//如果蛇头碰到自己或墙else if (map[head_x][head_y] > 0 || head_x < 0 || head_x == SIZE || head_y < 0 || head_y == SIZE)return 0;//返回0elsemap[head_x][head_y] = 1;//没碰到食物、墙壁、自己return 1;//没碰到食物、墙壁、自己}void print(int map[SIZE][SIZE])
{//打印边框、食物、蛇用的符号根据自己的喜好来,是自由不受限制的system("cls");int i = 0;int j = 0;//打印上边框for (i = 0; i <= SIZE; i++){if (i == 0)printf("┏");else if (i == SIZE)printf(" ┓");elseprintf(" ━");}printf("\n");//打印左、右边框,打印蛇头、蛇身、食物for (i = 0; i < SIZE; i++){for (j = 0; j < SIZE; j++){if (j == 0)printf("┃ ");else if (map[i][j] == -1)printf("★");else if (map[i][j] > 0)printf("○");else if (map[i][j] == 1)printf("●");elseprintf("  ");if (j == SIZE - 1)printf("┃");}printf("\n");}//打印下边框for (i = 0; i <= SIZE; i++){if (i == 0)printf("┗");else if (i == SIZE)printf(" ┛");elseprintf(" ━");}printf("\n");
}

6.结束语

可以看到,我们除去无用的换行、注释部分,真正的代码不到200行。这只是一个有基本功能的贪吃蛇小游戏。希望大家在这个版本的基础上添加一些花里胡哨的功能。 

最后附上游戏效果截图。

用200行C语言代码写出一个贪吃蛇——1.0(基本版)相关推荐

  1. 三分钟写出一个“贪吃蛇”,有且只有python能这么轻松做到,不管你信不信(附代码和注释)

    贪吃蛇大家都玩过吧,今天手把手教你们自己写一个贪吃蛇游戏. 1.有关游戏的项目我们需要用到pygame库,用win+s输入cmd窗口,用 pip install pygame 命令安装就好了. 2.如 ...

  2. c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...

    求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束 /* 以下是主要的逻辑代码,还有些.c和.h就没发了 ...

  3. python60行绘图程序_不敢相信,60行python代码就写出了贪吃蛇游戏

    通过写游戏玩编程是一个非常有趣的事,网上用Python写贪吃蛇的代码很多,大部分都用类来写的,比较复杂.今天看到一个非常简洁的贪吃蛇游戏代码,只有60几行,非常适合小白上手,而且思路极其清晰,赶紧分享 ...

  4. 贪吃蛇python撞墙不死_不敢相信,60行python代码就写出了贪吃蛇游戏

    通过写游戏玩编程是一个非常有趣的事,网上用Python写贪吃蛇的代码很多,大部分都用类来写的,比较复杂.今天看到一个非常简洁的贪吃蛇游戏代码,只有60几行,非常适合小白上手,而且思路极其清晰,赶紧分享 ...

  5. unity贪吃蛇c 语言代码,unity实现简单贪吃蛇游戏

    本文实例为大家共享了unity实现贪吃蛇游戏的详细代码,供大家参考,详细内容如下 首先创建一个头部,编写脚本利用WASD控制头部的移动. Vector3 up=new Vector3(0,1,0); ...

  6. windows bat脚本编写_怎样在 txt 中用 2 行代码写出一个锁屏休息提醒脚本?

    锁屏 面对电脑,沉浸在工作中,往往忘记休息.长此以往,脊椎肯定受不了,造成驼背,对体态不好. 何不写一个小脚本,40 分钟锁一次屏,暗示你应该休息放松一下了? 新建 .txt 文档,命名随意,但后缀改 ...

  7. 第六课:你知道如何用两行代码做个弹窗吗?看这里!两行代码写出一个广告弹窗

    首先在这节课开始之前,我们要回顾一下第一堂课的一个小知识点-----库. 库 我们之前说过,库是什么?什么是库?我们可以将库理解为仓库,仓库里面有很多工具,比如说扳手或者是钳子什么的. 标准库 仓库之 ...

  8. 分享自己写的一个贪吃蛇的游戏(Linux)

    作者: dave_cn 发表于 2010-07-18 21:20 原文链接 阅读: 148 评论: 2 转载请注明出处.http://www.cnblogs.com/dave_cn/ 本程序需要ncu ...

  9. 用Python写了一个贪吃蛇大冒险小游戏

最新文章

  1. 查找只有一个字母不相同的单词
  2. mysql kvdb_从MYSQL到KVDB
  3. 无法识别的属性“targetframework”。请注意属性名称区分大小写。_神奇!你思考过计算机是怎么识别玻璃和透明物体的吗?...
  4. 前端学习(1156):let var const的区别
  5. JEECG Online Coding 开发流程
  6. 一个新的轮回,一个新的开始
  7. 一看就懂:正则表达式
  8. excel使用教程_正版办公软件教程书Word Excel PPT办公应用从入门到精通教学加视频!...
  9. MySQL的字符集和校对规则,你都会了吗?
  10. VLookup函数和单元格引用
  11. php修改浏览器地址,PHPstorm设置浏览器打开代码
  12. win7系统中如何以管理员身份修改hosts文件
  13. ubuntu ogv
  14. 华为云Ubuntu16.04更新包管理工具卡住 0% [Connecting to archive.ubuntu.com (91.189.88.152)]
  15. 可替换STM23G031的32位单片机
  16. Android自定义不需要焦点的TextView以实现跑马灯效果
  17. SSL数字证书申请要多少钱?
  18. 国内外学者联合撰写,ChatGPT技术路线图
  19. 数据开发面试问题记录
  20. xargs笔记——xargs和mv配合

热门文章

  1. ClickHouse MergeTree家族特殊表引擎
  2. c语言编程时间,C语言中读取时间日期的基本方法
  3. 【Adobe Illustrator 教程】2. 认识矩形工具并绘制一些马赛克图案
  4. MySQL总结__狂神说Java
  5. 游戏开发中的物理之运动角色(2D)
  6. Qt基于FFmpeg实现视频转码
  7. 早期 MCU 芯片是怎么加密的?
  8. L2-020 功夫传人 (25分)
  9. java截取倒数后六位的字符串_java 字符串截取的三种方法(推荐)
  10. Oracle 拼音排序