学习目的:

语言:c++
在做小项目的过程中学习并应用设计模式。


学习内容:

学习内容不局限于设计模式,还包括项目涉及到的内容

知识点:

  1. 设计模式:单例模式(懒汉式)、策略模式
  2. stl容器:list、vector、map(未使用)
  3. 控制台的一些操作:Windows.h

时间:2022.09

项目:贪吃蛇

该项目的目的是为了学习设计模式,所以先介绍一下。
策略模式:
在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。所以,定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。
简单来说就是定义一个接口,策略类(一系列的算法)实现该接口,然后定义一个‘操作’类去使用这些策略,
单例模式
单例模式提供一种创建对象的最佳方式,该类负责创建自己的对象,同时确保只有单个对象被创建。即,在程序运行过程中该类有且仅有一个对象实例。(类似静态变量,但又有很大的区别)

*注意:单例模式在多线程下使用千万要注意线程安全问题!!!

设计思路
使用“显示策略”即,将地图(map类)的显示、蛇身(snake类)的显示、食物(food类)的显示抽象为一个个策略接口Display_Interface,然后继承并实现该接口。定义一个使用这些策略的类Display,去使用这个接口。
策略结构如下图所示:


代码

策略代码:

//策略接口
class Display_Interface {
public:virtual void IF_Display() = 0;virtual ~Display_Interface() {};
};

显示类代码:

//显示类
//单例模式:懒汉模式(多线程不安全模式,单线程可放心用)
//采用策略模式的显示类,接口隔离
class Display {
private:Display() {};       //构造函数私有
public:~Display(){delete this->_disPlay;}//选择策略void Choose(Display_Interface* di = NULL) {if (di != NULL) {_di = di;}}//显示方法void Show() {_di->IF_Display();}//返回该类的对象,单例:静态static  Display* GetDisplay_OBJ() {if(_disPlay == NULL) _disPlay = new Display();return _disPlay;};private://单例:静态变量static Display* _disPlay;Display_Interface* _di = NULL;
};

控制台光标操作代码:

//宏函数,获取键盘某按键是否按下
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? true : false)/// <summary>
/// 设置控制台光标状态:ture:显示,false:隐藏。
/// </summary>
/// <param name="visible">bool类型参数,设置显示状态</param>
extern void SetCursorVisible(bool visible) {CONSOLE_CURSOR_INFO cursor;cursor.bVisible = visible;cursor.dwSize = sizeof(cursor);HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorInfo(handle, &cursor);
}/// <summary>
/// 设置光标位置
/// </summary>
/// <param name="x">列</param>
/// <param name="y">行</param>
extern void goto_xy(int x, int y) {//设置PositionCOORD pos = { x,y };//获取句柄HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//设置光标位置SetConsoleCursorPosition(handle, pos);
}/// <summary>
/// 设置字体颜色
/// </summary>
/// <param name="color">颜色参数</param>
extern void SetTextColor(int color) {//颜色值WORD wd  = color;//获取句柄HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//设置颜色SetConsoleTextAttribute(handle, wd);
}

main函数:

int main()
{map* _map = new map();Snake* _snake = new Snake();Food* _food = new Food();//创建单例对象Display* disPlay = Display::GetDisplay_OBJ();int speed = 1000;while (1) {//隐藏控制台光标SetCursorVisible(false);//使用显示策略进行刷新//显示地图disPlay->Choose(_map);disPlay->Show();//显示SnakedisPlay->Choose(_food);disPlay->Show();//显示FooddisPlay->Choose(_snake);disPlay->Show();Sleep(speed);_snake->SnakeRun(Snake_EAT(_snake, _food));//速度goto_xy(1, 41);std::cout << "speed:" << speed << " ";if (KEY_DOWN(VK_SPACE)) {if (speed > 200) speed = speed - 200;else speed -= 50;}if (speed == 0) speed = 1000;//打印食物坐标goto_xy(1, 42);for (int i = 0; i < snake_.size(); i++) {if (snake_[i] != 0)std::cout << "food node:" << "key:" << i << " value:" << snake_[i] << std::endl;}//清屏//system("cls");}std::cout << "Hello World!\n";
}

