C#之控制台版本得贪吃蛇
贪吃蛇小时候大家都玩过,具体步骤如下:
1.给游戏制造一个有限得空间。
2.生成墙壁,小蛇碰撞到墙壁或者咬到自己的尾巴,游戏结束。
3.生成随机的食物。
4.吃掉食物,增加自身的体长,并生成新的食物。
具体代码如下:
定义一个小蛇类,该类包含吃东西,移动,检测碰撞等方法。
class Snake
{private List<Point> _body;private Direction _direction;private int _step = 1;private Point _tail;public Snake(Point tail, int length, Direction direction){_direction = direction;_body = new List<Point>();for (int i = 0; i < length; i++){Point p = new Point(tail.X, tail.Y, tail.Symbol);p.Move(i, _direction);_body.Add(p);}_tail = _body.First();}public void Move(){Point head = GetNextPoint();_body.Add(head);_tail.Clear();_tail = _body.First();_body.RemoveAt(0);head.Draw();}public bool Eat(Point food){Point head = GetNextPoint();if (head.IsHit(food)){food.Symbol = head.Symbol;_body.Add(food);return true;}return false;}public void HandleKey(ConsoleKey key){if (key == ConsoleKey.LeftArrow && _direction != Direction.Right){_direction = Direction.Left;}else if (key == ConsoleKey.RightArrow && _direction != Direction.Left){_direction = Direction.Right;}else if (key == ConsoleKey.UpArrow && _direction != Direction.Down){_direction = Direction.Up;}else if (key == ConsoleKey.DownArrow && _direction != Direction.Up){_direction = Direction.Down;}}public Point GetNextPoint(){Point head = _body.Last();Point nextPoint = new Point(head.X, head.Y, head.Symbol);nextPoint.Move(_step, _direction);return nextPoint;}public void Draw(){foreach (Point p in _body){p.Draw();}}public bool IsHitTail(){Point head = _body.Last();for (int i = 0; i < _body.Count - 2; i++){if (head.IsHit(_body[i])){return true;}}return false;}
}
定义一个墙体类:
class Walls
{private List<Point> _wallList;public Walls(int mapWidth, int mapHeight){_wallList = new List<Point>();DrawHorizontalLine(0);DrawHorizontalLine(mapHeight - 1);DrawVerticalLine(0);DrawVerticalLine(mapWidth - 1);}private void DrawHorizontalLine(int y){for (int x = 0; x < Console.WindowWidth; x++){Point p = new Point(x, y, '#');p.Draw();_wallList.Add(p);}}private void DrawVerticalLine(int x){for (int y = 0; y < Console.WindowHeight; y++){Point p = new Point(x, y, '#');p.Draw();_wallList.Add(p);}}public bool IsHit(Snake snake){Point head = snake.GetNextPoint();return IsHit(head);}private bool IsHit(Point p){return _wallList.Any(w => w.IsHit(p));}public void Draw(){foreach (Point p in _wallList){p.Draw();}}
}
定义一个创建食物类:
class FoodCreator
{private readonly int _mapWidth;private readonly int _mapHeight;private readonly char _symbol;public FoodCreator(int mapWidth, int mapHeight, char symbol){_mapWidth = mapWidth;_mapHeight = mapHeight;_symbol = symbol;}public Point CreateFood(){int x = new Random().Next(2, _mapWidth - 2);int y = new Random().Next(2, _mapHeight - 2);return new Point(x, y, _symbol);}
}
定义一个枚举,表示方向:
enum Direction
{Left,Right,Up,Down
}
定义一个坐标类应用重绘:
class Point
{public int X { get; set; }public int Y { get; set; }public char Symbol { get; set; }public Point(int x, int y, char symbol){X = x;Y = y;Symbol = symbol;}public void Draw(){Console.SetCursorPosition(X, Y);Console.Write(Symbol);}public void Clear(){Symbol = ' ';Draw();}public void Move(int offset, Direction direction){if (direction == Direction.Right){X += offset;}else if (direction == Direction.Left){X -= offset;}else if (direction == Direction.Up){Y -= offset;}else if (direction == Direction.Down){Y += offset;}}public bool IsHit(Point p){return p.X == X && p.Y == Y;}
}
函数入口:
class Program
{static void Main(){Console.Title = "贪吃蛇游戏";Console.CursorVisible = false;Console.SetWindowSize(40, 20);Console.SetBufferSize(40, 20);Walls walls = new Walls(40, 20);walls.Draw();Snake snake = new Snake(new Point(6, 5, '*'),1,Direction.Down);snake.Draw();FoodCreator foodCreator = new FoodCreator(40, 20, '$');Point food = foodCreator.CreateFood();food.Draw();while (true){if (walls.IsHit(snake) || snake.IsHitTail()){break;}if (snake.Eat(food)){food = foodCreator.CreateFood();food.Draw();}else{snake.Move();}System.Threading.Thread.Sleep(100);if (Console.KeyAvailable){ConsoleKeyInfo key = Console.ReadKey();snake.HandleKey(key.Key);}}WriteGameOver();Console.ReadLine();}static void WriteGameOver(){int xOffset = 10;int yOffset = 8;Console.ForegroundColor = ConsoleColor.Red;Console.SetCursorPosition(xOffset, yOffset++);WriteText("========", xOffset, yOffset++);WriteText("GAME OVER", xOffset + 1, yOffset++);yOffset++;WriteText("========", xOffset, yOffset++);}static void WriteText(String text, int xOffset, int yOffset){Console.SetCursorPosition(xOffset, yOffset);Console.WriteLine(text);}
}
运行效果图:
相关文章:

