C语言实战系列一:经典贪食蛇

C语言学习必须实战,并且学完语法后就必须立即用实战来巩固。一般需要10来个比较复杂的程序才能掌握C语言。今天就教大家第一个小程序,贪食蛇。

首先上代码

一、代码

#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <unistd.h>
#include <time.h>#define WIDTH 20
#define HEIGHT 10int score = 0;
int gameover;
int x, y, fruitX, fruitY, flag;int tailX[100], tailY[100];
int nTail;void setup() {gameover = 0;// 初始化蛇的位置x = WIDTH / 2;y = HEIGHT / 2;// 初始化食物的位置fruitX = rand() % WIDTH;fruitY = rand() % HEIGHT;
}void draw() {clear(); // 清屏for (int i = 0; i < WIDTH + 2; i++)printw("#");printw("\n");for (int i = 0; i < HEIGHT; i++) {for (int j = 0; j < WIDTH; j++) {if (j == 0)printw("#"); // 左墙if (i == y && j == x)printw("O"); // 蛇头else if (i == fruitY && j == fruitX)printw("F"); // 食物else {int isTail = 0;for (int k = 0; k < nTail; k++) {if (tailX[k] == j && tailY[k] == i) {printw("o"); // 蛇身isTail = 1;}}if (!isTail)printw(" ");}if (j == WIDTH - 1)printw("#"); // 右墙}printw("\n");}for (int i = 0; i < WIDTH + 2; i++)printw("#");printw("\n");printw("Score:%d", score);refresh(); // 刷新屏幕
}void input() {int ch = getch(); // 获取键盘输入switch (ch) {case 'a':flag = 1;break;case 'd':flag = 2;break;case 'w':flag = 3;break;case 's':flag = 4;break;case 'x':gameover = 1;break;}
}void algorithm() {usleep(100000); // 休眠,控制蛇的速度int prevX = tailX[0];int prevY = tailY[0];int prev2X, prev2Y;tailX[0] = x;tailY[0] = y;for (int i = 1; i < nTail; i++) {prev2X = tailX[i];prev2Y = tailY[i];tailX[i] = prevX;tailY[i] = prevY;prevX = prev2X;prevY = prev2Y;}switch (flag) {case 1:x--;break;case 2:x++;break;case 3:y--;break;case 4:y++;break;default:break;}// 判断是否碰到墙if (x < 0 || x >= WIDTH || y < 0 || y >= HEIGHT)gameover = 1;// 判断是否吃到食物if (x == fruitX && y == fruitY) {score += 10;fruitX = rand() % WIDTH;fruitY = rand() % HEIGHT;nTail++;}
}int main() {srand(time(NULL)); // 设置随机数种子initscr(); // 初始化 curseskeypad(stdscr, TRUE); // 启用键盘输入nodelay(stdscr, TRUE); // 非阻塞输入noecho(); // 关闭回显setup();while (!gameover) {draw();input();algorithm();}endwin(); // 关闭 cursesreturn 0;
}

二、编译

代码的运行平台是ubuntu,代码用到了curses库,需要提前安装:

 sudo apt-get install libncurses5-dev

然后用下面命令编译

gcc snake_game.c -o snake_game -lncurses

执行程序:

./snake_game

注意!如果速度过快,就会结束,直接跳出程序到控制台,如何修改速度下面会讲到。

三、编程指导

  1. 初始化 (setup 函数):

    • gameover: 游戏结束标志。
    • xy: 蛇头的初始坐标。
    • fruitXfruitY: 食物的初始坐标。
    • flag: 用于存储用户输入的方向。
    • score: 记录游戏得分。
    • nTail: 蛇身的长度。
    • tailXtailY: 用于存储蛇身各部分的坐标。
  2. 游戏主循环:

    while (!gameover) {draw();input();algorithm();
    }
    

    游戏在一个无限循环中进行,直到 gameover 变为真。在每次循环中,先绘制游戏画面,然后处理用户输入,最后执行游戏逻辑。

  3. 输入处理 (input 函数):

    • 使用 getch 函数获取键盘输入。
    • 根据用户输入的键值设置 flag 的值,表示蛇移动的方向。
    • 'a': 左,'d': 右,'w': 上,'s': 下,'x': 退出游戏。
  4. 游戏逻辑 (algorithm 函数):

    • 使用 usleep 函数添加一点延迟,以控制蛇的速度。(如果速度过快,游戏会很快结束,需要添加延时)
    • 更新蛇身的位置。
    • 根据用户输入的方向移动蛇头。
    • 判断是否碰到墙,如果是则游戏结束。
    • 判断是否吃到食物,如果是则增加得分,重新生成食物,增加蛇身的长度。
  5. 绘制 (draw 函数):

    • 使用 clear 函数清空屏幕。
    • 使用 printw 函数输出字符。
    • 使用 refresh 函数刷新屏幕。
    • 输出游戏画面,包括墙、蛇头、食物和蛇身。
    • 输出得分信息。
  6. 初始化和关闭 curses (initscrendwin 函数):

    • initscr: 初始化 curses 库。
    • keypad: 启用键盘输入。
    • nodelay: 设置非阻塞输入。
    • noecho: 关闭回显。
    • endwin: 关闭 curses 库。
  7. 编译和运行:

    • 使用 gcc 编译器编译程序,并链接 ncurses 库。
    • 运行生成的可执行文件。

