十字消除游戏是以前百度上火过一段时间的一个Flash小游戏。

游戏逻辑比较简单,是我初次接触EasyX图形库后使用EasyX写的第一个i程序。

游戏开始后,在棋盘中随机生成成对的随即颜色的方块,预留一些空白位置。玩家点击空白位置,如果所在位置延伸出的十字线上,能遇到相同颜色的方块,则消除之,累加分数。消除一对方块会恢复一定时间,不进行任何操作时间条会自动减少,直至耗尽游戏结束。如果棋盘上剩余方块少于一定数量,会继续随机生成一定数量的新方块。

效果图如下:

源代码如下:

/
// 程序名称:AyaCrossX(十字消除游戏)
// 编译环境:Visual C++ 6.0 / 2012,EasyX 2013霜降版
// 作    者:ls9512 <http://www.baidu.com/p/ls9512>
// 最后修改:2013-11-2
////系统函数库
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <math.h>
#include <time.h>
//EasyX图形库
#include <graphics.h>//以下是 宏定义参数 //
#define WIN_WIDTH       600                 //屏幕宽度
#define WIN_HEIGHT      430                 //屏幕高度
#define WIN_BLANKTOP    45                  //屏幕顶部空边
#define WIN_BLANK       25                  //屏幕边缘留空
#define G_BN            20                  //方块横向数量
#define G_BM            12                  //方块纵向数量
#define G_BW            20                  //方块宽度
#define G_BS            8                   //方块间隔宽度
#define G_BSELECT       3                   //方块选中大小
#define G_FLOATW        4                   //选中浮动大小
#define G_BDWO          1                   //消失初始大小
#define G_BDW           6                   //消失大小
#define G_CN            10                  //颜色数量
#define G_BUL           25                  //方块增量程度
#define C_BLOCKPANEL    RGB(255, 255, 221)  //底板颜色
#define C_HPBAR         RGB(255, 170, 255)  //HP条颜色//以下是数据结构定义//
//方块结构
struct Block{COLORREF color;                //颜色float    FLOAT;             //浮动大小float  DIS;               //消除延迟bool   isDIS;             //是否消失中bool  isClick;           //是否被点击
};//点结构
struct Point{int x;int y;
};//矩形结构
struct Rect{int x;int y;int w;int h;
};//以下是  全局变量  //
int GamePhase = 0;             //游戏阶段 0 准备 1 进行 2 结束 3 帮助界面
int isShowFPS = 0;             //是否显示帧数
int mouseX;                     //鼠标位置坐标X
int mouseY;                     //鼠标位置坐标Y
int time_max;                   //总游戏时间
int time_now;                   //当前剩余时间
int level;                      //等级
int score;                      //分数
bool isMouseDown;               //鼠标按下
Block block[G_BM][G_BN];        //方块数组
COLORREF Defcolor[G_CN];        //候选颜色数组//以下是  函数声明  //
float   GetFPS();                       //获取帧数
void    HpSleep(DWORD ms);              //绝对延时
Point   GetMouseLocal(int x, int y);    //获取鼠标所在坐标
void    AddBlock(int n);                //添加指定个数的未选中方块
void    Init();                         //初始化
void    DisCheck(int x, int y);         //检测指定位置的消除
int     CountBlock();                   //统计方块个数
void    Manager();                      //逻辑处理
void    Draw();                         //绘图处理
void    StartDraw();                    //游戏开始绘图
void    GamingDraw();                   //游戏进行中绘图
void    EndDraw();                      //游戏结束绘图
void    HelpDraw();                     //游戏帮助绘图
void    EndFrame();                     //帧结束处理
bool    IsInRect(int x, int y, Rect r); //是否在矩形内//以下是辅助功能函数//
//计算画面FPS(每秒帧数)
float GetFPS()
{
#define FPS_COUNT 8static int i = 0;static DWORD oldTime = GetTickCount();static float fps;if (i > FPS_COUNT){i = 0;int newTime = GetTickCount();int elapsedTime = newTime - oldTime;fps = FPS_COUNT / (elapsedTime / 1000.0f);oldTime = newTime;}i++;return fps;
}//绝对延时
void HpSleep(DWORD ms)
{static clock_t oldclock = clock();        // 静态变量,记录上一次 tickoldclock += ms * CLOCKS_PER_SEC / 1000;  // 更新 tickif (clock() > oldclock)                    // 如果已经超时,无需延时oldclock = clock();elsewhile(clock() < oldclock)           // 延时Sleep(1);                      // 释放 CPU 控制权,降低 CPU 占用率
}//获取鼠标选中点
Point GetMouseLocal(int x, int y)
{Point p;x = (x - WIN_BLANK) / (G_BW + G_BS);y = (y - WIN_BLANK - WIN_BLANKTOP) / (G_BW + G_BS);if (x < 0 || x >= G_BN) x = -1;if (y < 0 || y >= G_BM) y = -1;p.x = x;p.y = y;return p;
}//是否在矩形内
bool IsInRect(int x, int y, Rect r)
{return ((x >= r.x && x <= r.w) && (y >= r.y && y <= r.h));
}//添加制定个数的未选中方块
void AddBlock(int n)
{//随机生成方块int num = 0, x1, y1, x2, y2;int num_max = n;while(num < num_max){x1 = rand() % G_BN;y1 = rand() % G_BM;x2 = rand() % G_BN;y2 = rand() % G_BM;if(block[y1][x1].isClick && block[y2][x2].isClick){COLORREF color = Defcolor[rand() % G_CN];block[y1][x1].color = color;block[y1][x1].isClick = false;block[y1][x1].FLOAT = 0;block[y1][x1].DIS = 0;block[y1][x1].isDIS = false;block[y2][x2].color = color;block[y2][x2].isClick = false;block[y2][x2].FLOAT = 0;block[y2][x2].DIS = 0;block[y2][x2].isDIS = false;num += 2;}}
}//初始化
void Init()
{//预置颜色Defcolor[0] = RGB(255, 153, 0);Defcolor[1] = RGB(204, 102, 0);Defcolor[2] = RGB(27,  118, 255);Defcolor[3] = RGB(255, 136, 255);Defcolor[4] = RGB(204, 204, 102);Defcolor[5] = RGB(104, 204, 204);Defcolor[6] = RGB(255, 125, 125);Defcolor[7] = RGB(204, 104, 204);Defcolor[8] = RGB(190, 190, 190);Defcolor[9] = RGB(0,   204, 0);//初始化时间time_max = 10000;time_now = 10000;//初始化分数score = 0;//置全选中for(int i = 0; i < G_BM; i++){for(int j = 0; j < G_BN; j++){block[i][j].isClick = true;block[i][j].FLOAT = 0;block[i][j].DIS = 0;}}//添加方块AddBlock(G_BN * G_BM * 2 / 3);//清除鼠标消息队列FlushMouseMsgBuffer();
}//统计方块个数
int CountBlock()
{int n = 0;for(int i = 0; i < G_BN; i++){for(int j = 0; j < G_BM; j++){if(!block[j][i].isClick) n++;}}return n;
}//检测指定位置消除
void DisCheck(int x, int y)
{//记录待消除的方块Block* b[4];int i, j, n = 0;//向左for(i = x; i >= 0; i--){if(!block[y][i].isClick){b[n] = &block[y][i];n++;break;}}//向右for(i = x; i < G_BN; i++){if(!block[y][i].isClick){b[n] = &block[y][i];n++;break;}}//向上for(j = y; j >= 0; j--){if(!block[j][x].isClick){b[n] = &block[j][x];n++;break;}}//向下for(j = y; j < G_BM; j++){if(!block[j][x].isClick){b[n] = &block[j][x];n++;break;}}//消除for(i = 0; i < n; i++){for(j = i + 1; j < n; j++){if(b[i]->color == b[j]->color){if(!b[i]->isDIS){b[i]->DIS = G_BDWO;b[i]->isDIS = true;}if(!b[j]->isDIS){b[j]->DIS = G_BDWO;b[j]->isDIS = true;}}}}isMouseDown = false;
}//逻辑处理
void Manager()
{//如果在游戏中if(GamePhase == 1){Point p = GetMouseLocal(mouseX, mouseY);int x = p.x, y = p.y;//如果选中if(p.x != -1 && p.y != -1){//如果单击if(isMouseDown && block[y][x].isClick){//触发消除检测DisCheck(x, y);}}//添加新方块添加随机个数新方块if(CountBlock() < G_BN * G_BM / 3){AddBlock((rand() % 15 + 15) * 2);//时间恢复time_now += 500;if(time_now > time_max) time_now = time_max;}}
}//开始绘图
void StartDraw()
{settextstyle(52, 30, _T("Impact"));//标题settextcolor(RGB(255, 17, 102));outtextxy(143, 93, _T("AyaCrossX"));settextcolor(RGB(255, 153, 238));outtextxy(140, 90, _T("AyaCrossX"));//版本settextstyle(22, 10, _T("Verdana"));settextcolor(RGB(255, 51, 68));outtextxy(340, 153, _T("v0.91 By:ls9512"));//开始游戏按钮Rect r;r.x = 240;r.y = 220;r.w = r.x + 125;r.h = r.y + 35;setlinecolor(RGB(255, 17, 102));if(IsInRect(mouseX, mouseY, r)) {setfillcolor(RGB(255, 187, 119));//开始游戏按键响应if(isMouseDown){Init();GamePhase = 1;isMouseDown = false;}}elsesetfillcolor(RGB(255, 255, 204));fillrectangle(r.x, r.y, r.w, r.h);settextstyle(25, 10, _T("Verdana"));settextcolor(RGB(255, 51, 68));outtextxy(r.x + 5, r.y + 5, _T("PLAY GAME"));//帮助游戏按钮r.x = 240;r.y = 270;r.w = r.x + 125;r.h = r.y + 35;setlinecolor(RGB(255, 17, 102));if(IsInRect(mouseX, mouseY, r)){setfillcolor(RGB(255, 187, 119));//帮助按键响应if(isMouseDown) GamePhase = 3;}elsesetfillcolor(RGB(255, 255, 204));fillrectangle(r.x, r.y, r.w, r.h);settextstyle(25, 10, _T("Verdana"));settextcolor(RGB(255, 51, 68));outtextxy(r.x + 5, r.y + 5, _T("HELP INFO"));//退出游戏按钮r.x = 240;r.y = 320;r.w = r.x + 125;r.h = r.y + 35;setlinecolor(RGB(255, 17, 102));if(IsInRect(mouseX, mouseY, r)){setfillcolor(RGB(255, 187, 119));//退出按键响应if(isMouseDown) exit(0);}elsesetfillcolor(RGB(255, 255, 204));fillrectangle(r.x, r.y, r.w, r.h);settextstyle(25, 10, _T("Verdana"));settextcolor(RGB(255, 51, 68));outtextxy(r.x + 5, r.y + 5, _T("EXIT GAME"));//说明settextstyle(16, 5, _T("Verdana"));settextcolor(RGB(255, 51, 68));outtextxy(175, 400, _T("Programing By VC++ & EasyX     Date:2013.11.01"));
}//游戏中绘图
void GameingDraw()
{int x, y;COLORREF c, c2;//时间条x = WIN_BLANK;y = WIN_BLANK;int HPBARW = (G_BW + G_BS) * G_BN - 200;setlinecolor(RGB(255, 17, 255));setfillcolor(WHITE);fillrectangle(x, y, x + HPBARW, y + 10);setfillcolor(C_HPBAR);fillrectangle(x, y, x + (int)(HPBARW * (1.0 * time_now / time_max)), y + 10);//底板setlinecolor(RGB(255, 25, 22));setfillcolor(C_BLOCKPANEL);x = WIN_BLANK - G_BS;y = WIN_BLANK + WIN_BLANKTOP - G_BS;fillrectangle(x, y, x + (G_BW + G_BS) * G_BN + G_BS, y + (G_BW + G_BS) * G_BM + G_BS);//画方块for(int i = 0; i < G_BM; i++){for(int j = 0; j < G_BN; j++){if(!block[i][j].isClick){c = block[i][j].color;c = RGB(GetRValue(c) - (BYTE)G_BUL, GetGValue(c) - (BYTE)G_BUL, GetBValue(c) - (BYTE)G_BUL);int fw = (int)block[i][j].FLOAT;int fd = (int)block[i][j].DIS;setlinecolor(c);setfillcolor(block[i][j].color);x = j * (G_BW + G_BS) + WIN_BLANK - fw - fd;y = i * (G_BW + G_BS) + WIN_BLANK + WIN_BLANKTOP - fw - fd;fillrectangle(x, y, x + G_BW + 2 * (fw + fd), y + G_BW + 2 * (fw + fd));//浮动缩减if(block[i][j].FLOAT > 0) block[i][j].FLOAT -= 0.4f;//消失延迟if(block[i][j].isDIS){if(block[i][j].DIS < G_BDW)block[i][j].DIS += 0.4f;else{//消除block[i][j].isClick = true;//加分score += 100;time_now += 25;if (time_now > time_max) time_now = time_max;}}}}}//获取鼠标位置Point p = GetMouseLocal(mouseX, mouseY);//画出鼠标光标if(p.x != -1 && p.y != -1){c = RED;   x = p.x, y = p.y;int fw;if(block[y][x].isClick) fw = 0;else fw = (int)block[y][x].FLOAT;x = x * (G_BW + G_BS) + WIN_BLANK - G_BSELECT - fw;y = y * (G_BW + G_BS) + WIN_BLANK + WIN_BLANKTOP - G_BSELECT -fw;//选中方块加亮if(!block[p.y][p.x].isClick){//置浮动大小block[p.y][p.x].FLOAT = G_FLOATW;c2 = block[p.y][p.x].color;}else{c2 = C_BLOCKPANEL;}setlinecolor(c);setfillcolor(c2);fillrectangle(x, y, x + G_BW + 2 * (G_BSELECT + fw), y + G_BW + 2 * (G_BSELECT + fw));}//画出分数settextstyle(25, 10, _T("Verdana"));settextcolor(RGB(155, 51, 68));TCHAR b[10];#if _MSC_VER > 1200_stprintf_s(b, _T("%d"), score);#else_stprintf(b, _T("%d"), score);#endifouttextxy(390, 15, _T("分数:"));settextcolor(RGB(255, 51, 68));outtextxy(440, 16, b);
}//游戏结束绘图
void EndDraw()
{//标题settextstyle(52, 30, _T("Impact"));settextcolor(RGB(255, 17, 102));outtextxy(143, 103, _T("GAME OVER"));settextcolor(RGB(215, 193, 238));outtextxy(140, 100, _T("GAME OVER"));//版本settextstyle(34, 12, _T("Verdana"));settextcolor(RGB(255, 51, 68));TCHAR b[10];#if _MSC_VER > 1200_stprintf_s(b, _T("%d"), score);#else_stprintf(b, _T("%d"), score);#endifouttextxy(232, 173, _T("分数:"));outtextxy(290, 173, b);//重新开始游戏按钮Rect r;r.x = 240;r.y = 240;r.w = r.x + 125;r.h = r.y + 35;setlinecolor(RGB(255, 17, 102));if(IsInRect(mouseX, mouseY, r)){setfillcolor(RGB(255, 187, 119));//开始游戏按键响应if(isMouseDown){Init();GamePhase = 1;}}elsesetfillcolor(RGB(255, 255, 204));fillrectangle(r.x, r.y, r.w, r.h);settextstyle(25, 10, _T("Verdana"));settextcolor(RGB(255, 51, 68));outtextxy(r.x + 5, r.y + 5, _T("   REPLAY"));//退出r.x = 240;r.y = 290;r.w = r.x + 125;r.h = r.y + 35;setlinecolor(RGB(255, 17, 102));if(IsInRect(mouseX, mouseY, r)) {setfillcolor(RGB(255, 187, 119));//退出按键响应if(isMouseDown) exit(0);}elsesetfillcolor(RGB(255, 255, 204));fillrectangle(r.x, r.y, r.w, r.h);settextstyle(25, 10, _T("Verdana"));settextcolor(RGB(255, 51, 68));outtextxy(r.x + 5, r.y + 5, _T("EXIT GAME"));
}//游戏帮助绘图
void HelpDraw()
{//标题settextstyle(52, 30, _T("Impact"));settextcolor(RGB(255, 17, 152));outtextxy(233, 33, _T("HELP"));settextcolor(RGB(215, 193, 238));outtextxy(230, 30, _T("HELP"));//底板setlinecolor(RGB(255, 17, 204));setfillcolor(RGB(255, 221, 255));fillrectangle(60, 100, 550, 280);//版本settextstyle(18, 10, _T("黑体"));settextcolor(RGB(245, 126, 92));outtextxy(70, 110, _T("十字消除是一款经典消除类小游戏。"));outtextxy(70, 145, _T("【玩法】"));outtextxy(80, 170, _T("1.点击空白处,所在横纵十字线上同色方块会被消除。"));outtextxy(80, 195, _T("2.消除方块会累加得分,并恢复一定量的时间."));outtextxy(80, 220, _T("3.方块数量少于某数值会出现新方块并回复时间."));outtextxy(80, 245, _T("4.时间耗尽时则游戏结束."));//返回Rect r;r.x = 240;r.y = 360;r.w = r.x + 125;r.h = r.y + 35;setlinecolor(RGB(255, 17, 102));if(IsInRect(mouseX, mouseY, r)) {setfillcolor(RGB(255, 187, 119));//返回按键响应if(isMouseDown) GamePhase = 0;}elsesetfillcolor(RGB(255, 255, 204));fillrectangle(r.x, r.y, r.w, r.h);settextstyle(25, 9, _T("Verdana"));settextcolor(RGB(255, 51, 68));outtextxy(r.x + 5, r.y + 5, _T("BACK MENU"));
}//输出帧数
void DrawFPS()
{//输出帧数if(isShowFPS){settextcolor(RED);settextstyle(14, 0, _T("宋体"));TCHAR s[5];#if _MSC_VER > 1200_stprintf_s(s, _T("%.1f"), GetFPS());#else_stprintf(s, _T("%.1f"), GetFPS());#endifouttextxy(0, 0, s);}
}//绘图
void Draw()
{//清屏setlinecolor(WHITE);setfillcolor(WHITE);fillrectangle(0, 0, WIN_WIDTH, WIN_HEIGHT);switch(GamePhase){case 0:   StartDraw();    break;case 1:   GameingDraw();  break;case 2:   EndDraw();      break;case 3:   HelpDraw();     break;}DrawFPS();
}//帧结束处理
void EndFrame()
{time_now -= 2;//游戏结束if(time_now <= 0 && GamePhase == 1){GamePhase = 2; }
}//主入口函数
int main()
{//置随机数种子srand((unsigned)time(NULL));//初始化设备,加载图片initgraph(WIN_WIDTH, WIN_HEIGHT);//设置窗口标题SetWindowText(GetHWnd(), _T("AyaCrossX v0.91 By:ls9512"));cleardevice();//设置黑色背景setbkmode(TRANSPARENT);settextcolor(BLACK);//开启双缓冲,防止闪屏BeginBatchDraw();// 鼠标消息变量MOUSEMSG mmsg;//初始化Init();while(true){//处理鼠标消息while(MouseHit()){mmsg = GetMouseMsg();switch(mmsg.uMsg){case WM_MOUSEMOVE:      mouseX = mmsg.x; mouseY = mmsg.y; break;case WM_LBUTTONDOWN:  isMouseDown = true;                    break;case WM_LBUTTONUP:        isMouseDown = false;               break;}}//逻辑处理Manager();//绘图处理Draw();//显示缓存的绘制内容FlushBatchDraw();//帧结束处理EndFrame();//延迟,帧数控制HpSleep(18);}// 关闭EndBatchDraw();closegraph();return 0;
}