C#之控制台版本得贪吃蛇
贪吃蛇小时候大家都玩过,具体步骤如下: 1.给游戏制造一个有限得空间。 2.生成墙壁,小蛇碰撞到墙壁或者咬到自己的尾巴,游戏结束。 3.生成随机的食物。 4.吃掉食物,增加自身的体长,并生成新的食物。 具体代码如下&…...

ffplay数据结构分析(一)
本文为相关课程的学习记录,相关分析均来源于课程的讲解,主要学习音视频相关的操作,对字幕的处理不做分析 下面我们对ffplay的相关数据结构进行分析,本章主要是对PacketQueue的讲解 struct MyAVPacketList和PacketQueue队列 ffp…...

JavaWeb学习|JSP相关内容
1.什么是JSP Java Server Pages: Java服务器端页面,也和Servlet一样,用于动态Web技术! 最大的特点: 。写JSP就像在写HTML 。区别: 。HTML只给用户提供静态的数据 。JSP页面中可以嵌入JAVA代码,为用户提供动态数据 JSP最终也会被转换成为一…...

Springboot后端通过路径映射获取本机图片资源
项目场景: 项目中对图片的处理与查看是必不可少的,本文将讲解如何通过项目路径来获取到本机电脑的图片资源 如图所示,在我的本机D盘的图片测试文件夹(文件夹名字不要有中文)下有一些图片, 我们要在浏览器上访问到这些图片&#…...

【IDEA + Spark 3.4.1 + sbt 1.9.3 + Spark MLlib 构建鸢尾花决策树分类预测模型】
决策树进行鸢尾花分类的案例 背景说明: 通过IDEA Spark 3.4.1 sbt 1.9.3 Spark MLlib 构建鸢尾花决策树分类预测模型,这是一个分类模型案例,通过该案例,可以快速了解Spark MLlib分类预测模型的使用方法。 依赖 ThisBuild /…...

亚马逊 EC2服务器下部署java环境
1. jdk 1.8 安装 1.1 下载jdk包 官网 Java Downloads | Oracle tar.gz 包 下载下来 1.2 本地连接 服务器 我用的是亚马逊的ec2 系统是 ubuntu 的 ssh工具是 Mobaxterm , 公有dns 创建实例时的秘钥 链接 Mobaxterm 因为使用的 ubuntu 所以登录的 名称 就是 ubuntu 然后 …...

CTF流量题解http1.pcapng
使用Wireshark工具打开流量文件http1.pcapng,如下图所示。 在过滤检索栏输入http,wireshark自动进行过滤。...
若依vue前端有全局用户信息变量吗
"若依"是一个基于SpringBoot和Vue的前后端分离的开源项目。在前端Vue部分,全局用户信息通常保存在Vuex中,Vuex是Vue.js的状态管理模式。它提供了一个集中式存储来管理所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生…...

