先别急着看源码,首先要解决的问题是程序框架。

VC只是一个开发环境,支持的是C++。Windows下的程序,当然是用Windows API(Application Programming Interface)写成的。 VC提供了一个类库MFC,如同课本中介绍的一样,“点几下鼠标即可生成一个程序”。控件靠拖动即可生成。很方便,但也是最大的缺陷。隐藏了太多东西。我的电脑中VC的一个链接库有点问题,无法运行MFC程序,API是可以运行的。我用API来做。

既然是API,默认生成的结构是:主函数WinMain,注册类MyRegisterClass,初始化InitInstance,消息处理WndProc。

在InitInstance中处理变量的初始设置。

在WndProc中实现游戏的流程控制。

以前做《俄罗斯方块》,包括博客中贴的《扫雷》,都是用一个变量表示当前的状态。这是一种状态机的转换,很简单,一个状态迁移到另一个状态。不同状态下,有不同的消息处理。我用全局变量iGameState来记录。

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,

LPARAM lParam)
{switch(message) 
    {
case消息ID:switch(当前状态)
        {
case游戏开始菜单:break;case游戏进行中:break;
        }
break;case消息ID:break;
    }
}

这个游戏用了多少种状态?

#define GAME_STATE_MENU 0
#define GAME_STATE_MAIN 1

#define GAME_STATE_END 2
#define GAME_STATE_END_NEXT 3

先看游戏的第一个状态GAME_STATE_MENU:用户点击“开始”,进入游戏。

很简单,建一个按钮,处理它的单击消息,修改当前游戏状态。

创建按钮可以用CreateWindow,我没这样做。

画一个图片(我所有的图片资源都是BMP位图),包含两幅图像,一个是按钮正常情况下显示,一个是鼠标移动到上面后显示,并列排放。

怎样显示图片呢?每个图片都由一个位图句柄表示。先把图片文件加载到工程资源resources中,在加载到一个位图句柄。屏幕作为一个显示设备,需要获取他的Device Contexts的句柄。MFC中的CDC就是对设备句柄HDC的封装。Device Contexts,有时候翻译成“设备上下文”,中英文的意思还是有差别,直接叫DC。显示的时候,先画到一个临时的DC,再画到屏幕上。

这个初始化、显示的功能,放到一个类中。这样的小游戏,如果不用类来组织,也能实现功能,但是有大缺点,代码不易维护。一个基本的思想就是:尽量模块化。

void MYBITMAP::Init(HINSTANCE hInstance,int iResource,int row,int col)
{
 BITMAP bm;
 inum=row;
 jnum=col;

hBm=LoadBitmap(hInstance,MAKEINTRESOURCE(iResource));
 GetObject(hBm,sizeof(BITMAP),&bm);

width=bm.bmWidth/inum;
 height=bm.bmHeight/jnum;
}

简单说明一下:hInstance程序实例句柄,iResource位图资源ID,row,col,把图像分割成几行几列。函数记录了这张图像的图像句柄,有几行几列,分割后单幅图的宽高。

这是图像的信息记录完成,以下要设置“屏幕DC”,“临时DC”。

void MYBITMAP::SetDC(HDC hdest,HDC hsrc)
{
 hdcdest=hdest;
 hdcsrc=hsrc;
}

从临时DC显示到屏幕上,参数为坐标、第几幅图像:

void MYBITMAP::Show(int x,int y,int iFrame)
{
 xpos=x;
 ypos=y;
 SelectObject(hdcsrc,hBm);
 BitBlt(hdcdest,xpos,ypos,width,height,hdcsrc,iFrame*width,0,SRCCOPY); 
}

说明:显示的时候记录了它的坐标,SelectObject将句柄装入临时DC,再BitBlt到屏幕上。

图像的显示问题解决了。下面要判断鼠标坐标,当鼠标移到其上时,改变图像,下面这两个函数入参为鼠标坐标,判断是否在图片范围内,设置framenow。然后,重绘屏幕,根据framenow显示指定图像即可。