这个程序是我在13年10月时写的,有些细节也记不太清楚了,在这就不赘述了,如果有疑问的地方可以留言我看到了会回复解答。

【注】

此程序已被EasyX官网收录为范例:

新地址:http://www.codebus.cn/contributor/post/ayacrossx

旧地址:http://www.easyx.cn/samples/View.aspx?id=147

【C / EasyX】十字消除游戏的实现方法相关推荐

  1. C语言十字消除游戏(超简单详细),详细思路+源码分享

    十字消除,休闲小游戏,在规定时间内,只要是十字线能连接到的相同颜色的方块,就能获得相应的得分,如果点击后没有能够消除的方块会扣除时间,是一款益智小游戏. 我们将编写十字消除游戏,用户点击空白方块,沿其 ...

  2. [LeetCode]390.消除游戏

    [LeetCode]390.消除游戏 题目 示例 方法 模拟 题目 列表 arr 由在范围 [1, n] 中的所有整数组成,并按严格递增排序.请你对 arr 应用下述算法: 从左到右,删除第一个数字, ...

  3. H5 六边形消除游戏开发

    试玩地址,目前只适配pc端.源码 六边形游戏的鼻祖应该是这个 hex-frvr,原作者开发用的是 pixi 游戏引擎,本着快速开发的理念,本游戏采用 cocos creator,UI 延用 hex-f ...

  4. I00033 消除游戏

    消除游戏是众多游戏中的一种,貌似十分流行.其内部实现也许是程序员们所感兴趣的. 问题描述:可以输入多组测试用例,每组测试用例首先输入正整数m和n,分别为矩阵的行和列数,m,n≤1000,然后输入m行n ...

  5. 第4-8课:方块消除游戏

    前面基础部分我们介绍过简单的串模型的动态规划,在这个系列中,我们又介绍了区间动态规划模型.状态压缩动态规划模型和线性动态规划模型.我们用的算法实现都是尽量使用状态递推关系式直接用递推的方法,大家可能都 ...

  6. H5 六边形消除游戏开发 1

    六边形游戏的鼻祖应该是这个 hex-frvr,原作者开发用的是 pixi 游戏引擎,本着快速开发的理念,本游戏采用 cocos creator,UI 延用 hex-frvr.学习过程中,有借鉴各路实现 ...

  7. 卡片消除游戏 java版(代码+讲解)

    最开始一出的时候就准备写了,被别的事情耽误了.花了两天时间,把某个游戏的基本的功能都写出来了,还是挺简单的.简单来说就是个卡片消除游戏,代码方面挺简单,比代码难的是地图的制作(卡片的放置).完整代码在 ...

  8. 基于Unity3D技术的纸牌消除游戏

    基于Unity3D技术的纸牌消除游戏 1 项目的创建和资源的导入 在Project下创建好需要的四个文件夹,其中Resources文件夹是用来存放A-K和大小王正面纸牌资源,Textture文件夹用来 ...

  9. LeetCode刷题——消除游戏#390#Medium

    消除游戏的思路探讨与源码     消除游戏的题目如下图,该题属于递归类和数学类型的题目,主要考察对于数学方法的使用和递归方法的理解.本文的题目作者想到2种方法,分别是递归方法和数学模拟方法,其中递归方 ...

  10. cocos2dx CrystalCraze 宝石消除游戏 解析(二)

    上一篇:cocos2dx CrystalCraze 宝石消除游戏 解析(一) 上一篇介绍了 mainScene界面,下面进入正题,GameScne界面!会比较长,毕竟1000行代码啊,耐心看下吧 2 ...

