当前位置: 首页 > news >正文

贪吃蛇(c实现)(真的超级超级简单)

1.代码请看贪吃蛇c实现 · 王赫辰/c语言 - 码云 - 开源中国 (gitee.com)

2.本项目宗旨

        1.不引入复杂的库函数(其他博主的全是陌生库函数看不懂?看我就对了!◕‿◕

        2.不使用c++语法 (都说了c实现,嘿嘿ᕙ(`▿´)ᕗ

        3.不使用函数,结构体和指针  (除非题目需要。不要折磨自己(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )

3.实现者要求:具备较强逻辑能力,具有灵活运用二维数组的能力,熟练运用循环与选择。

4.如果你准备好了,那么我们开始吧!❛‿˂̵✧

项目整体架构

1.规则:贪吃蛇移动的每一步都需要重新打印,贪吃蛇不能碰到自己和边框,贪吃蛇吃到食物加分,且食物随机生成。

2.二维数组使用方法:根据不同对象(边框,蛇,食物)的属性赋值,再根据值进行打印。

3.在每次移动的时候,蛇身要继承蛇头或者前面蛇身的位置,最后的蛇身需要被清理。

生成随机食物

1.来看看方法的来源利用时钟值来实现数组的真正随机 · 王赫辰/c语言 - 码云 - 开源中国 (gitee.com)

2.当我们选择生成四个食物时,需要对食物的横纵坐标分别随机赋值,但范围要使其不出现在蛇或者在边框上(别忘了头文件stdlib.h和time.h)

srand(time(NULL));
int a1 = rand() % 8 + 2;
int b1 = rand() % 16 + 2;
int a2 = rand() % 16 + 2;
int b2 = rand() % 9 + 2;
int a3 = rand() % 16 + 2;
int b3 = rand() % 17 + 2;
int a4 = rand() % 3 + 2;
int b4 = rand() % 16 + 2;

初始化变量

(这个应该都懂吧?〃•ω‹〃)(将四个食物坐标赋值以便打印)

	int map[20][20] = { 0 };map[a1][b1] = 4;map[a2][b2] = 4;map[a3][b3] = 4;map[a4][b4] = 4;int count = 0;int e = 11;int f = 11;int g = 12;int h = 13;int i = 10;int l = 11;int m = 11;int z = 1;

控制移动

	int a = 0;int b = 0;int j;scanf_s("%d", &j);if (j == 0){e = 11;f = 11;g = 12;h = 13;i = 10;l = 11;m = 11;count = 0;}if (j == 1){if (map[l - 1][i] == 4){count++;}if (e != l - 1&&l!=1){int n = l;int o = i;int p = e;int q = f;map[m][g] = 0;l--;e = n;f = o;m = p;g = q;}if (e == l - 1||l==1){printf("你输了\n");break;}}if (j == 2){if (map[l + 1][i] == 4){count++;}if (e != l + 1&&l!=18){int n = l;int o = i;int p = e;int q = f;map[m][g] = 0;l++;e = n;f = o;m = p;g = q;}if (e == l + 1||l==18){printf("你输了\n");break;}}if (j == 3){if (map[l][i-1] == 4){count++;}if (f != i - 1&&i!=1){int n = l;int o = i;int p = e;int q = f;map[m][g] = 0;i--;e = n;f = o;m = p;g = q;}if (f == i - 1||i==1){printf("你输了\n");break;}}if (j == 4){if (map[l][i+1] == 4){count++;}if (f != i + 1&&i!=18){int n = l;int o = i;int p = e;int q = f;map[m][g] = 0;i++;e = n;f = o;m = p;g = q;}if (f == i + 1||i==18){printf("你输了\n");break;}}

1.输入1234控制蛇上下左右移动,而笔者选择在控制中加入输赢判定,当碰到蛇身或墙壁的时候游戏失败,当碰到食物的时候加分

2.逻辑解惑:当我们控制蛇向上移动时,如果蛇身或者边框在蛇头上面,那么是不是移动后就输了?而如果食物在上面,是不是移动就加分了?所以我们可以在赋值操作前进行判断对不对?

3.继承逻辑:当蛇头自定义运行时,第一段蛇身到原来蛇头位置,第二段蛇身到原来第一段蛇身的位置,而原先的第二段蛇身需要赋值为0以便打印空格。

赋值操作

for (a = 0; a < 20; a++){for (b = 0; b < 20; b++){if (map[a][b] == 0){if (a == 0 || b == 0 || a == 19 || b == 19){map[a][b] = 1;}if ((a == e && b == f) || (a == m && b == g)){map[a][b] = 2;}if (a == l && b == i){map[a][b] = 3;}}}}

1.由于打印内容的不同,我们将边框的值赋为一类,而蛇头,蛇身同理而前面食物的赋值也是这个思路

打印游戏界面

	int c = 0;int d = 0;for (c = 0; c < 20; c++){for (d = 0; d < 20; d++){if (map[c][d] == 1){printf("* ");}if (map[c][d] == 0){printf("  ");}if (map[c][d] == 2){printf("* ");}if (map[c][d] == 3){printf("@ ");}if (map[c][d] == 4){printf("$ ");}}printf("\n");}printf("得分为%d\n", count);}

1.分别依据二维数组的值打印不同的内容,注意空格的打印,这样游戏界面就是方的了。

ps:小彩蛋,蛇会慢慢蜕皮哦,去玩两把吧!੭ ᐕ)੭*⁾⁾

http://www.lryc.cn/news/242894.html

相关文章:

  • linux 内存回收mglru算法代码注释2
  • Exchange意外登录日志
  • NX二次开发UF_CURVE_ask_curve_turn_angle 函数介绍
  • UE 进阶篇一:动画系统
  • 超文本传输协议
  • 『heqingchun-Ubuntu系统+x86架构+编译安装ffmpeg+带有nvidia硬件加速』
  • UE5 UI教程学习笔记
  • Leetcode:622. 设计循环队列 题解【具详细】
  • ArkTS基础知识 【习题】
  • 是否有无限提取的代理IP?作为技术你需要知道这些
  • 【算法萌新闯力扣】:卡牌分组
  • 深入解析:如何开发抖音票务小程序
  • vue中 mixin用法
  • Java入门基础:浅显易懂 while
  • DNS/ICMP协议、NAT技术
  • React整理总结(七、Hooks)
  • 软件测试之银行测试详解
  • C#中的警告CS0120、CS0176、CS0183、CS0618、CS8600、CS8602、CS8604、CS8625及处理
  • CSS:浏览器设置placeholder样式 / 微信小程序设置placeholder样式
  • 升级python后sudo apt-get update报错
  • 应用可观测性OpenTelemetry简介
  • install pnpm : 无法加载文件的解决办法
  • 【Python百宝箱】Python数据探险:Excel与数据科学的完美结合
  • 外贸分享|如何从外贸小白成长为大咖?这10件事值得你坚持做
  • 深度学习之六(自编码器--Autoencoder)
  • Docker Swarm总结+基础、集群搭建维护、安全以及集群容灾(1/3)
  • Vim 一下日志文件,Java 进程没了?
  • C# Dictionary的使用
  • 解决DaemonSet没法调度到master节点的问题
  • 2023.11.20 关于 Spring MVC 详解