int MYBITMAP::MouseOut(int x,int y)
{
 if(x<xpos || x>(xpos+width) || y<ypos || y>(ypos+height))
  framenow=0;

return 1;
}
int MYBITMAP::MouseOver(int x,int y)
{
 if(x<xpos || x>(xpos+width) || y<ypos || y>(ypos+height))
  return 0;

framenow=1;
 return 1;
}

看一下这个状态下的消息处理:重绘消息,单击消息,鼠标移动消息

重绘消息:画一个背景,画一个“开始”按钮。

caseWM_PAINT:
            hdcwindow
=BeginPaint(hWnd,&ps);switch(iGameState)
            {
caseGAME_STATE_MENU:
                SelectObject(hdcscreen,hback);
                bBack.ShowCenter(
0);
                bBegin.ShowCenter(
200);break;

单击消息:如果鼠标单击了开始按钮,迁移状态。

caseWM_LBUTTONUP:switch(iGameState)
            {
caseGAME_STATE_MENU:if(bBegin.DetectMouseUp(LOWORD(lParam),HIWORD(lParam)))
                {
                    iGameState
=GAME_STATE_MAIN;//加载地图gmap.LoadFirstMap();
                    gamecatch.Init();
                    myclock.Begin(hWnd,
100,TIME_MATCH);//清除当前金钱数量gmap.ClearMoney();
                }
break;

鼠标移动消息:检测鼠标坐标,改变图片当前帧(第几幅):

caseWM_MOUSEMOVE:switch(iGameState)
            {
caseGAME_STATE_MENU:
                bBegin.DetectMouseMove(LOWORD(lParam),HIWORD(lParam));
break;

这样,游戏的第一个状态就完成了。且听下回分解。

附:游戏主文件源码

//gamegold.cpp : Defines the entry point for the application.//#include"stdafx.h"#include"resource.h"#include"bitmaptool.h"#include"filereport.h"#include"gamemap.h"#include"catch.h"#include"myclock.h"#include"mybutton.h"#include"myequip.h"#defineMAX_LOADSTRING 100#defineGAME_STATE_MAIN    1#defineGAME_STATE_MENU    0#defineGAME_STATE_END    2#defineGAME_STATE_END_NEXT    3//FILEREPORT f1("main.txt");//Global Variables:HINSTANCE hInst;//current instanceTCHAR szTitle[MAX_LOADSTRING];//The title bar textTCHAR szWindowClass[MAX_LOADSTRING];//The title bar textMYBITMAP bBegin(GAMEWIDTH,GAMEHEIGHT);
MYBITMAP bMap(GAMEWIDTH,GAMEHEIGHT);
MYBITMAP bEarth(GAMEWIDTH,GAMEHEIGHT);
MYBITMAP bObject(GAMEWIDTH,GAMEHEIGHT);
MYBITMAP bBack(GAMEWIDTH,GAMEHEIGHT);
MYBITMAP bFire(GAMEWIDTH,GAMEHEIGHT);
MYBITMAP bBombAni(GAMEWIDTH,GAMEHEIGHT);

MYEQUIP bEquip;structEQUIP
{
intiPrice;charinfo[100];
};
structEQUIP equip[]={
    {
100,"炮:能炸掉抓到的物品 100元"},
    {
200,"体力:加快拉动物品的速度 200元"}};

MYBUTTON btNext;

HDC hdcwindow,hdcscreen,hdcmem;
HBITMAP hback;

HFONT hf[5];//游戏状态intiGameState=GAME_STATE_MENU;

GAMEMAP gmap;
GAMECATCH gamecatch;
MYCLOCK myclock;//voidInitFont()
{
chartemp[10]={0};inti;for(i=0;i<=sizeof(hf)/sizeof(HFONT);i++)
    {
        sprintf(temp,
"black%d",i);
        hf[i]
=CreateFont(10*(i+2),0,0,0,FW_HEAVY,0,0,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,
                CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH
|FF_DONTCARE,temp);
    }
}
//Foward declarations of functions included in this code module:ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE,
int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
intAPIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
intnCmdShow)
{
//TODO: Place code here.MSG msg;
    HACCEL hAccelTable;
//Initialize global stringsLoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_GAMEGOLD, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);
//Perform application initialization:if(!InitInstance (hInstance, nCmdShow)) 
    {
returnFALSE;
    }

hAccelTable=LoadAccelerators(hInstance, (LPCTSTR)IDC_GAMEGOLD);//Main message loop:while(GetMessage(&msg, NULL,0,0)) 
    {
if(!TranslateAccelerator(msg.hwnd, hAccelTable,&msg)) 
        {
            TranslateMessage(
&msg);
            DispatchMessage(
&msg);
        }
    }
returnmsg.wParam;
}
////FUNCTION: MyRegisterClass()////PURPOSE: Registers the window class.////COMMENTS:////This function and its usage is only necessary if you want this code//to be compatible with Win32 systems prior to the 'RegisterClassEx'//function that was added to Windows 95. It is important to call this function//so that the application will get 'well formed' small icons associated//with it.//ATOM MyRegisterClass(HINSTANCE hInstance)
{
    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
=LoadIcon(hInstance, (LPCTSTR)IDI_GAMEGOLD);
    wcex.hCursor
=LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground
=(HBRUSH)(COLOR_WINDOW+1);//wcex.lpszMenuName    = (LPCSTR)IDC_GAMEGOLD;wcex.lpszMenuName=NULL;
    wcex.lpszClassName
=szWindowClass;
    wcex.hIconSm
=LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);returnRegisterClassEx(&wcex);
}
////FUNCTION: InitInstance(HANDLE, int)////PURPOSE: Saves instance handle and creates main window////COMMENTS:////In this function, we save the instance handle in a global variable and//create and display the main program window.//BOOL InitInstance(HINSTANCE hInstance,intnCmdShow)
{
    HWND hWnd;
intx,y;
    
    hInst
=hInstance;//Store instance handle in our global variablehWnd=CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
0, CW_USEDEFAULT,0, NULL, NULL, hInstance, NULL);if(!hWnd)
    {
returnFALSE;
    }
//窗口居中x=GetSystemMetrics(SM_CXSCREEN);
    y
=GetSystemMetrics(SM_CYSCREEN);
    MoveWindow(hWnd,(x
-GAMEWIDTH)/2,(y-GAMEHEIGHT)/2,GAMEWIDTH,GAMEHEIGHT,false);
    
    hdcwindow
=GetDC(hWnd);
    hdcmem
=CreateCompatibleDC(hdcwindow);
    hdcscreen
=CreateCompatibleDC(hdcwindow);
    
    gmap.hdc
=hdcscreen;
    
    myclock.SetDC(hdcscreen);
    
    ReleaseDC(hWnd,hdcwindow);
//设置字体InitFont();
    gmap.SetFont(hf,
sizeof(hf));//加载图像hback=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP_NULL));

bBack.Init(hInst,IDB_BITMAP_NULL,1,1);
    bBack.SetDC(hdcscreen,hdcmem);
    bBegin.Init(hInst,IDB_BITMAP_BEGIN,
2,1);
    bBegin.SetDC(hdcscreen,hdcmem);
    bMap.Init(hInst,IDB_BITMAP_GROUND,
1,1);
    bMap.SetDC(hdcscreen,hdcmem);
    bEarth.Init(hInst,IDB_BITMAP_EARTH,
3,1);
    bEarth.SetDC(hdcscreen,hdcmem);
    bObject.Init(hInst,IDB_BITMAP_OBJECT,
5,1);
    bObject.SetDC(hdcscreen,hdcmem);
    bEquip.Init(hInst,IDB_BITMAP_EQUIP,
3,1);
    bEquip.SetDC(hdcscreen,hdcmem);
    bFire.Init(hInst,IDB_BITMAP_FIRE,
1,1);
    bFire.SetDC(hdcscreen,hdcmem);
    bBombAni.Init(hInst,IDB_BITMAP_BOMB,
4,1);
    bBombAni.SetDC(hdcscreen,hdcmem);
//按钮btNext.Init("下一关",RGB(0,0,255),RGB(0,128,255),
        RGB(
255,255,0),RGB(255,255,128),hf[3]);
    btNext.SetDC(hdcscreen,hdcmem);