四、继续完善

这段贪食蛇游戏代码已经基本完成了一个简单的实现,但仍然有一些方面可以改进和完善,具体包括:

  1. 边界检查:

    当蛇头移动到边界时,游戏会结束。可以考虑在边界处实现蛇穿越的效果,即从一侧穿越到另一侧。
  2. 游戏难度递增:

    目前游戏的难度保持不变,可以考虑逐渐增加蛇的移动速度或者加快食物的生成速度,使得游戏更具挑战性。
  3. 碰撞检测:

    目前只有边界碰撞检测和食物碰撞检测,可以考虑添加对蛇头与蛇身碰撞的检测,以防止游戏结束。
  4. 游戏结束提示:

    当游戏结束时,可以输出更友好的提示信息,告诉玩家是因为碰到墙还是碰到自己身体而导致游戏结束。
  5. 代码结构和模块化:

    将代码进一步模块化,使得各部分功能更清晰、易读、易于维护。可以考虑将一些功能性代码抽象成函数。
  6. 用户界面交互:

    添加开始界面和游戏结束后的界面,以提供更良好的用户体验。
  7. 更多游戏元素:

    考虑添加更多的游戏元素,如障碍物、特殊道具等,以增加游戏的趣味性和多样性。

这些功能给大家作为练习去实现。

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

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

相关文章

【版面稀缺】社科类3区SCI,稳定检索78年!着急毕业可投!

关注公主号【SciencePub学术】&#xff0c;发现期刊更多精彩~ 本期&#xff0c;小编给大家推荐的是一本SAGE旗下3区综合性期刊&#xff0c;均2-3个月左右录用&#xff01; 01 期刊基本信息 【期刊简介】IF&#xff1a;2.0-2.5&#xff0c;JCR3区&#xff0c;中科院4区&#x…

《WebKit 技术内幕》之八(2):硬件加速机制

2 Chromium的硬件加速机制 2.1 GraphicsLayer的支持 GraphicsLayer对象是对一个渲染后端存储中某一层的抽象&#xff0c;同众多其他WebKit所定义的抽象类一样&#xff0c;在WebKit移植中&#xff0c;它还需要具体的实现类来支持该类所要提供的功能。为了完成这一功能&#x…

【活动回顾】ABeam德硕| 艾宾信息技术开发(上海)宣讲会及企业座谈—山西大学专场

近日&#xff0c;ABeam大中华区董事长兼总经理中野洋辅先生带领艾宾上海招聘团队一行来到山西大学举行了校园招聘宣讲会&#xff0c;随后与院领导就校企合作事宜进行了深入的座谈交流。 宣讲会上&#xff0c;中野先生介绍了ABeam Consulting总社及ABeam中国的发展历程、业务版…

PIG框架学习3——Redisson 实现业务接口幂等

零、前言 ​ 业务接口幂等问题是在开发中遇到的&#xff0c;如果对业务接口代码不进行幂等控制&#xff0c;并且在前端没有对请求进行限制的情况下&#xff0c;可能会出现多次对接口调用&#xff0c;导致错误异常的发生。就上述情况&#xff0c;对PIGX自带的业务接口幂等实现进…

纯CSS3的单选框、复选框、开关按钮UI库-自由分享jQuery、html5、css3的插件库

纯CSS3的单选框、复选框、开关按钮UI库-自由分享jQuery、html5、css3的插件库-遇见你与你分享

远程登录Linux服务器:命令+工具版

通常在工作过程中&#xff0c;公司中使用的真实服务器或者是云服务器&#xff0c;都不允许除运维人员之外的员工直接接触&#xff0c;因此就需要通过远程登录的方式来操作。 所以&#xff0c;远程登录工具就是必不可缺的&#xff0c;目前&#xff0c;比较主流的有 Xshell,SSHS…

【算法与数据结构】518、LeetCode零钱兑换 II

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题的硬币是无数的&#xff0c;因此本题可以抽象成一个完全背包问题。完全背包和01背包的不同之处在于…

JavaScript 学习笔记(WEB APIs Day3)

「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. JavaScript 学习笔记&#xff08;Day1&#xff09; 2. JavaSc…

AI数据模型支撑下,鼎捷「预测透镜」如何助力汽配厂商浙江华工提质增效?

