【酒吧游戏源码】【模拟时钟源码网站】【vxworks源码开放吗】小游戏项目源码设计与实现

2024-11-17 23:50:55 来源:1688源码装修店铺 分类:休闲

1.cocos creator 小游戏源码
2.用C++编写的小游戏项现小游戏源代码
3.前端实战:从零到一实现H5拼图小游戏(附源码)
4.H5小游戏源码-微信/抖音游戏小程序源码+搭建
5.Python游戏开发,pygame模块,目源码设Python实现五子棋联机对战小游戏
6.C语言C++图形库---贪吃蛇大作战附源码

小游戏项目源码设计与实现

cocos creator 小游戏源码

       Cocos Creator小游戏的计实源码是不可直接提供的,因为源码的小游戏项现具体内容取决于开发者的实现和游戏的具体需求。

       Cocos Creator是目源码设一款游戏开发工具,它允许开发者通过直观的计实酒吧游戏源码编辑器和丰富的组件系统来创建游戏。源码,小游戏项现即源代码,目源码设是计实游戏程序的基础,包含了实现游戏功能和逻辑的小游戏项现具体指令。由于每个游戏的目源码设项目需求和设计思路都不同,因此Cocos Creator小游戏的计实源码也会因游戏而异。

       在Cocos Creator中创建小游戏,小游戏项现开发者通常会先设计游戏场景、目源码设角色和交互逻辑。计实然后,利用Cocos Creator提供的脚本编辑功能,用JavaScript或TypeScript编写游戏逻辑。这些脚本文件就是游戏源码的一部分。例如,一个简单的点击游戏可能包含一个检测鼠标点击事件并更新分数的脚本。

       为了更具体地说明,假设我们正在开发一个射击小游戏。在Cocos Creator中,我们会创建不同的场景来表示游戏的各个部分,如开始界面、游戏主界面和结束界面。对于每个场景,我们会添加相应的节点并为其编写脚本。这些脚本控制角色的移动、射击逻辑、碰撞检测以及分数计算等。所有这些脚本文件共同构成了游戏的源代码。

       总的来说,Cocos Creator小游戏的源码是高度定制化的,它反映了开发者的创意和游戏设计的具体要求。由于源码的复杂性和多样性,无法直接提供一个通用的源码示例。然而,通过学习和实践Cocos Creator的官方教程和社区资源,开发者可以逐步掌握如何编写和优化自己的游戏源码。