//得到总关数gmap.GetMatchNum();
    
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
returnTRUE;
}
////FUNCTION: WndProc(HWND, unsigned, WORD, LONG)////PURPOSE:  Processes messages for the main window.////WM_COMMAND    - process the application menu//WM_PAINT    - Paint the main window//WM_DESTROY    - post a quit message and return////LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
intwmId, wmEvent;inti;

PAINTSTRUCT ps;

TCHAR szHello[MAX_LOADSTRING];
    LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);switch(message) 
    {
caseWM_COMMAND:
            wmId
=LOWORD(wParam); 
            wmEvent
=HIWORD(wParam);//Parse the menu selections:switch(wmId)
            {
caseIDM_ABOUT:
                   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;caseIDM_EXIT:
                   DestroyWindow(hWnd);
break;default:returnDefWindowProc(hWnd, message, wParam, lParam);
            }
break;caseWM_PAINT:
            hdcwindow
=BeginPaint(hWnd,&ps);switch(iGameState)
            {
caseGAME_STATE_MENU:
                SelectObject(hdcscreen,hback);
                bBack.ShowCenter(
0);
                bBegin.ShowCenter(
200);break;caseGAME_STATE_MAIN:
                bMap.ShowCenter(
0);
                bEarth.ShowLoop(
0,80,GAMEWIDTH,GAMEHEIGHT,gmap.GetMatchNow());for(i=0;i<gmap.iObjectNum;i++)
                {
if(gmap.objectarray[i].id<=0)
                    {
continue;
                    }
                    bObject.ShowNoBack(gmap.objectarray[i].x,
                                gmap.objectarray[i].y,
                                gmap.objectarray[i].id
-1);
                
                }
                gamecatch.DrawAngle(hdcscreen);
                gmap.ShowMoneyNow();
                bFire.ShowNoBackLoop(
389,46,0,gmap.iFireNum);
                bBombAni.ShowAni();
                myclock.Show();
break;caseGAME_STATE_END:
                gmap.GameEnd();
break;caseGAME_STATE_END_NEXT:
                gmap.GameNext();
                bEquip.ShowFramesNoBack(
80,150,2);    
                bEquip.ShowFrameLast();
if(bEquip.gridnow>=0&&bEquip.gridnow<=2)
                {
                    TextOut(hdcscreen,
80,220,equip[bEquip.gridnow].info,
                                strlen(equip[bEquip.gridnow].info));
                }
                btNext.Show(
350,50);break;
            }
               BitBlt(hdcwindow,
0,0,GAMEWIDTH,GAMEHEIGHT,hdcscreen,0,0,SRCCOPY);
            EndPaint(hWnd,
&ps);break;caseWM_MOUSEMOVE:switch(iGameState)
            {
caseGAME_STATE_MENU:
                bBegin.DetectMouseMove(LOWORD(lParam),HIWORD(lParam));
break;caseGAME_STATE_END_NEXT:
                btNext.DetectMouseMove(LOWORD(lParam),HIWORD(lParam));
                bEquip.DetectMouseOverGrid(LOWORD(lParam),HIWORD(lParam));
break;
            }
            InvalidateRect(hWnd,NULL,
false);break;caseWM_LBUTTONUP:switch(iGameState)
            {
caseGAME_STATE_MENU:if(bBegin.DetectMouseUp(LOWORD(lParam),HIWORD(lParam)))
                {
                    iGameState
=GAME_STATE_MAIN;//加载地图gmap.LoadFirstMap();
                    gamecatch.Init();
                    myclock.Begin(hWnd,
100,TIME_MATCH);//清除当前金钱数量gmap.ClearMoney();
                }
break;caseGAME_STATE_END_NEXT:if(btNext.DetectMouseUp(LOWORD(lParam),HIWORD(lParam)))
                {
                    iGameState
=GAME_STATE_MAIN;
                    gmap.LoadMap();
                    gamecatch.Init();
                    myclock.Begin(hWnd,
100,TIME_MATCH);                    
                }
if(bEquip.DetectMouseOverGrid(LOWORD(lParam),HIWORD(lParam)))
                {
                    bEquip.UseEquip();
//使用了道具gmap.UseEquip(equip[bEquip.gridnow].iPrice,bEquip.gridnow,gamecatch);
                }
break;
            }                    
            InvalidateRect(hWnd,NULL,
false);break;caseWM_KEYDOWN:switch(iGameState)
            {
caseGAME_STATE_MAIN:
                gamecatch.KeyProc(wParam);
                gmap.KeyProc(wParam);
                InvalidateRect(hWnd,NULL,
false);break;            
            }
break;caseWM_TIMER:switch(iGameState)
            {
caseGAME_STATE_MAIN:if(myclock.Dec())
                {
//时间到iGameState=GAME_STATE_END;
                    myclock.Begin(hWnd,
100,3);
                    InvalidateRect(hWnd,NULL,
false);break;
                }
                gamecatch.TurnAngle();
if(1==gamecatch.iState)
                {
//在叉子伸出的过程中检测是否抓到物品if(gmap.DetectCatch(gamecatch.xpos,gamecatch.ypos,gamecatch.iAngle))
                    {
//如果抓到物品gamecatch.SetState(2);//开始收回gmap.SetSpeedBack(gamecatch);                    
                    }
                }
//移动物品gmap.MoveObject(gamecatch.xpos,gamecatch.ypos,gamecatch.iAngle);
                InvalidateRect(hWnd,NULL,
false);break;caseGAME_STATE_END:if(myclock.Dec())
                {
//动画结束gmap.GameEndAniOver();//点击进入下一关if(gmap.CanNextMatch())
                    {
                        bEquip.ClearUseFlag();
                        iGameState
=GAME_STATE_END_NEXT;
                    }
else{
                        iGameState
=GAME_STATE_MENU;
                    }
                }
                InvalidateRect(hWnd,NULL,
false);break;
            }
break;caseWM_DESTROY:
            DeleteDC(hdcmem);
            DeleteDC(hdcscreen);
            PostQuitMessage(
0);break;default:returnDefWindowProc(hWnd, message, wParam, lParam);
   }
