简易的贪吃蛇小游戏(以后或许会更新)C++/C语言
第一版:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>#define WIDTH 20
#define HEIGHT 20int gameOver;
int score;
int x, y; // 蛇头的坐标
int fruitX, fruitY; // 食物的坐标
int tailX[100], tailY[100]; // 蛇身的坐标
int tailLength;
enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN };
enum eDirection dir;void Setup()
{gameOver = 0;score = 0;x = WIDTH / 2;y = HEIGHT / 2;fruitX = rand() % WIDTH;fruitY = rand() % HEIGHT;dir = STOP;
}void Draw()
{system("cls"); // 清屏for (int i = 0; i < WIDTH + 2; i++)printf("#");printf("\n");for (int i = 0; i < HEIGHT; i++){for (int j = 0; j < WIDTH; j++){if (j == 0)printf("#");if (i == y && j == x)printf("O");else if (i == fruitY && j == fruitX)printf("F");else{int printTail = 0;for (int k = 0; k < tailLength; k++){if (tailX[k] == j && tailY[k] == i){printf("o");printTail = 1;}}if (!printTail)printf(" ");}if (j == WIDTH - 1)printf("#");}printf("\n");}for (int i = 0; i < WIDTH + 2; i++)printf("#");printf("\n");printf("Score: %d\n", score);
}void Input()
{if (_kbhit()){switch (_getch()){case 'a':dir = LEFT;break;case 'd':dir = RIGHT;break;case 'w':dir = UP;break;case 's':dir = DOWN;break;case 'x':gameOver = 1;break;}}
}void Logic()
{int prevX = tailX[0];int prevY = tailY[0];int prev2X, prev2Y;tailX[0] = x;tailY[0] = y;for (int i = 1; i < tailLength; i++){prev2X = tailX[i];prev2Y = tailY[i];tailX[i] = prevX;tailY[i] = prevY;prevX = prev2X;prevY = prev2Y;}switch (dir){case LEFT:x--;break;case RIGHT:x++;break;case UP:y--;break;case DOWN:y++;break;}if (x >= WIDTH)x = 0;else if (x < 0)x = WIDTH - 1;if (y >= HEIGHT)y = 0;else if (y < 0)y = HEIGHT - 1;for (int i = 0; i < tailLength; i++){if (tailX[i] == x && tailY[i] == y)gameOver = 1;}if (x == fruitX && y == fruitY){score += 10;fruitX = rand() % WIDTH;fruitY = rand() % HEIGHT;tailLength++;}
}int main()
{Setup();while (!gameOver){Draw();Input();Logic();Sleep(10); // 控制游戏速度}return 0;
}
第二版:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>#define WIDTH 30
#define HEIGHT 20int gameOver;
int score;
int x, y; // 蛇头的坐标
int fruitX, fruitY; // 食物的坐标
int tailX[100], tailY[100]; // 蛇身的坐标
int tailLength;
enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN };
enum eDirection dir;int aiX, aiY; // AI蛇头的坐标
int aiTailX[100], aiTailY[100]; // AI蛇身的坐标
int aiTailLength;
enum eDirection aiDir;void Setup()
{gameOver = 0;score = 0;x = WIDTH / 2;y = HEIGHT / 2;fruitX = rand() % WIDTH;fruitY = rand() % HEIGHT;dir = STOP;aiX = WIDTH / 2 - 5;aiY = HEIGHT / 2;aiDir = STOP;aiTailLength = 0;
}void Draw()
{system("cls"); // 清屏for (int i = 0; i < WIDTH + 2; i++)printf("#");printf("\n");for (int i = 0; i < HEIGHT; i++){for (int j = 0; j < WIDTH; j++){if (j == 0)printf("#");if (i == y && j == x)printf("O");else if (i == fruitY && j == fruitX)printf("F");else if (i == aiY && j == aiX)printf("A");else{int printTail = 0;for (int k = 0; k < tailLength; k++){if (tailX[k] == j && tailY[k] == i){printf("o");printTail = 1;}}for (int k = 0; k < aiTailLength; k++){if (aiTailX[k] == j && aiTailY[k] == i){printf("a");printTail = 1;}}if (!printTail)printf(" ");}if (j == WIDTH - 1)printf("#");}printf("\n");}for (int i = 0; i < WIDTH + 2; i++)printf("#");printf("\n");printf("Score: %d\n", score);
}void Input()
{if (_kbhit()){switch (_getch()){case 'a':dir = LEFT;break;case 'd':dir = RIGHT;break;case 'w':dir = UP;break;case 's':dir = DOWN;break;case 'x':gameOver = 1;break;}}
}void AI()
{if (aiX < fruitX)aiDir = RIGHT;else if (aiX > fruitX)aiDir = LEFT;else if (aiY < fruitY)aiDir = DOWN;else if (aiY > fruitY)aiDir = UP;
}void Logic()
{int prevX = tailX[0];int prevY = tailY[0];int prev2X, prev2Y;tailX[0] = x;tailY[0] = y;for (int i = 1; i < tailLength; i++){prev2X = tailX[i];prev2Y = tailY[i];tailX[i] = prevX;tailY[i] = prevY;prevX = prev2X;prevY = prev2Y;}int aiPrevX = aiTailX[0];int aiPrevY = aiTailY[0];int aiPrev2X, aiPrev2Y;aiTailX[0] = aiX;aiTailY[0] = aiY;for (int i = 1; i < aiTailLength; i++){aiPrev2X = aiTailX[i];aiPrev2Y = aiTailY[i];aiTailX[i] = aiPrevX;aiTailY[i] = aiPrevY;aiPrevX = aiPrev2X;aiPrevY = aiPrev2Y;}switch (dir){case LEFT:x--;break;case RIGHT:x++;break;case UP:y--;break;case DOWN:y++;break;}switch (aiDir){case LEFT:aiX--;break;case RIGHT:aiX++;break;case UP:aiY--;break;case DOWN:aiY++;break;}if (x >= WIDTH || x < 0 || y >= HEIGHT || y < 0)gameOver = 1;for (int i = 0; i < tailLength; i++){if (tailX[i] == x && tailY[i] == y)gameOver = 1;}if (aiX >= WIDTH || aiX < 0 || aiY >= HEIGHT || aiY < 0)gameOver = 1;for (int i = 0; i < aiTailLength; i++){if (aiTailX[i] == aiX && aiTailY[i] == aiY)gameOver = 1;}if (x == fruitX && y == fruitY){score += 10;fruitX = rand() % WIDTH;fruitY = rand() % HEIGHT;tailLength++;}if (aiX == fruitX && aiY == fruitY){score += 10;fruitX = rand() % WIDTH;fruitY = rand() % HEIGHT;aiTailLength++;}
}int main()
{srand(time(NULL)); // 随机数种子Setup();while (!gameOver){Draw();Input();AI();Logic();Sleep(100); // 控制游戏速度}printf("GAME OVER\n");return 0;
}
制作不易,喜欢的话,给个赞吧。
相关文章:
简易的贪吃蛇小游戏(以后或许会更新)C++/C语言
第一版: #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <windows.h>#define WIDTH 20 #define HEIGHT 20int gameOver; int score; int x, y; // 蛇头的坐标 int fruitX, fruitY; // 食物的坐标 int tailX[100], t…...
23云计算全国职业技能大赛容器云-容器编排
erp 2.2.1 容器化部署 MariaDB [0.5 分]2.2.2 容器化部署 Redis [0.5 分]2.2.3 容器化部署 Nginx [0.5 分]2.2.4 容器化部署 ERP[0.5 分]2.2.5 编排部署 ERP管理系统[1 分] 2.2.1 容器化部署 MariaDB [0.5 分] 编写 Dockerfile 文件构建 mysql 镜像,要求基于 centos…...
哨兵(Sentinel-1、2)数据下载
哨兵(Sentinel-1、2)数据下载 一、登陆欧空局网站 二、检索 先下载2号为光学数据 分为S2A和S2B,产品种类有1C和2A,区别就是2A是做好大气校正的影像,当然数量也会少一些,云量检索条件中记得要按格式&#x…...
开启AI大模型时代|「Transformer论文精读」
论文地址: https://arxiv.org/pdf/1706.03762v5.pdf 代码地址: https://github.com/tensorflow/tensor2tensor.git 首发:微信公众号「魔方AI空间」,欢迎关注~ 大家好,我是魔方君~~ 近年来,人工智能技术发展迅猛&#…...
【小沐学前端】Windows下搭建WordPress(nginx1.25、PHP8.2、WordPress6.3、MySQL5.7)
文章目录 1、简介1.1 Nginx1.2 PHP1.3 WordPress1.4 MySQL 2、下载2.1 Nginx2.2 PHP2.3 WordPress2.4 MySQL 3、搭建环境3.1 Nginx3.2 PHP3.3 WordPress3.4 MySQL 4、配置WordPress4.1 选择语言4.2 配置数据库4.3 登录界面4.4 常规设置4.5 写作操作 结语 1、简介 WordPress是基…...
centos8 Error: Failed to download metadata for repo ‘appstream‘
2020 年 12 月 8 号,CentOS 官方宣布了停止维护 CentOS Linux 的计划,并推出了 CentOS Stream 项目,CentOS Linux 8 作为 RHEL 8 的复刻版本,生命周期缩短,于 2021 年 12 月 31 日停止更新并停止维护(EOL&a…...
键盘上F1至F12键的作用
多年来,我们习惯了最上排的12个按键,从F1到F12,它们被称为“快速功能键”,可以让你更轻松地操作电脑;但是,很多人可能从未使用过它们,也从来不知道它们的用途。那么今天,就向大家科普…...
2023年湘潭大学OJ作业2 2023年下学期《C语言》作业0x01-数学计算 XTU OJ 1080,1081,1082,1083,1084
第一题 #include<stdio.h> #include<math.h>int main() {double a3.2,b4.7;aa*a,bb*b;double ressqrt(ab);printf("%g\n",res);return 0; } 注意math.h头文件的使用,还有sqrt是双精度的 第二题 #include<stdio.h> #include<math…...
C/C++ 进程间通信system V IPC对象超详细讲解(系统性学习day9)
目录 前言 一、system V IPC对象图解 1.流程图解: 编辑 2.查看linux内核中的ipc对象: 二、消息队列 1.消息队列的原理 2.消息队列相关的API 2.1 获取或创建消息队列(msgget) 实例代码如下: 2.2 发送消息到消…...
python—如何提取word中指定内容
假设有一个Word,该Word中存在 “联系人” 关键字,如何将该Word中的联系人所对应的内容提取出来呢? 该Word内容如下所示: 要在给定的Word文档中提取出与"联系人"关键字对应的内容,可以使用Python的py…...
分享几个通用个人简历模板|行业通用
Home(https://cvjury.com/) 专业设计的简历模板。 在竞争激烈的就业市场中脱颖而出的有效策略。 侧重于向招聘人员传达独特的价值主张。 帮助创建引人注目的简历、求职信和LinkedIn资料。 面向毕业生和学生的个性化简历解决方案。 添加图片注释,不超过 140 字&…...
如何正确操作封箱机
前文跟大家分享过封箱机错误操作三案例,那么封箱机到底如何才能正确操作呢?今天就和您分享一下如何正确操作封箱机。 1、确定正确的电源电压进行接入。目前国内封箱机均采用220v 50hz电源电压,但也有一些定制型设备可能使用380v电源ÿ…...
mysql面试题7:MySQL事务原理是什么?MySQL事务的隔离级别有哪些?
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL事务原理是什么? MySQL事务的原理是基于ACID(原子性、一致性、隔离性、持久性)特性来实现的,具体原理如下: Atomicity(原子性):事务…...
vue 项目打包性能分析插件 webpack-bundle-analyzer
webpack-bundle-analyzer 是 webpack 的插件,需要配合 webpack 和 webpack-cli 一起使用。这个插件可以读取输出文件夹(通常是 dist)中的 stats.json 文件,把该文件可视化展现,生成代码分析报告,可以直观地…...
C++ day2
1->x.mind 2->...
【Kafka专题】Kafka集群架构设计原理详解
目录 前言前置知识课程内容一、Kafka的Zookeeper元数据梳理1.1 zookeeper整体数据1.2 Controller Broker选举机制1.3 Leader Partition选举机制1.4 Leader Partition自动平衡机制*1.5 Partition故障恢复机制1.6 HW一致性保障-Epoch更新机制1.7 总结 学习总结感谢 前言 Kafka的…...
Docker 镜像的缓存特性
Author:rab 目录 前言一、构建缓存二、Pull 缓存总结 前言 首先我们要清楚,Docker 的镜像结构是分层的,镜像本身是只读的(不管任何一层),当我们基于某镜像运行一个容器时,会有一个新的可写层被…...
Javascript 笔记:object
一部分object可以见:JavaScript 笔记 初识JavaScript(变量)_UQI-LIUWJ的博客-CSDN博客 1 in操作符 2 hasOwnProperty 3 获取一个object所拥有的所有property 不去原型链上找 4 定义data property...
【vue3】可编辑el-table
<template><el-table:data"tableData"style"width: 100%"><el-table-columnprop"date"label"日期"width"180"><template #default"{row,$index}"><input type"text" v-mode…...
一个开源的安卓相机:OpenCamera
原网址 Open Camera download | SourceForge.net 我也上传了一个 https://github.com/quantum6/Android-OpenCamera...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