c++贪吃蛇小项目学习使用设计模式:单例模式,策略模式相关推荐

  1. 【精选】基于EasyX的贪吃蛇小游戏

    文章目录 前言 一.项目环境 1.Visual Studio 2019 2.EasyX 20200902 二.运行效果展示 0.加载游戏 1.主菜单 2.游戏设置 3.游戏说明 4.生存模式 5.无尽 ...

  2. C#贪吃蛇小游戏 毕业设计用

    贪吃蛇小项目 1.先创建一个蛇类 class pekosnake{public int x;public int y;public pekosnake(int a, int b){this.x = a ...

  3. 基于Linux ncurses图形库的贪吃蛇小游戏

    达者为先  师者之意 基于Linux ncurses图形库的贪吃蛇小游戏 前言 1 ncurses库程序的标准模式 2 ncurses库的常用函数 3 基于Linux ncurses图形库的贪吃蛇小游 ...

  4. python小游戏编程实例-10分钟教你用Python写一个贪吃蛇小游戏,适合练手项目

    另外要注意:光理论是不够的.这里顺便总大家一套2020最新python入门到高级项目实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,还可以跟老司机交 ...

  5. 【C++】经典项目控制台贪吃蛇小游戏详细教程

    [小游戏]贪吃蛇GreedySnake 本文将讲解如何使用c++面向对象方法编写控制台版贪吃蛇小游戏 项目github地址:游戏源码链接 游戏下载:GreedySnake 本人属初学者,水平所限,难免 ...

  6. GUI编程---贪吃蛇小游戏开发

    学习链接:狂神说Java–1小时开发贪吃蛇小游戏 ①初识理论 帧:时间片足够小=>就是动画,1秒30帧.连起来是动画,拆开就是静态的图片! 键盘监听 定时器Timer 游戏图片素材:GUI之贪吃 ...

  7. 简易贪吃蛇小游戏java版_用GUI实现java版贪吃蛇小游戏

    本文实例为大家分享了java版贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public stat ...

  8. Qt入门开发__贪吃蛇小游戏

    qt是一个由Qt Company于1991年开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序(比如控制台工具和服务器).在图形用户界面开发相比MFC更加 ...

  9. 蘑菇云「行空板Python入门教程」第六课:贪吃蛇小游戏

    在很久很久以前,手机屏幕都还是黑白的年代,有一款叫做"贪吃蛇"的游戏风靡了大街小巷,在那分辨率极低的屏幕上,几条扭扭曲曲的弧线似乎穿越了整个童年. 这节课上,就让我们用行空板来实现 ...

最新文章

  1. weblogic 修改控制台密码
  2. Java多线程之线程虚假唤醒
  3. kvm vnc的使用,鼠标漂移等
  4. mysql查询数据为0的所有字段6_MySQL8.0 初级学习笔记(六)查询数据
  5. CSS 自由缩放 resize属性
  6. 多线程下的进程同步(线程同步问题总结篇)
  7. php 对ioc容器的理解,关于php:了解IoC容器和依赖注入
  8. CodeVs天梯黄金Gold题解
  9. nodejs/pomelo 使用 mongodb 连接 mongo时 出现
  10. [Flex]打造属于自己的Apollo(二)
  11. 光纤中的非线性光学效应
  12. 彩虹易支付最新版开源版源码分享
  13. 最新搜狗收录提交工具分享
  14. Linux网络编程(四)
  15. 男孩只知道疯跑,就像印第安人围着野牛一样
  16. MLY -- 8.Establish a single-number evaluation metric for your team to optimize
  17. pycharm中Crtl+Shift+F10快捷键问题
  18. c语言学习(循环语句do while)
  19. vbs过程参数--byref和byval
  20. c# winform 解决PictureBox 无法打印全部图片的问题

热门文章

  1. 艾司博讯:拼多多开专营店需要多少保证金
  2. 这些强大到极致的iPhone自带App,个个都是一个顶十个好用
  3. 计算机网络基础9:IPV6寻址方法
  4. 电脑没声音怎么办?电脑没声音了怎么恢复?
  5. 出租车数据分析:用数据告诉你出租车资源配置是否合理
  6. 解决GitHub限速问题
  7. TigerGraph 使用csv导入List 或Set 数据的format
  8. python装饰器–原来如此简单
  9. 免费制作云图的网站(可以从文章中提取关键字)
  10. IM篇 I (╯‵□′)╯︵┻━┻ 极光?个推?腾讯云?第三方推送平台该怎么选?