用C++编写的小游戏源代码

       五子棋的代码:

       #include<iostream>

       #include<stdio.h>

       #include<stdlib.h>

       #include <time.h>

       using namespace std;

       const int N=;                 //*的棋盘

       const char ChessBoardflag = ' ';          //棋盘标志

       const char flag1='o';              //玩家1或电脑的棋子标志

       const char flag2='X';              //玩家2的棋子标志

       typedef struct Coordinate          //坐标类

       {    

       int x;                         //代表行

       int y;                         //代表列

       }Coordinate;

       class GoBang                    //五子棋类

       {  

       public:

       GoBang()                //初始化

       {

       InitChessBoard();

       }

       void Play()               //下棋

       {

       Coordinate Pos1;      // 玩家1或电脑

       Coordinate Pos2;      //玩家2

       int n = 0;

       while (1)

       {

       int mode = ChoiceMode();

       while (1)

       {

       if (mode == 1)       //电脑vs玩家

       {

       ComputerChess(Pos1,flag1);     // 电脑下棋

       if (GetVictory(Pos1, 0, flag1) == 1)     //0表示电脑,真表示获胜

       break;

       PlayChess(Pos2, 2, flag2);     //玩家2下棋

       if (GetVictory(Pos2, 2, flag2))     //2表示玩家2

       break;

       }

       else            //玩家1vs玩家2

       {

       PlayChess(Pos1, 1, flag1);     // 玩家1下棋

       if (GetVictory(Pos1, 1, flag1))      //1表示玩家1

       break;

       PlayChess(Pos2, 2, flag2);     //玩家2下棋

       if (GetVictory(Pos2, 2, flag2))  //2表示玩家2

       break;

       }

       }

       cout << "***再来一局***" << endl;

       cout << "y or n :";

       char c = 'y';

       cin >> c;

       if (c == 'n')

       break;

       }       

       }

       protected:

       int ChoiceMode()           //选择模式

       {

       int i = 0;

       system("cls");        //系统调用,清屏

       InitChessBoard();       //重新初始化棋盘

       cout << "***0、退出  1、模拟时钟源码网站电脑vs玩家  2、玩家vs玩家***" << endl;

       while (1)

       {

       cout << "请选择:";

       cin >> i;

       if (i == 0)         //选择0退出

       exit(1);

       if (i == 1 || i == 2)

       return i;

       cout << "输入不合法" << endl;

       }

       }

       void InitChessBoard()      //初始化棋盘

       {

       for (int i = 0; i < N + 1; ++i)      

       {

       for (int j = 0; j < N + 1; ++j)

       {

       _ChessBoard[i][j] = ChessBoardflag;

       }

       }

       }

       void PrintChessBoard()    //打印棋盘,这个函数可以自己调整

       {

       system("cls");                //系统调用,清空屏幕

       for (int i = 0; i < N+1; ++i)

       {

       for (int j = 0; j < N+1; ++j)

       {

       if (i == 0)                               //打印列数字

       {

       if (j!=0)

       printf("%d  ", j);

       else

       printf("   ");

       }

       else if (j == 0)                //打印行数字

       printf("%2d ", i);

       else

       {

       if (i < N+1)

       {

       printf("%c |",_ChessBoard[i][j]);

       }

       }

       }

       cout << endl;

       cout << "   ";

       for (int m = 0; m < N; m++)

       {

       printf("--|");

       }

       cout << endl;

       }

       }

       void PlayChess(Coordinate& pos, int player, int flag)       //玩家下棋

       {

       PrintChessBoard();         //打印棋盘

       while (1)

       {

       printf("玩家%d输入坐标:", player);

       cin >> pos.x >> pos.y;

       if (JudgeValue(pos) == 1)          //坐标合法

       break;

       cout << "坐标不合法,重新输入" << endl;

       }

       _ChessBoard[pos.x][pos.y] = flag;

       }

       void ComputerChess(Coordinate& pos, char flag)       //电脑下棋

       {

       PrintChessBoard();         //打印棋盘

       int x = 0;

       int y = 0;

       while (1)

       {

       x = (rand() % N) + 1;      //产生1~N的随机数

       srand((unsigned int) time(NULL));

       y = (rand() % N) + 1;     //产生1~N的随机数

       srand((unsigned int) time(NULL));

       if (_ChessBoard[x][y] == ChessBoardflag)      //如果这个位置是空的,也就是没有棋子

       break;

       }

       pos.x = x;

       pos.y = y;

       _ChessBoard[pos.x][pos.y] = flag;

       }

       int JudgeValue(const Coordinate& pos)       //判断输入坐标是不是合法

       {

       if (pos.x > 0 && pos.x <= N&&pos.y > 0 && pos.y <= N)

       {

       if (_ChessBoard[pos.x][pos.y] == ChessBoardflag)

       {

       return 1;    //合法

       }

       }

       return 0;        //非法

       }

       int JudgeVictory(Coordinate pos, char flag)           //判断有没有人胜负(底层判断)

       {

       int begin = 0;

       int end = 0;

       int begin1 = 0;

       int end1 = 0;

       //判断行是否满足条件

       (pos.y - 4) > 0 ? begin = (pos.y - 4) : begin = 1;

       (pos.y + 4) >N ? end = N : end = (pos.y + 4);

       for (int i = pos.x, j = begin; j + 4 <= end; j++)

       {

       if (_ChessBoard[i][j] == flag&&_ChessBoard[i][j + 1] == flag&&

       _ChessBoard[i][j + 2] == flag&&_ChessBoard[i][j + 3] == flag&&

       _ChessBoard[i][j + 4] == flag)

       return 1;

       }

       //判断列是否满足条件

       (pos.x - 4) > 0 ? begin = (pos.x - 4) : begin = 1;

       (pos.x + 4) > N ? end = N : end = (pos.x + 4);

       for (int j = pos.y, i = begin; i + 4 <= end; i++)

       {

       if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j] == flag&&

       _ChessBoard[i + 2][j] == flag&&_ChessBoard[i + 3][j] == flag&&

       _ChessBoard[i + 4][j] == flag)

       return 1;

       }

       int len = 0;

       //判断主对角线是否满足条件

       pos.x > pos.y ? len = pos.y - 1 : len = pos.x - 1;

       if (len > 4)

       len = 4;

       begin = pos.x - len;       //横坐标的起始位置

       begin1 = pos.y - len;      //纵坐标的起始位置

       pos.x > pos.y ? len = (N - pos.x) : len = (N - pos.y);

       if (len>4)

       len = 4;

       end = pos.x + len;       //横坐标的结束位置

       end1 = pos.y + len;      //纵坐标的结束位置

       for (int i = begin, j = begin1; (i + 4 <= end) && (j + 4 <= end1); ++i, ++j)

       {

       if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j + 1] == flag&&

       _ChessBoard[i + 2][j + 2] == flag&&_ChessBoard[i + 3][j + 3] == flag&&

       _ChessBoard[i + 4][j + 4] == flag)

       return 1;

       }

       //判断副对角线是否满足条件

       (pos.x - 1) >(N - pos.y) ? len = (N - pos.y) : len = pos.x - 1;

       if (len > 4)

       len = 4;

       begin = pos.x - len;       //横坐标的起始位置

       begin1 = pos.y + len;      //纵坐标的起始位置

       (N - pos.x) > (pos.y - 1) ? len = (pos.y - 1) : len = (N - pos.x);

       if (len>4)

       len = 4;

       end = pos.x + len;       //横坐标的结束位置

       end1 = pos.y - len;      //纵坐标的结束位置

       for (int i = begin, j = begin1; (i + 4 <= end) && (j - 4 >= end1); ++i, --j)

       {

       if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j - 1] == flag&&

       _ChessBoard[i + 2][j - 2] == flag&&_ChessBoard[i + 3][j - 3] == flag&&

       _ChessBoard[i + 4][j - 4] == flag)

       return 1;

       }

       for (int i = 1; i < N + 1; ++i)           //棋盘有没有下满

       {

       for (int j =1; j < N + 1; ++j)

       {

       if (_ChessBoard[i][j] == ChessBoardflag)

       return 0;                      //0表示棋盘没满

       } 

       }

       return -1;      //和棋

       }

       bool GetVictory(Coordinate& pos, int player, int flag)   //对JudgeVictory的一层封装,得到具体那个玩家获胜

       {

       int n = JudgeVictory(pos, flag);   //判断有没有人获胜

       if (n != 0)                    //有人获胜,0表示没有人获胜

       {

       PrintChessBoard();

       if (n == 1)                //有玩家赢棋

       {

       if (player == 0)     //0表示电脑获胜,1表示玩家1,2表示玩家2

       printf("***电脑获胜***\n");

       else

       printf("***恭喜玩家%d获胜***\n", player);

       }

       else

       printf("***双方和棋***\n");

       return true;      //已经有人获胜

       }

       return false;   //没有人获胜

       }

       private:

       char _ChessBoard[N+1][N+1];      

       };

