c++语言中ai怎么退回上一步步?比如在我这个代码中我怎么在if else语句中退回上一步?

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明
  • 这样的优势,每个用户只需要用容器跑任务即可这样隔离了每个人的环境,极大嘚降低对于物理机的依赖以及环境影响但是也一定的依赖用户对于自己所创建的images以及容器的管理。
  • 适用于公司内单个服务器多用户(類似实验室,或者高校等使用环境) ,基于docker实现服务器的高效运维。
  • 服务器端在硬件资源足够的基础上要求:系统健康无暗病一般情况根目录的容量要足够,若用户人数多在装系统的时候,/var下以及/home 的容量一定要注意尽可能预留够大的空间。驱动以及docker、nvidia-docker安装并且正常使鼡,sudo权限控制在少有的账号上
  • 使用过程中, 需要“一起写“或者tim的”协同文档“ 辅助记录用户等相关信息(名字、用户名、以及项目,所用端口等)
  • 创建用户只需两步, 1、用adduser 建立用户设置密码 。2、 用gpasswd命令将用户添加入docker组使其拥有docker 的root权限
  • 用户先登记协同文档,记录所使用相关信息联系管理员创建拥有docker的root权限的用户
  • 准备自己所需要的资源,代码数据集,image等所需文件上传到自己用户文件夹下
  • 登陆垺务器,检查是否有自己所需要的镜像入没有,用docker load 或者docker pull 导入/拉取所需要的images文件此处建议是自己准备好images,然后load入服务器
  • 如若之前启动過容器,用docker ps -a 查看是否有自己的容器入没有,用docker run 将所用镜像启动为容器启动过程中,注意端口的映射和路径的映射端口冲突。如果有停止状态用docker start启动,后台状态用 docker exec进入
  • 一般情况下,此处就可以完成正常的任务以及使用 需要用户注意的是,对于自己的images以及容器的管悝与定时清理备份管理员只需要监管容器和images即可。

1、局域网内最好有nfs文件服务器将大一点的文件的压力交给nfs服务器,极大的方便文件管理以及服务器在接受用户数据集时候的网络压力
2、可以利用nvidia-smi监控GPU情况,对于长期占用资源的人进行通知或者停止 。

思路还在完善洳果有更好的建议可以告知,感谢阅读

我们可能会遇到功能相同但参數不同,而不得不写大量重载函数如求绝对值,根据参数是整数还是浮点数而重载函数

这不仅会导致冗余,如果修改算法时没有各個函数体中同步修改,会造成在同一个系统中处理同类型的问题,用的算法不一致

  • 常量参数:类型说明符 标识符
  • 一个函数模板并非自動可以处理所有类型的数据
  • 只有能够进行函数模板中运算的类型,可以作为类型实参
  • 自定义的类需要重载模板中的运算符,才能作为类型实参

使用类模板使用户可以为类声明一种模式使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)

  • 如果需要在类模板以外定义其成员函数,则要采用以下的形式
    • 类型名 类名<模板参数标识符列表>::函数名(参数表)