关于【浙江华工】 浙江华工汽车零部件有限公司&#xff08;以下简称“华工”&#xff09;成立于1987年&#xff0c;位于“中国汽摩配之都”浙江省瑞安塘下镇鲍七工业区&#xff0c;是一家集汽车发动机用冷却水泵和机油泵研发、制造、销售于一体的民营股份制企业。 近些年来&…

每日汇评:黄金的市场注意力转向央行和地缘政治

金价从2000美元附近的数周低点反弹&#xff1b; 到目前为止&#xff0c;黄金的进一步巩固当前价格是当前的主题&#xff1b; 地缘政治、宏观数据和央行是本周的主导市场情绪&#xff1b; 黄金价格设法恢复了平衡&#xff0c;扭转了本周开始时的负面走势&#xff0c;从关键争夺区…

恭迎佛陀与佛陀弟子舍利子的华琪舍利子塔位于泰国帕拉波柔玛塔寺

恭迎佛陀与佛陀弟子舍利子的华琪舍利子塔位于泰国帕拉波柔玛塔寺 &#xff08;华琪国际媒体中心01月21日讯&#xff09;马来西亚华琪舍利子博物馆与泰国甘烹碧帕拉波柔玛塔寺&#xff08;Wat Phra Borommathat&#xff09;于2023 年12月25日携手举办了恭迎76座佛陀与佛陀弟子舍…

【数据结构】 循环单链表的基本操作 (C语言版)

目录 一、循环单链表 1、循环单链表的定义&#xff1a; 2、循环单链表的优缺点&#xff1a; 二、循环单链表的基本操作算法&#xff08;C语言&#xff09; 1、宏定义 2、创建结构体 3、循环单链表的初始化 4、循环单链表的插入 5、求单链表长度 6、循环单链表的清空…

人工智能(AI)技术应用:解锁未来的无限可能

随着信息时代的来临&#xff0c;人工智能(AI)技术成为推动社会进步的重要力量。在医疗领域&#xff0c;人工智能技术已经开始发挥重要作用。通过大数据分析和机器学习&#xff0c;人工智能可以帮助医生更准确地诊断疾病、制定治疗方案&#xff0c;缩短治疗时间&#xff0c;提高…

Modbus协议学习第五篇之libmodbus库的编译

前言 本篇博客主要讲解在Windows下的libmodbus库的编译过程&#xff0c;供大家参考。 所需环境&#xff1a;Windows操作系统/ Visual Studio / Github 具体步骤 第一步&#xff1a;下载并解压libmodbus源码 首先我们进入libmodbus库的github地址&#xff1a;libmodbus&#x…

在Go中处理HTTP请求和响应

在Go语言中&#xff0c;处理HTTP请求和响应的关键在于对net/http包的理解和使用。这个包提供了强大的工具&#xff0c;使开发者能够轻松地构建Web应用程序。以下是一个简单的示例&#xff0c;展示了如何在Go中处理HTTP请求和响应。 首先&#xff0c;确保你已经安装了Go语言的开…

记一次NAS问题修复,挂载的硬盘名称发生变化导致文件上传失败,解决问题方案总结

我之前采用Cloudreve搭建了一个内网穿透的网盘管理&#xff0c;最近突发发现文件上传失败&#xff0c;且内容无法访问&#xff0c;这个问题纠结了我一个星期&#xff0c;最终发现是由于挂载的硬盘原来的目录是dve/sda1 不知道什么原因这个名称变成了sdc1 原因解释&#xff1a; …

图像分割实战-系列教程17:deeplabV3+ VOC分割实战5-------main.py

&#x1f341;&#x1f341;&#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 deeplab系列算法概述 deeplabV3 VOC分割实战1 deeplabV3 VOC分割实战2 deeplabV3 VOC分割实战3 dee…

智能算法 | Matlab实现改进黑猩猩优化算法SLWCHOA与多个基准函数对比与秩和检验

智能算法 | Matlab实现改进黑猩猩优化算法SLWCHOA与多个基准函数对比与秩和检验 目录 智能算法 | Matlab实现改进黑猩猩优化算法SLWCHOA与多个基准函数对比与秩和检验预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现改进黑猩猩优化算法SLWCHOA与多个基准函数…

Flutter编译报错Connection timed out: connect

背景&#xff1a;用Android Studo 创建了Flutter项目&#xff0c;编译运行报错java.net.ConnectException: Connection timed out: connect 我自己的环境&#xff1a; windows11 Android Studio Flutter 截图如下&#xff1a; 将错误日志展开之后&#xff1a; Exception…

LLM面面观之LLM上下文扩展方案

1. 背景 本qiang~这段时间调研了LLM上下文扩展的问题&#xff0c;并且实打实的运行了几个开源的项目&#xff0c;所谓实践与理论相结合嘛&#xff01; 此文是本qiang~针对上下文扩展问题的总结&#xff0c;包括解决方案的整理概括&#xff0c;文中参考了多篇有意义的文章&…