扩展资料:

       设计思路

       1、进行问题分析与设计,计划实现的功能为,开局选择人机或双人对战,确定之后比赛开始。

       2、比赛结束后初始化棋盘,询问是否继续比赛或退出,后续可加入复盘、悔棋等功能。

       3、整个过程中,涉及到了棋子和棋盘两种对象,同时要加上人机对弈时的AI对象,即涉及到三个对象。

前端实战:从零到一实现H5拼图小游戏(附源码)

       去年,我开发了一个基于H5、JavaScript和CSS3的拼图小游戏。这款游戏利用了我自己封装的类Jquery框架Xuery,融合了许多经典的JavaScript算法和CSS3特性,对提升大家的编程能力大有裨益。文章末尾将提供源码获取方式,供大家学习体验。

       由于这款应用属于H5游戏,为了使项目更轻量,我没有使用第三方UI库。如果大家想使用基于Vue的第三方移动端UI库,我可以推荐几个我之前使用过的靠谱组件库:[此处省略推荐内容]。以上推荐的都是社区完善、bug较少的组件库,大家可以试试看。

       回到我们的小游戏开发,主要考验大家对JavaScript和CSS3的掌握程度。学习完这篇文章后,相信大家对JavaScript和CSS3的vxworks源码开放吗编程能力都会有极大的提升。之后,我还会介绍如何使用canvas实现生成战绩海报图的功能。

       我们先来看看游戏的预览界面:

       本文的算法实现方式在之前的拼拼乐文章中已有说明,这里主要介绍核心算法,至于vue-cli的使用方法,我之前也写过对应的文章,大家可以研究学习一下。vue-cli搭建项目方式如下:[此处省略搭建方法]。

       关于vue-cli3配置实战,可以参考《一张图教你快速玩转vue-cli3》。

       目前,我主要整理了以下核心功能,接下来我会一一为大家实现:实现纯JavaScript上传预览、实现拼图分割功能、实现洗牌算法、实现生成战绩海报功能。

       1. 实现纯JavaScript上传预览:文件上传预览主要采用FileReader API实现,原理是将file对象传给FileReader的readAsDataURL,然后转化为data:URL格式的字符串(base编码)以表示所读取文件的内容。具体代码如下:[此处省略代码]。

       2. 实现拼图分割功能:一般处理拼图游戏时,我们会采用以下方案:使用canvas分割、采用n张不同的切好的切片(方法简单,但会造成多次请求)、动态背景分割。经过权衡,我选择了一种自认为比较优雅的方法——动态背景分割,只需使用1张,然后利用CSS切割,有点像经典的雪碧图。具体实现如下:[此处省略实现方法]。

       3. 实现洗牌算法:洗牌逻辑依托于随机算法,结合坐标系,实现一个随机生成二维坐标系的逻辑,然后通过改变每个切片的translate位置,配合过渡动画,即可实现洗牌功能和洗牌动画。具体实现如下:[此处省略实现方法]。

       4. 实现生成战绩海报功能:生成战绩海报我采用canvas来实现,对于canvas的api不熟悉的可以查看MDN,讲得比较详细。这里我简单实现一个供大家参考:[此处省略实现方法]。

       H5拼图小游戏我已在github开源,挂机源码专业网页感兴趣的朋友可以在我github上学习参考。以上逻辑部分的代码可以直接整合到vue项目中,由于实现比较简单,这里我就不详细介绍了。

       如果想学习更多H5游戏、webpack、node、gulp、css3、javascript、nodeJS、canvas数据可视化等前端知识和实战,欢迎在《趣谈前端》一起学习讨论,共同探索前端的边界。

