c语言第一个小游戏:贪吃蛇小游戏02

news2025/7/19 12:59:11

接上文继续学习

ncurse的上下左右键获取

想要使用ncurse的功能键,也就是键盘快捷键,不是q、r、t,是 上下左右、F1、F2等等的键,我们叫做功能键要是想用这些功能键需要使用keypad函数

Keypad(stdscr,1); 从stdscr接收标准中,接收功能键,第二个参数表示是否接收:1表示确认接收

本来是这样的来表示的

每个按键在计算机系统中都有对应的数值编码,但具体的编码值取决于终端类型、操作系统和库的实现。

  • KEY_DOWN(通常等于 258,即八进制 0402
  • KEY_UP(通常等于 259,即八进制 0403
  • KEY_LEFT(通常等于 260,即八进制 0404
  • KEY_RIGHT(通常等于 261,即八进制 0405

  • 因为魔数问题:使用八进制值 04020403 等表示方向键不够直观,建议使用 ncurses 预定义的常量(如 KEY_DOWNKEY_UP 等)。
  •  ncurses 标准库 中,方向键通常用预定义的常量(如 KEY_DOWN)表示,而不是直接用数值。0402 这类数值可能是某些终端(如 Linux 控制台或特定终端模拟器)发送的 原始转义序列 的一部分,但不是 ncurses 推荐的写法。
  • ncurses 的处理keypad(stdscr, 1) 会让 ncurses 解析这些转义序列,并将其转换为单个整数值(如 KEY_DOWN

        回顾知识点 switch 中,break 的作用是终止 switch 语句的执行流程,避免继续执行后续 case 分支。比如当 key 匹配到某个 case ,执行完对应代码后,break 会让程序跳出 switch ,接着执行 switch 语句后面的代码(在你代码里就是回到 while 循环开始处,等待下一次获取按键 )。

  • 魔数问题:使用八进制值 04020403 等表示方向键不够直观,建议使用 ncurses 预定义的常量(如 KEY_DOWNKEY_UP 等)。

贪吃蛇地图

我们来绘制一个20*20的地图

结果为下

代码为

#include <curses.h>

   void initgame(){

           initscr();

           keypad(stdscr,1);

   

   }

   void gamepic()

   {

         int hang;

         int lie;

         for(hang=0;hang<20;hang++){

                  if(hang == 0){

                          for(lie=0;lie<20;lie++){

                                  printw("--");

                          }

                          printw("\n");

                          for(lie=0;lie<=20;lie++){

  if(lie==0||lie==20){

   printw("|");

  }else{

  printw("  ");

  }

                          }

                       printw("\n");

                  }

  

  if(hang>0 && hang<=19){

   for(lie=0;lie<=20;lie++){

   if(lie==0||lie==20){

   printw("|");

  }else{

  printw("  ");

  }

   }

   printw("\n");

  }

 if(hang == 19){

                        for(lie=0;lie<20;lie++){

 printw("--");

   }   

    printw("\n");

                  }

          }

   }

int main()

{

initgame();

gamepic();

getch();

endwin();

return 0;

}

        其中最要注意的是 - 和 | 是占用的占用的宽度是不同的 需要两个--才能和一个|占用的宽度相同,所以我们输出的时候- 要用两个 例如“--”  说白了就是--和|占用的宽度一样

贪吃蛇地图优化及优化点

优化点:因为第0行和第19行都要打印   --   和   |   那么索性就将第0行到第19行的代码写在一起就是了

 优化代码

#include <curses.h>

void initgame()

{

        initscr();

        keypad(stdscr,1);

}

void gamepic()

{

        int hang;

        int lie;

        for(hang=0;hang<20;hang++){

                if(hang == 0){

                        for(lie=0;lie<20;lie++){

                                printw("--");

                        }

                 printw("\n");

                }

                if(hang>=0 && hang<=19){

                        for(lie=0;lie<=20;lie++){

                                 if(lie==0||lie==20){

                                         printw("|");

                                 }else{

                                         printw("  ");

                                 }

                        }

                        printw("\n");

                }

if(hang == 19){

                        for(lie=0;lie<20;lie++){

                                 printw("--");

                        }

                        printw("\n");

                }

          }

          printw("by shijintao");

   }

int main()

{

         initgame();

         gamepic();

         getch();

         endwin();

         return 0;

}

优化点在这边

  if(hang>=0 && hang<=19){

                        for(lie=0;lie<=20;lie++){

                                 if(lie==0||lie==20){

                                         printw("|");

                                 }else{

                                         printw("  ");

                                 }

                        }

                        printw("\n");

                }

因为既然0到19行都要 ‘’|‘’ 和空格  那么这样设计代码,也比较符合整体的设计,有20个横线和20个竖线,只是这个横线是写成--,更加贴切了,也减少了代码量

下一节就是写蛇的身子,涉及到指针,结构体和链表的基础

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2375788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android架构之自定义native进程

在Android五层架构中&#xff0c;native层基本上全是c的世界&#xff0c;这些c进程基本上靠android世界的第一个进程init进程创建&#xff0c;init通过rc配置文件&#xff0c;创建了众多的c子进程&#xff0c;也是这众多的c进程&#xff0c;构建了整个android世界的native层。 …

《100天精通Python——基础篇 2025 第18天:正则表达式入门实战,解锁字符串处理的魔法力量》

目录 一、认识正则表达式二、正则表达式基本语法2.1 行界定符2.2 单词定界符2.3 字符类2.4 选择符2.5 范围符2.6 排除符2.7 限定符2.8 任意字符2.9 转义字符2.10 反斜杠2.11 小括号2.11.1 定义独立单元2.11.2 分组 2.12 反向引用2.13 特殊构造2.14 匹配模式 三、re模块3.1 comp…

Nuitka 已不再安全? Nuitka/Cython 打包应用逆向工具 -- pymodhook

pymodhook是一个记录任意对Python模块的调用的库&#xff0c;用于Python逆向分析。 pymodhook库类似于Android的xposed框架&#xff0c;但不仅能记录函数的调用参数和返回值&#xff0c;还能记录模块的类的任意方法调用&#xff0c;以及任意派生对象的访问&#xff0c;基于pyob…

【C】初阶数据结构14 -- 归并排序

本篇文章主要是讲解经典的排序算法 -- 归并排序 目录 1 递归版本的归并排序 1&#xff09; 算法思想 2&#xff09; 代码 3&#xff09; 时间复杂度与空间复杂度分析 &#xff08;1&#xff09; 时间复杂度 &#xff08;2&#xff09; 空间复杂度 2 迭代版本的归并…

华为网路设备学习-21 IGP路由专题-路由过滤(filter-policy)

一、路由过滤&#xff08;filter-policy&#xff09; 1、用于控制路由更新、接收的一个工具 2、只能过滤路由信息&#xff0c;无法过滤LSA 二、路由过滤&#xff08;filter-policy&#xff09;与动态路由协议 1、距离矢量路由协议 RIP动态路由协议 交换的是路由表&#xff0…

SAP 交货单行项目含税金额计算报cx_sy_zerodivide处理

业务背景&#xff1a;SAP交货单只有数量&#xff0c;没有金额&#xff0c;所以开发报表从订单的价格按数量计算交货单的金额。 用户反馈近期报表出现异常&#xff1a; ****2012/12/12 清风雅雨 规格变更 Chg 修改开始 ** 修改原因:由于余数为0时&#xff0c;可能会报错溢出。…

【Qt】之音视频编程1:QtAV的背景和安装篇

QtAV 背景与核心概念 1. 什么是 QtAV&#xff1f; QtAV 是一个基于 Qt 框架 和 FFmpeg 的多媒体播放库&#xff0c;旨在为 Qt 应用程序提供高性能、跨平台的音视频播放、处理及渲染功能。它封装了 FFmpeg 的底层编解码能力&#xff0c;并通过 Qt 的图形系统&#xff08;如 QM…

算法与数据结构 - 二叉树结构入门

目录 1. 普通二叉树结构 1.1. 常见术语 1.2. 完全二叉树 (Complete Binary Tree) 1.3. 满二叉树 (Full Binary Tree) 2. 特殊二叉树结构 2.1. 二叉搜索树 (BST) 2.1.1. BST 基本操作 - 查找 2.1.2. BST 基本操作 - 插入 2.1.3. BST 基本操作 - 删除 2.2. 平衡二叉树…

如何使用远程桌面控制电脑

目的&#xff1a; 通过路由器使用pc控制台式机&#xff0c;实现了有线/无线pc与台式机的双向远程桌面控制 最核心就两条&#xff1a;get ip地址与被控制机器的账户与密码。 现象挺神奇&#xff1a;被控制电脑的电脑桌面处于休眠模式&#xff0c;此时强行唤醒被控电脑会导致中断…

SpringMVC-执行流程

目录 前言 一、SpringMVC执行流程 SpringMVC 主要组件 SpringMVC 的执行流程 简要分析执行流程 总结 前言 理解SpringMVC的执行流程是学习SpringMVC工作原理的重要一步。 项目内容参考&#xff1a;SpringMVC-简介及入门-CSDN博客 一、SpringMVC执行流程 SpringMVC 主要组…

计算机网络网络层(下)

一、互联的路由选择协议&#xff08;网络层控制层面内容&#xff09; &#xff08;一&#xff09;有关路由选择协议的几个概念 1.理想的路由算法 &#xff08;1&#xff09;理想路由算法应具备的特点&#xff1a;算法必须正确和完整的&#xff0c;算法在计算上应简单&#x…

深入学习Zookeeper的知识体系

目录 1、介绍 1.1、CAP 理论 1.2、BASE 理论 1.3、一致性协议ZAB 1、介绍 2、角色 3、ZXID和myid 4、 历史队列 5、协议模式 6、崩溃恢复模式 7、脑裂问题 2、zookeeper 2.1、开源项目 2.2、功能 2.3、选举机制 3、数据模型 3.1、介绍 3.2、znode分类 4、监听…

大模型核心运行机制

大模型核心运行机制目录 一、核心架构&#xff1a;Transformer的演进与改进1.1 核心组件包括&#xff1a;1.1.1 自注意力机制&#xff08;Self-Attention&#xff09;1.1.2 多头注意力&#xff08;Multi-Head Attention&#xff09;1.1.3 位置编码&#xff08;Positional Encod…

uniapp跨平台开发HarmonyOS NEXT应用初体验

之前写过使用uniapp开发鸿蒙应用的教程&#xff0c;简单介绍了如何配置开发环境和运行项目。那时候的HbuilderX还是4.22版本&#xff0c;小一年过去了HbuilderX的正式版本已经来到4.64&#xff0c;历经了多个版本的更新后&#xff0c;跨平台开发鸿蒙应用的体验大幅提升。今天再…

2025软考【系统架构设计师】:两周极限冲刺攻略(附知识点解析+答题技巧)

距离2025上半年“系统架构设计师”考试已经只剩最后两周了&#xff0c;还没有准备好的小伙伴赶紧行动起来。为了帮助大家更好的冲刺学习&#xff0c;特此提供一份考前冲刺攻略。本指南包括考情分析、答题技巧、注意事项三个部分&#xff0c;可以参考此指南进行最后的复习要领&a…

使用 goaccess 分析 nginx 访问日志

介绍 goaccess 是一个在本地解析日志的工具, 可以直接在命令行终端环境中使用 TUI 界面查看分析结果, 也可以导出为更加丰富的 HTML 页面. 官网: https://goaccess.io/ 下载安装 常见的 Linux 包管理器中都包含了 goaccess, 直接安装就行. 以 Ubuntu 为例: sudo apt instal…

vue3与springboot交互-前后分离【完成登陆验证及页面跳转】

vue3实现与springboot交互【完成登陆及页面跳转】 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&#xff1a…

【Hot 100】208. 实现 Trie (前缀树)

目录 引言实现 Trie (前缀树)我的解题代码解析代码思路分析优化建议1. 内存泄漏问题2. 使用智能指针优化内存管理3. 输入合法性校验&#xff08;可选&#xff09;4. 其他优化 总结 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1…

【2025最新】Vm虚拟机中直接使用Ubuntu 免安装过程直接使用教程与下载

Ubuntu 是一个基于 Debian 的自由开源 Linux 操作系统&#xff0c;面向桌面、服务器和云计算平台广泛应用。 由英国公司 Canonical Ltd. 维护和发布&#xff0c;Ubuntu 强调易用性、安全性和稳定性&#xff0c;适合个人用户、开发者以及企业部署使用。 Ubuntu 默认使用 GNOME …

Vue2 elementUI 二次封装命令式表单弹框组件

需求&#xff1a;封装一个表单弹框组件&#xff0c;弹框和表单是两个组件&#xff0c;表单组件以插槽的形式动态传入弹框组件中。 外部组件使用的方式如下&#xff1a; 直接上代码&#xff1a; MyDialog.vue 弹框组件 <template><el-dialog:titletitle:visible.syn…