最新文章

  1. 在CentOS 6.9上从源码安装Go 1.10
  2. 观看自由!B站上线斯坦福最新「机器学习系统(MLSys)」全集
  3. HTML 常用标签全称
  4. happens-before规则和指令重排
  5. python foreach用法_C# 中 foreach 遍历的用法
  6. GDCM:gdcm::Testing的测试程序
  7. 《跟菜鸟学Cisco UC部署实战》-第 0 章 宣传-课件(一共12章,免费)
  8. 数据结构 - 红黑树
  9. Win10 Build 11099和11102的更动超过1200项
  10. jsb调用java_在JS代码中使用反射调用java代码注意事项(附webview使用方法)(转)...
  11. mysql为什么添加索引_当我添加新索引时,为什么MySQL中索引的基数保持不变?
  12. 装mysql最后一步没响应_解决MySQL安装到最后一步未响应的三种方法
  13. linux fpga 开发板,香蕉派BPI-F2S ,四核Linux工业级应用的开源硬件开发板,FPGA教学套装...
  14. Java锁的种类以及辨析
  15. 23个Python爬虫开源项目代码
  16. codeforce #165 div2
  17. 最好用的三款epub阅读器
  18. mysql 驱动下载
  19. 打印机与计算机无法进行通讯,打印时电脑提示:“打印机不能与计算机进行通讯”是为什么啊?是电脑出现问题还是打印机出现问题了?...
  20. 2020 年 AIoT 产业概述

热门文章

  1. Ubuntu16.04安装Hadoop2.7.3教程
  2. t3系统建账请到服务器端修改,用友T3标准版常见问题及处理方法(一)
  3. Android 控件的各种方法介绍
  4. Arduino手自两用蓝牙避障小车
  5. 附合导线近似平差计算
  6. 梅科尔工作室-李庆浩-网页前端7
  7. 基于Java+SpringMVC+vue+element实现前后端分离校园失物招领系统详细设计
  8. VirtualBox安装Windows和CentOS虚拟机
  9. 微型计算机原理与接口技术 考题,微机原理与接口技术试题答案
  10. php采集cms有哪些,phpcms v9自带采集模块功能体验