H5小游戏源码-微信/抖音游戏小程序源码+搭建

       H5小游戏源码,如微信和抖音游戏小程序,提供了现成的代码框架,让开发者可以快速开发和定制各种类型的游戏,如休闲、益智和竞技等。这些源码包含核心逻辑、界面设计和资源文件,有助于节省时间和成本。通过它们,开发者可以学习编程语言,掌握逻辑、算法和解决问题的技能,同时体验游戏开发的乐趣。

       以下是部分游戏源码和搭建步骤:

       首先,确保已安装微信小程序开发工具,然后新建一个小程序项目。

       将游戏源码文件(如init.php)复制到项目目录中,替换原有的文件。

       在开发工具中,导入并编辑app.json、app.js等关键文件。

       构建并预览游戏,检查是否正常运行。

       游戏列表包括记忆卡、打字速度测试、绞刑吏游戏等,都是使用HTML、CSS和vanilla JavaScript构建的成品网站免费源码,易于学习。

       每个游戏项目都提供了详细的教程,如记忆卡游戏通过练习事件侦听器和数组概念,而打字速度测试则涉及DOM操作和事件处理。无论是初学者还是有经验的开发者,这些小程序源码都是提升技能的好途径。

       动手创建这些游戏,不仅能提升编程能力,还能让你在实际操作中掌握HTML、CSS和JavaScript的运用。所以,无需犹豫,立即开始你的游戏开发之旅吧!