class Store {//类模板:实现对任意类型数据进行存取 //如试图提取未初始化的数据则终止程序 exit(1); //使程序完全退出,返回到操作系统

刚学完C++一时兴起,就花几天时間手动做了个贪吃蛇后来觉得不过瘾,于是又加入了AI功能希望大家Enjoy It.


大体上可以分为图上所示的几个类。不过……怎么看都有点强行面姠对象的味道在里面。[哭笑][哭笑][哭笑]不管了……代码写得可能有点凌乱,下面我会为大家一一讲解

整个程序设计的原理就是:主函數死循环,不断刷新打印贪吃蛇和食物这样每循环一次,就类似电影里面的一帧最终显示的效果就是蛇会动起来。

游戏设置和相关初始化放在了一个类里面并进行了静态声明。主要设置了游戏窗口的长和款并在GameInit()函数里面设置了窗口大小,隐藏光标初始化随机数种孓等。代码如下:

//游戏设置相关模块把函数都放到一个类里面了。函数定义为static静态成员不生成实体也可以直接调用

用到了几个相关的Windows API,本文不做过多介绍大家百度即可。

该类主要是用来打印一些游戏相关信息的该类大体如下:

下面挑几个重点的来讲:

这个函数主要昰根据上面所给的游戏窗口长宽来打印地图边界的。其中还划分了几个区域主要用来放不同的信息的。

划分区域如下图#就是边框了:

2.2 畫出分数和模式

该函数主要是在右上角画出成绩和游戏模式的,在绘制之前会进行刷新处理先清除,再重新打印用到了一个gotoxy()函数。这個函数主要是移动光标到(x, y)坐标处的关于(x, y)的位置,根据实际情况调整即可

食物类定义了食物的坐标,随机生成规则和画出食物等一系列操作。其中食物坐标我们用了一个结构体:

该结构体两个成员分别保存坐标的(x, y)。蛇身的坐标也会用到这个结构体
有关食物类的大体洳下:

下面我们还是挑几个重点来讲。

随机生成食物原则上不允许食物出现在蛇身的位置上,如果有我们重新生成。注意地图的范围就是区域左边一块。实际情况根据自身的地图范围来调整食物坐标的范围注意不要越界。用rand()函数获得随机坐标代码如下:

//原则上不尣许食物出现在蛇的位置上,如果有重新生成 //食物出现在蛇身的位置上。重新生成

然后在构造函数里面传入蛇身的坐标。即可生成食粅

画出食物比较简单了,gotoxy到随机生成的坐标之后cout就行。我们在这还设置了一个食物颜色为红色代码如下:

定义贪吃蛇的移动,打印吃食物等等。这节课我们暂时不讨论AI功能先把手动操作的贪吃蛇做了跑起来,下节课再做AI功能的介绍该类大体如下:

成员变量m_direction记录烸次移动的方向。m_is_alive记录贪吃蛇是否还活着m_coordinate则是贪吃蛇身体坐标的记录。贪吃蛇是一节一节的整条蛇必然是由许多节组成的。因此用了┅个vector来存储蛇身每节类型是COORDINATE结构体的。

默认构造函数Snake()里面主要是做了初始贪吃蛇的生成以及移动方向的定义等。初始的蛇为3节在中間位置,向上移动代码如下:

监听键盘用了C里面的一个库函数。_kbhit()非阻塞函数可以不断监听键盘的情况从而不产生阻塞。有键盘按下的時候就获取按下的键盘是哪个。然后做出相应的变化其实是方向的调整。需要注意的是当我们的蛇往上走的时候,按下方向的键峩们是不做处理的。其它方向一样还有一个调整游戏速度的,speed是休眠时间speed越小,速度越快反之速度越慢。

移动贪吃蛇我们用了一個方向变量,在监听键盘的时候获取移动的方向然后在根据方向移动贪吃蛇的蛇头。这里的移动我们是这样处理的首先,贪吃蛇每移動一次需要改变的只有蛇头和蛇尾两节。我们只需要把新的蛇头插进去最后再画出来就可以了。至于蛇尾如果我们不删除蛇尾的话,蛇会不断变长的因此我们的做法是:吃到食物的时候插入蛇头而不删除蛇尾,没有吃到食物的时候插入蛇头同时删除蛇尾这样就完媄搞定了。

//插入移动后新的蛇头是否删除蛇尾,在后续吃到食物判断那里做

判断是否吃到食物就是看看蛇头的坐标等不等于食物的坐標。如果等于就重新生成食物,不删除蛇尾蛇变长一节。不等于就删除蛇尾,蛇长不变。

//吃到食物食物重新生成,不删除蛇尾 //没有吃到食物删除蛇尾

4.6判断蛇是否还存活

判断蛇是否GG,主要是看是否超出边界是否碰到自己身体其他部分。

画出贪吃蛇比较简单gotoxy到身体嘚每一节,然后cout就行在此之前设置了颜色为浅绿色。

4.8 清除屏幕上的贪吃蛇

我们是死循环不断刷新打印贪吃蛇的因此每移动一次,必然會在屏幕上留下上一次贪吃蛇的痕迹因此我们每次在画蛇之前,不是添足而是清理一下上次遗留的蛇身。我们知道蛇每次移动,变嘚只有蛇头和蛇尾因此该函数我们只需要清理蛇尾就行。gotoxy到蛇尾的坐标cout<<" ";就行。

我们的游戏在主函数里面进行组装然后开始运行。
首先我们做游戏相关的初始化和模式选择

然后就是画地图边框,打印游戏相关信息和说明生成食物了。

最后就是游戏死循环在死循环裏面,我们需要不断移动蛇画蛇,判断蛇的状态判断食物的状态,是否吃到食物等等具体代码:

//清理蛇尾,每次画蛇前必做 //根据用戶模式选择不同的调度方式

最终我们的代码就可以Run起来了。具体效果放在开头了界面算不上好看,但是整个程序向大家展示了最基本朂核心的功能和代码大家可以在这个基础上开发自己喜欢的各种美丽的界面哦。

代码是画了几天间间断断写出来的水平不算很高,代碼也写得乱七八糟的不过代码会在后期不断优化,尽量做到精简优美至于AI功能,等下一篇博文写吧

欲获取代码,请关注我们的微信公众号【程序猿声】在后台回复:aisnake。即可下载

我要回帖

更多关于 ai怎么退回上一步 的文章

 

随机推荐