c++贪吃蛇小项目学习使用设计模式:单例模式,策略模式
学习目的:
语言:c++
在做小项目的过程中学习并应用设计模式。
学习内容:
学习内容不局限于设计模式,还包括项目涉及到的内容
知识点:
- 设计模式:单例模式(懒汉式)、策略模式
- stl容器:list、vector、map(未使用)
- 控制台的一些操作: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++贪吃蛇小项目学习使用设计模式:单例模式,策略模式相关推荐
- 【精选】基于EasyX的贪吃蛇小游戏
文章目录 前言 一.项目环境 1.Visual Studio 2019 2.EasyX 20200902 二.运行效果展示 0.加载游戏 1.主菜单 2.游戏设置 3.游戏说明 4.生存模式 5.无尽 ...
- C#贪吃蛇小游戏 毕业设计用
贪吃蛇小项目 1.先创建一个蛇类 class pekosnake{public int x;public int y;public pekosnake(int a, int b){this.x = a ...
- 基于Linux ncurses图形库的贪吃蛇小游戏
达者为先 师者之意 基于Linux ncurses图形库的贪吃蛇小游戏 前言 1 ncurses库程序的标准模式 2 ncurses库的常用函数 3 基于Linux ncurses图形库的贪吃蛇小游 ...
- python小游戏编程实例-10分钟教你用Python写一个贪吃蛇小游戏,适合练手项目
另外要注意:光理论是不够的.这里顺便总大家一套2020最新python入门到高级项目实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,还可以跟老司机交 ...
- 【C++】经典项目控制台贪吃蛇小游戏详细教程
[小游戏]贪吃蛇GreedySnake 本文将讲解如何使用c++面向对象方法编写控制台版贪吃蛇小游戏 项目github地址:游戏源码链接 游戏下载:GreedySnake 本人属初学者,水平所限,难免 ...
- GUI编程---贪吃蛇小游戏开发
学习链接:狂神说Java–1小时开发贪吃蛇小游戏 ①初识理论 帧:时间片足够小=>就是动画,1秒30帧.连起来是动画,拆开就是静态的图片! 键盘监听 定时器Timer 游戏图片素材:GUI之贪吃 ...
- 简易贪吃蛇小游戏java版_用GUI实现java版贪吃蛇小游戏
本文实例为大家分享了java版贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public stat ...
- Qt入门开发__贪吃蛇小游戏
qt是一个由Qt Company于1991年开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序(比如控制台工具和服务器).在图形用户界面开发相比MFC更加 ...
- 蘑菇云「行空板Python入门教程」第六课:贪吃蛇小游戏
在很久很久以前,手机屏幕都还是黑白的年代,有一款叫做"贪吃蛇"的游戏风靡了大街小巷,在那分辨率极低的屏幕上,几条扭扭曲曲的弧线似乎穿越了整个童年. 这节课上,就让我们用行空板来实现 ...
最新文章
- weblogic 修改控制台密码
- Java多线程之线程虚假唤醒
- kvm vnc的使用,鼠标漂移等
- mysql查询数据为0的所有字段6_MySQL8.0 初级学习笔记(六)查询数据
- CSS 自由缩放 resize属性
- 多线程下的进程同步(线程同步问题总结篇)
- php 对ioc容器的理解,关于php:了解IoC容器和依赖注入
- CodeVs天梯黄金Gold题解
- nodejs/pomelo 使用 mongodb 连接 mongo时 出现
- [Flex]打造属于自己的Apollo(二)
- 光纤中的非线性光学效应
- 彩虹易支付最新版开源版源码分享
- 最新搜狗收录提交工具分享
- Linux网络编程(四)
- 男孩只知道疯跑,就像印第安人围着野牛一样
- MLY -- 8.Establish a single-number evaluation metric for your team to optimize
- pycharm中Crtl+Shift+F10快捷键问题
- c语言学习(循环语句do while)
- vbs过程参数--byref和byval
- c# winform 解决PictureBox 无法打印全部图片的问题