网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
05月01日漏签0天
c语言吧 关注:801,944贴子:4,377,179
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 11回复贴,共1页
<<返回c语言吧
>0< 加载中...

直播:一步一步用设计模式编写贪吃蛇

  • 取消只看楼主
  • 收藏

  • 回复
  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
吧里的水贴太多啦,来点不一样的,不知道有没有淫对这个有兴趣!!


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个帖子的目的有3个:
1.教大家怎么利用c++编写一个小游戏
2.把设计模式应用到现实的程序中
3.怎么总体去设计一个程序
现在lz代码一行都没有写,一步一步把坑给填了吧。代码到时候写完再完整放出来,如果有需要的朋友可以先留下邮箱哈!!!


2026-05-01 09:38:51
广告
不感兴趣
开通SVIP免广告
  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
先简单把整个游戏的玩法和思路先整理一下哈:
1.这个贪吃蛇是一个经典的贪吃蛇,暂时只Windows版本
2.玩家上,下,左,右控制蛇在地图上移动
3.地图有3种东西:A.障碍物,B.果实,C.道具
4.蛇碰到障碍物就game over,吃到果实就会加分数,吃的道具就会有特殊效果(比如无敌等)
5.玩家在游戏结束时,会记录游戏分数,有排行榜进行排名
暂时想到这么多,大家有补充的吗?


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
接下来简单地分析一下上面的东西哈。
初略地看一下需求,上面的东西包含了几个方面:
1.我们的主角:蛇
2.蛇移动的:地图
3.地图上面的:物体(障碍物,果实,道具等等)
4.游戏的:分数
上面那4个“东西”,其实就是我们所说的“类”,我们现在是从现实出发,把它们一个一个找出来,分析它们的各种行为,最后我们还需要把它们进行“抽象”
码客提醒:抽象是很重要的东西!!!


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这里要多说一句哈,这边所说的设计模式,并不是常见书上的“设计模式”。因为我不会使用书上的定义,就是想到什么说什么,靠我对设计模式的了解给大家写出来。
码客提醒:根据本人这么多年的经验,学习设计模式并不能简单按照书上的N种设计模式把它背下来。而是要多思考我们为什么要使用设计模式,怎么应用到实际的编程中。


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
上面的Window对象,全部是虚函数组成,为什么要这样子呢?
码客:在设计模式的书上经常提到,只能对抽象编程,而不能对实体编程。Window只是抽象出窗口这个东西的最基本的东西,具体实现交给具体的实体去实现即可(稍后的MSWindow将会实现它)


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
WIndow接口已经给出来了,但是怎么实现和使用呢?
先看使用:
#include "Api.h"
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
kindow::Window *window = kindow::CreateWindowX(hInstance, "Knake", 10,10,660,550);
window->Start();
return 0;
}
外面调用了2行代码就实现了创建一个窗口,kindow::CreateWindowX的代码如下:
namespace kindow {
class Window;
// 不可移植
Window *CreateWindowX(HINSTANCE instance, const std::string &name, int x, int y, int width, int height) {
return new MSWindow(instance, name, x, y, width, height);
}
}
这里的CreateWindowX是正对具体编程了,小伙伴有什么看法????


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
上面是使用,下面是Window的实现了,我们先简单实现在微软的Windows的:
class MSWindow : public Window {
public:
MSWindow(HINSTANCE instance, const std::string &name, int x, int y, int width, int height);
virtual ~MSWindow();
private:
void RegisterClass();
BOOL CreateMSWindow();
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
private:
virtual void Start();
virtual void Close();
virtual Timer *CreateTimer();
virtual void Draw(Drawable *drawable, int x, int y);
virtual void AddEventListener(EventListener *listener);
virtual void RemoveEventListener(EventListener *listenr);
private:
std::string name_;
int x_;
int y_;
int width_;
int height_;
HINSTANCE hInstance_;
HWND hWnd_;
};
}


2026-05-01 09:32:51
广告
不感兴趣
开通SVIP免广告
  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
.cpp的:
#include "MSWindow.h"
#include <assert.h>
namespace kindow {
MSWindow::MSWindow(HINSTANCE instance,const std::string &name, int x, int y, int width, int height) {
hInstance_ = instance;
name_ = name;
x_ = x;
y_ = y;
width_ = width;
height_ = height;
hWnd_ = NULL;
}
MSWindow::~MSWindow() {
}
void MSWindow::RegisterClass() {
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance_;
wcex.hIcon = NULL;
wcex.hCursor = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = name_.data();
wcex.hIconSm = NULL;
RegisterClassEx(&wcex);
}
BOOL MSWindow::CreateMSWindow() {
hWnd_ = CreateWindow(name_.data(), name_.data() , WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance_, NULL);
if (!hWnd_) {
return FALSE;
}
MoveWindow(hWnd_,x_,y_,width_,height_,true);
ShowWindow(hWnd_, true);
UpdateWindow(hWnd_);
return TRUE;
}
// 多个窗口怎么处理
LRESULT CALLBACK MSWindow::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
void MSWindow::Start() {
assert(hWnd_ == NULL);
RegisterClass();
// 如果这边创建失败,怎么通知“业务层”呢?
if (!CreateMSWindow()) {
return;
}
MSG msg;
while(true) {
if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE)) {
if (msg.message == WM_QUIT) {
break;
}
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else {
/*g_paint.m_nowOfPaint = GetTickCount();
if(g_paint.m_nowOfPaint - g_paint.m_passOfPaint >= 40)
{
g_hDC = GetDC(hWnd);
g_paint.Paint(g_snake, g_hDC);
ReleaseDC(hWnd, g_hDC);
} */
}
}
}
void MSWindow::Close() {
}
Timer *MSWindow::CreateTimer() {
return NULL;
}
void MSWindow::Draw(Drawable *drawable, int x, int y) {
}
void MSWindow::AddEventListener(EventListener *listener) {
}
void MSWindow::RemoveEventListener(EventListener *listenr) {
}
}


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
现在为止的代码放在:
http://make1024.com/?/article/2
附件:Knake_3_1.rar
需要看的朋友可以去下载看看咯


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
LZ来了!!!


  • make1024_com
  • 大能力者
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
到现在为止的代码在:
http://make1024.com/?/article/2
的附件:Knake_EventListener.rar
大家可以去看看,


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 11回复贴,共1页
<<返回c语言吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示