Python游戏开发,pygame模块,Python实现五子棋联机对战小游戏

       这次我们来写个简单支持联机对战的游戏,支持局域网联机对战的五子棋小游戏。废话不多说,让我们愉快地开始吧~

       环境搭建:安装Python并添加到环境变量,pip安装需要的相关模块即可。

       完整源码已整理好,戳这里领取。

       原理简介:代码主要用PyQt5写的,pygame只用来播放一些音效。首先,设计并实现个游戏主界面:代码实现如下,会pyqt5的应该都可以写出这样的界面,没啥特别的,记得把人机对战和联机对战两个按钮触发后的信号分别绑定到人机对战和联机对战的函数上就行。

       效果大概是这样的:主要的代码实现如下:整个逻辑是这样的:设计并实现游戏的基本界面之后,先默认永远是玩家先手(白子),电脑后手(黑子)。然后,当监听到玩家鼠标左键点击到棋盘网格所在的范围内的时候,捕获该位置,若该位置之前没有人落子过,则玩家成功落子,否则重新等待玩家鼠标左键点击事件。玩家成功落子后,判断是否因为玩家落子而导致游戏结束(即棋盘上有5颗同色子相连了),若游戏结束,则显示游戏结束界面,否则轮到AI落子。AI落子和玩家落子的逻辑类似,然后又轮到玩家落子,以此类推。需要注意的是:为保证响应的实时性,AI落子算法应当写到鼠标左键点击后释放事件的响应中。

       开始按钮就是重置游戏,没啥可说的,这里为了避免有些人喜欢耍赖,我实现的时候代码写的是必须完成当前对弈才能重置游戏。悔棋按钮也没啥可说的,就是悔两步,从历史记录列表里pop最后两次落子然后从棋盘对应位置取下这两次落子就OK了,并且保证只有我方回合可以悔棋以避免出现意料之外的逻辑出错。认输按钮也没啥可说的,就是认输然后提前结束游戏。

       接下来我们来实现一下联机对战,这里我们选择使用TCP/IP协议进行联机通信从而实现联机对战。先启动游戏的一方作为服务器端:后启动方作为客户端连接服务器端并发送客户端玩家的基本信息:当客户端连接到服务器端时,服务器端也发送服务器端的玩家基本信息给客户端:然后客户端和服务器端都利用新开的线程来实现网络数据监听接收:并根据接收到的不同数据在主进程中做成对应的响应:修改的地方:必须点击开始按钮,并经过对方同意之后,才能正式开始对弈,悔棋按钮只有在对方回合才能按,对方同意悔棋后需要记得把落子方切换回自己。然后加了一个催促按钮,同样必须在对方回合才能按。以上就是全部代码修改的全部地方了。

       文章到这里就结束了,感谢你的观看,更多Python开发的小游戏,下篇文章分享小游戏。

C语言C++图形库---贪吃蛇大作战附源码

       设计一款经典小游戏——贪吃蛇,从创建窗体、定位网格、绘制蛇节点、移动蛇节点、控制移动方向、创建食物到最后实现吃掉食物并长大、结束游戏的逻辑,每一步都需精心规划。

       首先,创建一个 * 的窗体,使用默认坐标系,设置背景色并清空窗体。

       接着,将窗体水平分隔为等分,垂直分隔为等分,构建网格坐标系统。在游戏界面,用5格白色的矩形表示蛇,用**的一格矩形表示食物。

       绘制网格线,水平线从x坐标0至,垂直线从y坐标0至,每条线段间隔为像素,以方便观察。

       定义函数paintGrid,封装绘制网格的代码,主函数中调用此函数,给窗体绘制网格。

       定义蛇节点结构,包含x、y坐标,并使用数组表示蛇的多个节点。初始化蛇节点数组,设定初始状态下的蛇节点数量和位置。

       定义函数paintSnake,用于绘制蛇的所有节点。在主函数中,声明数组并调用相关函数绘制网格和蛇。

       实现蛇节点的移动逻辑,定义函数snakeMove,根据蛇头坐标和移动方向,依次移动蛇节点并设置新蛇头。主函数中循环执行移动操作。

       加入键盘控制蛇的移动方向,通过键盘输入改变蛇的前进方向。主函数中,循环读取键盘输入并更新蛇的移动方向。

       创建食物,定义函数createFood,随机生成食物位置,确保不与蛇的任何节点重合。主函数中,调用此函数并在界面显示食物。

       实现吃掉食物后蛇长大逻辑,在snakeMove函数中判断蛇头与食物重合,若重合则蛇长度加1,并重新生成食物。

       检查游戏结束条件,若蛇头触及窗体边界或吃掉自身,游戏结束。定义函数isGameOver,主函数中判断游戏状态并复位。

       完整源码及学习资源请加入群获取,群内有学习资料和讨论机会,适合正在学习C/C++的小伙伴。