return0;
}
//Mesage handler for about box.LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
    {
caseWM_INITDIALOG:returnTRUE;caseWM_COMMAND:if(LOWORD(wParam)==IDOK||LOWORD(wParam)==IDCANCEL) 
            {
                EndDialog(hDlg, LOWORD(wParam));
returnTRUE;
            }
break;
    }
returnFALSE;
}

怎样做小游戏挖金子(VC,源码2)相关推荐

  1. 怎样做小游戏挖金子(VC,源码1)

    <挖金子>这个游戏,以前就玩过,网上见到是FLASH做的.FLASH做的游戏,很棒,足以让人对脚本语言刮目相看.最近我用vc做了一个,基本实现了功能.但代码写得粗糙,有几处很笨拙.我还是想 ...

  2. java做小游戏扫雷(附源码)

    下载解压即可玩:扫雷 项目代码下载:java代码 目录 图片 怎么自己也能做 代码细节 感受 全部代码 GameWin.java类 : MapBottom.java类: GameUtil.java类: ...

  3. 编程语言用 Java 开发一个打飞机小游戏(附完整源码)

    编程语言用 Java 开发一个打飞机小游戏(附完整源码) 上图 写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习.java确实不适合写桌面应用,这里只是通过 ...

  4. “限时分享“ 本地80个小游戏 HTML+CSS+JS源码分享

    开源项目集合 1. "限时分享" 本地80个小游戏 HTML+CSS+JS源码分享 2. "限时分享" 别错过了,最全的微信小程序源码收集分享 里面有80款小游 ...

  5. c++编写手机小游戏代码_经典小游戏大集合(C++ 源码)

    [实例简介] 五子棋 贪吃蛇 俄罗斯方块 黑白棋 连连看 推箱子 扫雷等7个小游戏 C++源码 VC6.0 下编译运行. [实例截图] [核心代码] 经典小游戏大集合(C源码) └── 经典小游戏大集 ...

  6. 打砖块小游戏php程序,javascript实现打砖块小游戏(附完整源码)

    小时候玩一天的打砖块小游戏,附完整源码 在?给个赞? 实现如图 需求分析 1.小球在触碰到大盒子上.左.右边框,以及滑块后沿另一方向反弹,在碰到底边框后游戏结束: 2.小球在触碰到方块之后,方块消失: ...

  7. 用Python做雷霆战机小游戏【附素材+源码】

    前言 嗨嗨,我是小圆 最近很多朋友都在问我要一些游戏的代码 所以这篇文章就出来了 [想一键获取素材和源码的,点击文章末尾名片] 模块准备 import pygame, os import time i ...

  8. 用Python做雷霆战机小游戏【赠素材+源码】

    前言 嗨嗨,我是小圆 最近很多朋友都在问我要一些游戏的代码 所以这篇文章就出来了 [想一键获取素材和源码的,点击文章末尾名片] 模块准备 import pygame, os import time i ...

  9. H5——连连看小游戏实现思路及源码

    部门要求推广新产品用连连看小游戏的方式, 设计那边UI还没有排期,先撸个功能demo,正好记录一下: 连连看都玩过,程序的关键在于判断连续点击的两张图片是否能够消除,两个图片消除的条件有两个: 图片相 ...