什么是Milvus
原文出处:https://www.yii666.com/blog/393941.html 什么是Milvus Milvus 是一款云原生向量数据库,它具备高可用、高性能、易拓展的特点,用于海量向量数据的实时召回。 Milvus 基于 FAISS、Annoy、HNSW 等向量搜索库构建,核心是…...

如何快速实现三菱FX3U程序的无线下载?
1.系统概述 三菱PLC FX3u可以使用专用下载线通过计算机串口下载程序,同样也可以使用自制下载线缆,连接无线模块 DTD435M进行远程无线下载程序,计算机端采用RS232或者RS485 将计算机端与无线模块连接,PLC端同样使用RS232转RS485将…...

Flink源码之RPC
Flink是一个典型的Master/Slave分布式实时处理系统,分布式系统组件之间必然涉及通信,也即RPC,以下图展示Flink组件之间的关系: RPCGateWay 一般RPC框架可根据用户业务类生成客户端和服务器端通信底层代码,此时只需定…...

【LeetCode 75】第二十四题(2390)从字符串中移除星号
目录 题目: 示例: 分析: 代码运行结果: 题目: 示例: 分析: 题目给我们一个字符串,然后字符串中包含星号*,要求每个星号消除一个从星号左边起最近的一个字符…...

通向架构师的道路之weblogic的集群与配置
一、Weblogic的集群 还记得我们在第五天教程中讲到的关于Tomcat的集群吗? 两个tomcat做node即tomcat1, tomcat2,使用Apache HttpServer做请求派发。 现在看看WebLogic的集群吧,其实也差不多。 区别在于: Tomcat的集群的实现为两个物理上…...

SpringBoot 项目创建与运行
一、Spring Boot 1、什么是Spring Boot?为什么要学 Spring Boot Spring 的诞生是为了简化 Java 程序的开发的,而 Spring Boot 的诞生是为了简化 Spring 程序开发的。 Spring Boot 翻译一下就是 Spring 脚手架 盖房子的这个架子就是脚手架,…...

FOHEART H1数据手套:连接虚拟与现实,塑造智能交互新未来
在全新交互时代背景中,数据手套无疑是一种重要的科技产物。它不仅彻底改变了我们与虚拟世界的互动方式,更为我们提供了一种全新、更为直观的交互形式。 FOHEART H1数据手套结合了虚拟现实、手势识别等高新技术,用先进的传感技术和精准的数据…...
MyBatis学习笔记3
日志 1.日志工厂 如果一个数据库的操作,出现了异常,我们需要排错。日志就是最好的工具。 日志工厂:SLF4JLOG4J(掌握)LOG4J2JDK_LOGGINGCOMMONS_LOGGINGSTDOUT_LOGGING(掌握)NO_LOGGING 2.分页 减少数据…...
ES6学习-Symbol
Symbol 数据类型Symbol,表示独一无二的值。 对象的属性名可有两种类型,一种是原来的字符串,另一种是新增的 Symbol 类型 可以保证不与其他属性名产生冲突。 let s1 Symbol() let s2 Symbol() console.log(s1, s2, s1 s2)//Symbol() Sy…...

【Redis】使用Docker镜像配置集群时的Operation timed out问题
不知道有没有小伙伴跟我一样是使用的Docker镜像进行Redis集群案例模拟的(三台虚拟机确实带不动 ),然后我遇到了一个问题:Could not connect to Redis at 172.17.0.2:6379: Operation timed out 172.17.0.2是我其中一个Redis实例的…...

Java 生产初学常用注解
目录 0. 基础语法逻辑运算符继承抛出异常获取数据方式泛型 1. 接收前端数据(controller)mybatis1. QueryWrapper获取和赋值 2. service 层注解 3. Dao 层(与数据库交互)3.1 mybatis-plus中BaseMapper 4. ELK框架es配置sql参数logs…...

mousedown拖拽功能(vue3+ts)
因为项目有rem适配,使用第三方插件无法处理适配问题,所有只能自己写拖拽功能了 拖拽一般都会想到按下,移动,放开,但是本人亲测,就在div绑定一个按下事件就行了(在事件里面写另外两个事件&#x…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...