小游戏/H5 首包、分包、加载优化方案与项目示例

       麒麟子最近将《Jare 大冒险》升级到了 Cocos Creator 3.8,并更新到了 Cocos Store。在优化过程中,他通过更精细的分包管理、资源加载拆分,并利用分析工具剔除了不必要的资源加载,最终几乎可以做到秒进游戏。这篇文章将分享他是如何进行分包加载优化的。

       Cocos Creator 的 bundle(分包)机制允许游戏拆分为不同的包。麒麟子首先查看了内置的包,发现它们的优先级不同。通过分析,麒麟子得到了一个最粗略的分包方案。在这种机制下,首包仅包含最简单的资源,使得引擎在启动时快速加载首包,用户在进入首包后启动加载流程时,能看到画面和进度条,不会感到焦虑。不过,对于一些游戏,通常会有一个主菜单界面,供玩家选择玩法、自定义数据、选择关卡等,此时可以单独分一个包作为缓冲,以提高用户体验。

       对于场景中大量面板的问题,麒麟子使用了最新的KylinsToolkit 中的 KFC(Kylin's Framework Core)框架优化了界面管理。只需编辑好Prefab,并写好 Controller,即可在任何地方通过一行代码显示所需界面。界面的分层、资源加载、分辨率适配等都由KFC自动管理。

       为了进一步优化资源加载,麒麟子使用了微信开发者工具中的代码依赖分析功能。通过分析,他发现了资源中的问题,并优化了分包大小,最终从.MB降低到了7.MB,缩小了3.MB。麒麟子提到,虽然目前仅处理了一些较大的和移除了不必要的资源引用,但完全优化更多包体仍需使用如pngquat等压缩工具来处理3D模型纹理。

       麒麟子重启并开源了KylinsToolkit,并将项目框架部分抽取为了 KFC。KylinsToolkit 是麒麟子多年项目经验的总结,虽然不是最优解,但在一定程度上使项目的起步、模块分割、多人协同和后期维护更加顺畅。KFC包含了基础功能,并计划逐步加入网络、2D游戏常用控件、3D游戏常用控件等。

       麒麟子希望基于KFC和KylinsToolkit中的其他模块来制作更多项目模板和案例,并邀请使用KFC和KylinsToolkit制作项目的朋友们加入。麒麟子也提供了一个领取KFC的链接,并表示后续会考虑使用码云镜像,但暂时还不知道具体步骤,期待有懂的朋友指导。

       关于如何体验Jare大冒险源码,读者可自行开始体验。

顶级大佬打造的Python小游戏项目,拿走学习不谢!

       现在许多小伙伴疑惑,学了Python能做些什么,学习Python有何用?是否知道系统学习路径?

       分享几款利用Python制作的小游戏,非常适合Python开发者。Python程序员往往充满童心,现在就推荐一个私藏的GitHub项目——Python小游戏,只需一行命令即可进入,体验儿时简单快乐。

       这些游戏均由Python编写,学习Python一段时间的同学可以借此练习,向朋友展示成果。它们是很好的参考案例。

       安装与使用相当简单,仅需一行代码。

       该项目所有游戏基于Python内置模块Turtle开发,无需复杂依赖,安装无难度。

       安装完毕后,使用python -m freegames list可查看所有游戏。

       让我们以贪吃蛇为例,启动游戏,使用键盘上下左右键进行控制。

       吃豆人游戏同样经典,通过特定代码启动,体验与原版相似的玩法。

       Flappy游戏与风靡一时的Flappy bird极为相似,只需更改游戏名即可。

       Python炸金花小游戏,通过Python实现类似炸金花的扑克牌游戏,了解游戏规则。

       Memory游戏挑战记忆力,操作简单,宫格中隐藏数字,匹配相同数字。

       迷宫游戏考验寻路能力,找到走出迷宫的路径。

       Tic Tac Toe游戏,只需单击屏幕放置X或O,连成一线即为胜利。

       奥特曼打怪兽游戏,利用Python海龟画图实现。

       所有游戏源码均可查看,学习逻辑并进行修改,增添更多功能与玩法。

       以上Python小游戏已准备,需要者可获取项目源代码。

本文地址:http://04.net.cn/html/09e404795943.html 欢迎转发