简易的贪吃蛇小游戏(以后或许会更新)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...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...