最新文章

  1. webpack源码分析之三:loader
  2. 描述Linux的虚拟化实现,Linux中实现虚拟化的四种常用方法
  3. 【学习笔记】Tableau安装与界面介绍
  4. CentOS下安装semanage
  5. mysql启动多端口
  6. 程序员后期,架构师发展路线!
  7. sqlalchemy mysql_使用SQLAlchemy操作MySQL
  8. 错误的模糊应用(类继承问题)
  9. hadoop程序MapReduce之DataSort
  10. 【渝粤教育】国家开放大学2018年秋季 0109-22T公司财务 参考试题
  11. Delphi XE7下如何创建一个Android模拟器调试?
  12. 最新友情链接交易平台源码,友链源码,友情链接,友链平台仿alivv爱链网源码下载
  13. 华为数通笔记-VRP
  14. amaze ui教程
  15. 递归算法php,PHP递归算法(二)
  16. React 优化:懒惰加载(lazy loading)
  17. 小运营征战大市场,手游运营也需”千人千面” ——DT时代手游精细化运营解析
  18. 火车头采集器php,火车头采集器3.0采集图文教程
  19. 【Flink】Flink SQL 读取 CSV 文件
  20. Jenkins使用时,报No valid crumb was included in the request的解决方法

热门文章

  1. 安科瑞预付费系统的实际设计与应用
  2. 用友营销云crm怎么样?
  3. 可能是知乎里最浅显易懂的激光测距技术讲解:什么是点激光,线激光,面激光。它们在扫地机器人上是如何应用的。
  4. ❤️熬夜7天肝出5万字【禅道/缺陷报告/测试报告/接口测试及用例/Fildder】超详细总结❤️
  5. 股票涨跌量化怎样进行策略分析?
  6. 定时清理某一类文件,使其保证一定的数量
  7. 支持python的量化交易平台
  8. 关于创业及相关的几条微博
  9. 合成孔径雷达图像去噪算法研究综述
  10. vue cli3源码解析