08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205

面向对象程序设计

这是我们学习程序设计的第一课。我也在这门课上第一次接触程语言、写代码。我们以影印版的《C++ Program Design : An Introduction to Programming and Object-Oriented Design 》为教材。

现在想来那段“入门”的经历真是痛苦不堪,很多概念难以理解,就只能一点点把书中的代码一遍遍的敲。但每次跑出一点小东西也都觉着兴奋到不行。大一末的时候有个“大”的课程设计:两人一组编写一个小游戏。我和小琦一组,写了一个比较简略的闯关游戏,这次经历之后才真的对编程有了“入门”的感觉。

小游戏"YingMu"

【游戏功能需求说明】

本游戏是基于日本漫画《灌篮高手》而设计的,相信大家对游戏中的人物都相当熟悉。在游戏中我们采用了键盘上、下、左、右控制玩家的移动,空格键发射子弹。如果玩家碰到敌人,则游戏结束;消灭所有敌人,则通关。游戏共分为两关,每一关的地图是随机产生的,敌人的移动速度也逐渐加快。虽然功能看似简单,但其中乐趣无穷,是一款集娱乐、冒险为一体的游戏。
我们这次是在Microsoft Visual C++ 6.0,  EzWindow library的开发环境下设计完成的,一些程序的功能我们一时没有想到好的方法来实现,所以在这款游戏中没有呈现给大家。相信在以后的学习中,我们能更好地掌握并对这款小游戏进行升级更新。

【游戏总类图】

【游戏中的关键类】

Player

[cpp] view plaincopy
  1. enum Floor{FLoor1=0,Floor2,Floor3,Floor4};
  2. class Player {
  3. public:
  4. //constructor
  5. Player(SimpleWindow &w);
  6. public:
  7. //inspectors
  8. SimpleWindow& GetWindow() const;//得到玩家所在窗口
  9. Position GetPosition() const;  //得到玩家当前位置
  10. Direction GetDirection() const;  //得到玩家当前的方向
  11. BitMap& GetBmp(const Direction &d,int i); //得到玩家在相应的方向及步子上位图
  12. const BitMap& GetBmp(const Direction &d,int i) const;
  13. Floor GetFloor()const;  //得到玩家当前所在层数
  14. bool IsDying();   //检查玩家是否死掉
  15. bool AtRightEdge() const;    //检查玩家是否走到窗口边缘
  16. bool AtLeftEdge() const;
  17. //Facilitators
  18. void Create();  //创建玩家(即将玩家“放”在游戏窗口中)
  19. void Kill();    //“杀死”玩家(从窗口中擦掉)
  20. void Move();    //使玩家在键盘操控下做相应的移动
  21. void Fire();    //发射子弹
  22. void OKUp();    //设置玩家是否可以在层之间跳跃
  23. void OKDown();
  24. void CannotUpDown();
  25. //mutators
  26. void SetPosition(const Position &p); //设置玩家当前所有位图的位置
  27. void SetFloor(Floor &f);  //玩家跳跃之后改变层的数据成员
  28. void SetDirection(const Direction &d); //设置玩家当前的方向
  29. //data member
  30. vector<Bullet*> bullets;   /****************************************/
  31. //方便GameController中检查子弹和敌人     //
  32. //状况,所以放在public域中,设置为可见   //
  33. /****************************************/
  34. private:
  35. //facilities
  36. void Draw();
  37. void Erase();  /****************************************************/
  38. //用户不直接操纵图片,而是通过调用 Creat() 和 Kill() //
  39. //所以定义为 private                                 //
  40. /*****************************************************/
  41. // Data members
  42. SimpleWindow &Window;
  43. vector<vector<BitMap> > Bmp;
  44. Direction CurrentDirection;
  45. Position CurrentPosition;
  46. bool bUpOk;
  47. bool bDownOk;
  48. Floor CurrentFloor;//当前所处的层
  49. //游戏中得到的不是类Layer的层,而是有枚举定义的Floor的层
  50. //因为Layer继承自Map关键是一张图,没有什么特殊的属性
  51. //而枚举定义的Layer有初始化的作用,是每层有了自己的值
  52. //而相应GameController构造函数中分配的每层的敌人和篮球框Gap //的也都对应与向量中有自己的数值,所以在游戏控制器的一些函数中
  53. //(如TestGap、TestEnemy)只检查当前层的篮球框和敌人,
  54. //避免了跳跃效果的意外实现,也提高了检查的效率
  55. int Steps;  //玩家自游戏开始所走的步数
  56. //用以连续轮流切换玩家位图,实现走动的效果
  57. };

Enemy 和 Bullet

[cpp] view plaincopy
  1. /***********************************************************/
  2. // enemy.h                                                 //
  3. //                                                         //
  4. //类Enemy的声明与定义                                      //
  5. //即游戏中的敌人,敌人在各自的Layer中不停的走动            //
  6. /***********************************************************/
  7. #ifndef ENEMY_H
  8. #define ENEMY_H
  9. const int EnemyBitMaps=2;
  10. enum EnemyStatus {Alive,Dead,DeadAlready};
  11. //DeadAlready 是保证enemy 不会重复被 Kill
  12. class Enemy{
  13. public:
  14. //constructor
  15. Enemy(SimpleWindow &W,const Position &p1=(0,0),const Position &p2=(0,0),double h=1 );
  16. //需要提供一个窗口,敌人移动范围,以及每次位移大小(速度)
  17. public:
  18. //inspectors
  19. SimpleWindow& GetWindow() const; //得到敌人所在窗口
  20. Position GetPosition() const; //得到当前敌人位置
  21. Direction GetDirection() const; //得到当前敌人的方向
  22. double GetHorizMovement() const;  //得到每次移动的水平位移
  23. BitMap &GetBmp(const Direction &d); //得到相应方向位图
  24. const BitMap &GetBmp(const Direction &d) const; //得到当前敌人的状态
  25. EnemyStatus GetStatus()const;
  26. //mutators
  27. void SetWindow(SimpleWindow &W);  //设置敌人窗口
  28. void SetDirection(const Direction &d); //设置敌人的方向
  29. void SetPosition(const Position &p); //设置敌人的位置
  30. void SetStatus(EnemyStatus s);  //更改敌人的状态(在后面你会看到他的重要性)
  31. void SetHorizMovement(double h); //设置每次水平位移的大小以更改移动速度
  32. void SetP1P2(const Position &pp1,const Position &pp2); //设置敌人移动的范围
  33. //Facilitators
  34. void Create();   //创建敌人(画在游戏窗口中)
  35. void Kill(); //杀死敌人(从当前窗口擦除)
  36. void Move(); //使敌人在timer下不停地移动
  37. void Draw(); //画出当前位图
  38. void Erase(); //擦掉
  39. Position NewPosition() const; //设置下一刻敌人的方向
  40. void ChangeDirection(); //检查如果超出移动范围,则更改方向
  41. private:
  42. //data members
  43. SimpleWindow& Window;
  44. vector<BitMap> Bmp;
  45. double HorizMovement;
  46. Direction CurrentDirection;
  47. Position CurrentPosition;
  48. Position P1,P2;
  49. EnemyStatus CurrenStatus;
  50. };
  51. #endif
  52. /***************************************/
  53. //derive class Enemy_1                  //
  54. //分别为第一关、第二关的敌人            //
  55. //均派生在类Enemy 只是位图不同,速度不同//
  56. /***************************************/
  57. #ifndef ENEMY_1_H
  58. #define ENEMY_1_H
  59. #include "enemy.h"
  60. class Enemy_1 : public Enemy{
  61. public:
  62. Enemy_1(SimpleWindow &W,const Position &p1=(0,0),
  63. const Position &p2=(0,0) ,double h=0.5);
  64. };
  65. #endif
  66. /********************************/
  67. //derive class Enemy_2          //
  68. /********************************/
  69. #ifndef ENEMY_2_H
  70. #define ENEMY_2_H
  71. #include"enemy.h"
  72. class Enemy_2 : public Enemy{
  73. public:
  74. Enemy_2(SimpleWindow &W, const Position &p1=(0,0),
  75. const Position &p2=(0,0),double h=0.8 );
  76. };
  77. #endif
  78. /***************************************************/
  79. //derive class Bullet
  80. //即游戏中樱木发射的子弹                           //
  81. //自己在一个方向上水平自动移动,类似敌人           //
  82. /***************************************************/
  83. #ifndef BULLET_H
  84. #define BULLET_H
  85. #include "enemy.h"
  86. class Bullet : public Enemy{
  87. public :
  88. Bullet(SimpleWindow &W,Direction d ,
  89. const Position &p1=(0,0), const Position &p2=(0,0));
  90. bool AtRightEdge() const;  //子弹走出移动范围之后应被消灭
  91. //所以增加相应的判断函数返回布尔值
  92. bool AtLeftEdge() const;
  93. void B_Creat();  //制造子弹
  94. };
  95. #endif

GameController

[cpp] view plaincopy
  1. /***********************************************************/
  2. // GameCoroller.h                                          //
  3. //    游戏控制台,控制检查游戏中各个角色的状态以及不同     //
  4. //角色之间的交互,是游戏中最重要最也最操劳的部分           //
  5. /***********************************************************/
  6. #ifndef GAMECONTROL_H
  7. #define GAMECONTROL_H
  8. enum GameLevel { One, Second, Done };
  9. class GameController {
  10. public:
  11. //constructor
  12. GameController(const string &Title = "终结者(樱木花道版)",
  13. const Position &WinPosition=Position(2.0,2.0),
  14. const float WinLength =16,  const float WinHeight = 13);
  15. //标题、位置、窗口宽、高 用以初始化游戏窗口
  16. // destructor
  17. ~GameController();
  18. //inspectors
  19. SimpleWindow *GetWindow();
  20. GameLevel CurrentLevel() const; //检查器 分别得到窗口和当前所在关卡
  21. //facilitators
  22. void Play(const GameLevel Level); //设置游戏所在关卡
  23. void TestGap(Player* player,vector<Gap*> gap);
  24. //检查游戏中玩家是否走到篮筐下(如果在篮筐下可以跳跃,走出篮筐不可以)
  25. void TestBullet(vector<Enemy_1*> e,vector<Bullet*> b);
  26. void TestBullet(vector<Enemy_2*> e,vector<Bullet*> b);
  27. //检查游戏中的子弹是否达到敌人,如果碰到则将子弹和敌人都从窗口中擦掉。
  28. bool TestPlayer(Player* player,vector<Enemy_1*> e);
  29. bool TestPlayer(Player* player,vector<Enemy_2*> e);
  30. //检查游戏中玩家是否被敌人捉到(如果敌人碰到玩家,游戏失败)
  31. int  TimerTick();
  32. //是TimerCallback调用的函数
  33. //游戏窗口中玩家,敌人,子弹的走到效果都是由他实现的游戏关卡跳跃也是在这里实现的。
  34. //但因为这个函数不断被调用,而我们想在第一关通过之后加一个小小的提示(Message)
  35. //结果就是Message不段被弹出,所以用了一个全局变量PlayOne,
  36. //保证提示的函数只执行一次,这个平白出来的“魔数”也许增加了代码阅读的困难
  37. private:
  38. //data members
  39. SimpleWindow *GameWindow;
  40. GameLevel Level;
  41. //游戏中各种角色为GameController控制,
  42. //所以作为控制台的数据成员包含在GameController的属性中
  43. Player *player;
  44. vector<Gap*> gaps;
  45. vector<Layer*> layers;
  46. vector<Enemy_1*> enemy1;
  47. vector<Enemy_2*> enemy2;
  48. };
  49. #endif

全局的类:Global 和 Welcome

[cpp] view plaincopy
  1. /********************************************************************/
  2. //resources.h                                                        //
  3. //                                                                   //
  4. //游戏结束是显示界面的资源                                           //
  5. //本想和 welreources.h 放在一起,因为其窗口都是独立于游戏窗口的      //
  6. //并不作为GameControl的数据成员,而是一全局变量使用                  //
  7. //但放在一起可能是因为game.cpp和gamecontroll.cpp都要包含,会出错     //
  8. /*********************************************************************/
  9. #ifndef  WEL_H
  10. #define  WEL_H
  11. //包含在game.cpp中相当于全局变量
  12. //保证函数 int TimerCallBack(void);
  13. //和 int MouseClick(const Position &MousePosition);可以方便的使用
  14. SimpleWindow End("终结者(樱木花道版)",15.0,12.0,Position(2.0,2.0));
  15. BitMap WellDone(End);
  16. BitMap Quit(End);
  17. BitMap Fail(End);
  18. void SetWindows(){
  19. Fail.Load("bmp\\fail.bmp");
  20. assert(Fail.GetStatus()==BitMapOkay);
  21. WellDone.Load("bmp\\done.bmp");
  22. assert(WellDone.GetStatus()==BitMapOkay);
  23. double width=Fail.GetWidth();
  24. double height=Fail.GetHeight();
  25. Quit.Load("bmp\\quit.bmp");
  26. Quit.SetPosition(Position(0.6*width,0.8*height));
  27. assert(Quit.GetStatus()==BitMapOkay);
  28. }
  29. int MouseClickEnd(const Position& MousePosition){
  30. if(Quit.IsInside(MousePosition)){
  31. End.Close();
  32. }
  33. return 1;
  34. }
  35. #endif

welcome.h

[cpp] view plaincopy
  1. /*******************************************************/
  2. //welresources.h                                        //
  3. //并不是一个单独的类,是玩家开始进入游戏时的欢迎界面    //
  4. //放在 *.h文件包含在 game.cpp中作为全局变量             //
  5. /*******************************************************/
  6. #ifndef WELCOME_H
  7. #define WELCOME_H
  8. #include "assert.h"
  9. SimpleWindow Welcome("终结者(樱木花道版)",15.0,12.0,Position(2.0,2.0));
  10. BitMap PlayButton(Welcome);
  11. BitMap InstructionButton(Welcome);
  12. BitMap Instruction(Welcome);
  13. void SetWelcomeWindows(){
  14. BitMap WelcomeBmp(Welcome);
  15. WelcomeBmp.SetPosition(Position(0,0));
  16. WelcomeBmp.Load("bmp\\hello.bmp");
  17. WelcomeBmp.Draw();
  18. assert(WelcomeBmp.GetStatus()==BitMapOkay);
  19. double width=WelcomeBmp.GetWidth();
  20. double height=WelcomeBmp.GetHeight();
  21. PlayButton.SetPosition(Position(0.1*width,0.85*height));
  22. PlayButton.Load("bmp\\play.bmp");
  23. assert(PlayButton.GetStatus()==BitMapOkay);
  24. Instruction.SetPosition(Position(0,0));
  25. Instruction.Load("bmp\\in.bmp");
  26. assert(Instruction.GetStatus()==BitMapOkay);
  27. InstructionButton.SetPosition(Position(0.1*width,0.35*height));
  28. InstructionButton.Load("bmp\\inbutton.bmp");
  29. assert(InstructionButton.GetStatus()==BitMapOkay);
  30. InstructionButton.Draw();
  31. }
  32. #endif

【游戏控制逻辑框图】


【游戏说明】

本游戏无需安装。打开文件夹“YingMu”,双击“YingMu.exe”可直接开始游戏。
打开会出现游戏的进入窗口——显示有灌篮高手剧照图,单击窗口中的“Instruction”图标可以看到具体的游戏操作说明,之后单击“Play”图标即可开始游戏。
游戏开始后,玩家可以看到左下角的樱木花道以及三个在窗口中不停移动的敌人,玩家以键盘的左右键控制樱木花道在窗口中移动,当走到篮筐下时,可以有上下键控制实现层的跳跃。游戏中,玩家按空格键发射子弹(子弹的数目没有限制),子弹遇到敌人即可消灭敌人。当消灭玩所有的敌人,游戏会弹出对话框提示玩家进入下一关。第二关所有敌人被消灭后,游戏胜利。玩家会看到恭喜的窗口,单击左下角的“Quit”图标即可退出游戏。如果游戏中,玩家不小心被敌人捉到,游戏失败,会出现提示游戏失败的界面,单击“Quit”图标退出游戏。

【游戏截图】



【项目总结】

通过大一的C++语言学习后,我们小组完成了第一个项目编程—终结者(樱木花道版)。

接到任务,我们迅速开始……

我们首先上网查阅了相关资料,并下载了一些相关的小游戏进行试玩,揣摩游戏的设计架构及功能实现,汲取别人的长处。接着我们进行课程设计“终结者”的构思,我们最初的设计是界面分为几层,玩家可以在每一层上走动,通过方向键左右移动,遇到楼梯可以上下爬动,空格键发射子弹,并设有各种不同的食物,玩家控制小人走过去“吃”,不同的食物增加或减少相对应的属性(如:生命值、速度等)。然而在真正动手的时候,才发现敲代码远远不像读代码那么简单。我们分工合作,两个人分别编写不同的类,几乎是白手起家,决定和实现每个类有怎样的功能显得异常的生疏和困难,尤其在派生的时候才发现总结出对象必要的属性、行为是多么重要。而这只是困难的开始,当我们把零零散散的代码拼在一起时,终于见识到所谓的“面向对象”并没有我们想象的那么简单。虽然都认真的开了书中的BugHunt程序,可实际上我们很多地方并没有理解到位,尤其是GameController的重要——把一个个孤立的对象联系起来,可以相互“交流”的才是真正“活”的对象,才组成了生动的游戏。我们熬了几个通宵,重写了很多次,删减了许多一开始野心勃勃想要实现的内容,于是有了想在这个终结者的雏形。
之后的时间是我们一起小心翼翼的在游戏中添加一些功能,比如发射子弹,樱木的“走动”效果,以及图片的处理等等……游戏进入和退去的界面也是在这个时期完成的。
在游戏最终出品前期,我们在实验室进行试玩,却发现一个问题:不同的屏幕和分辨率造成了窗口及图片坐标的偏移,我们最初是在自己的电脑上设定的坐标,因为偷懒而直接使用的数字——迅速显出弊端,而在实验室的电脑上,图片甚至发生了重叠。我们随即想到的是把游戏做成两个版本(标屏和宽屏),但后来我们又发现分辨率也会对坐标产生影响,所以两个版本的计划无法实施。我们也去请教了别人查阅了资料,最后用图片的大小来调整层之间的坐标(因为似乎不同的屏幕图片还是不变的),但问题也没有得到根本的解决,结果没有预期的好,这让我们尤其以为可以自慰的地方——游戏的整体美观度大打折扣,希望在以后的学习中能更好的解决该问题,进行游戏的升级与更新。

游戏问世,不是期望的样子……

现在再回头看我们自己编写的第一个游戏,即使抱着“敝帚自珍”的心态,依旧觉得她有那么多不尽人意的地方,毕竟最终的成果有点简单,和当初的设想差得太远,许多功能都没有实现——因为ezwin的功能有限,添加游戏背景甚至是在“梯子”上的走动,都有很明显的闪图,就改成了跳跃;死掉的子弹和敌人都被我们投机取巧的藏在游戏图中,没有真正的delete以释放内存;时间有限,也没有再去在界面中做“生命值”、“速度”等……应该是在开始进行程序架构时,我们就缺乏严谨的逻辑思考,想法太杂太乱,导致有些功能实现起来太过复杂,而使得程序显的臃肿且不利于阅读。

一月奋战,我们还是收获了很多……

这次课程设计中,我们深切的体会到调试的重要,很多问题都是在编译、连接中发现的,看着自己编写的程序一编译出现那么多的错误,信心肯定受到打击,但是通过一次次的修改,看着错误数量的减少,还是很有成就感的。总的来说,我们用于调试的时间远远多与编写代码的时间。
通过课程设计,我们不仅锻炼了自己的实践能力,更培养了团队合作能力。遇到问题时,大家一起互相讨论,一起请教别人,最终找到解决方法,我想这应该是最好的学习过程,在实践中提高自己,比看书的效率高太多了。同时我们也意识到书本上的那些知识对于编程是远远不够的,教科书只是介绍一些皮毛而已,它只是引导你入门而已。我们更多的是要主动的学习,一起做项目就是一种好的方法。

我们知道,我们差的太远太远,要走的路还很长很长……

这次我们小组出品的游戏——终结者(樱木花道版)虽然有些粗糙,功能也十分有限,但是做为这款游戏的整个框架与体系,它实现了我们利用面向对象思想设计游戏的初衷。而在编写以及后来的程序调试与排错的过程中也练习了我们使用C++语言的熟练度以及对常见问题解决的经验积累。更主要的是,他使我们深深地看到自己的差距——学习了一年,还没用过MFC;不能短时间内迅速掌握HGE;即便是参考别人的代码,还要一个字一个字的读……这个挺普通的程序也许是对我们贫乏知识的真实写照,但,这绝不是终点,我们会在今后的学习中努力提高自己的水平,努力创造出优秀的作品。

这是我们软件学习上的第一次试炼,也是我们大一面向对象程序设计学习的成果,相信我们每个人都将终生难忘……

转载请注明出处:http://blog.csdn.net/xiaowei_cqu/article/details/7747650

小游戏“终结者”程序的设计与实现相关推荐

  1. 【面向对象】小游戏“终结者”程序的设计与实现

    08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...

  2. 用C语言实现推箱子小游戏基础程序plus

    目录 设计一个简单的推箱子游戏 功能设计要求: 代码实现 数据定义头文件data_def.h 窗口设置头文件WindowsSet.h WindowsSet.cpp 上移函数 矩阵旋转函数 游戏帧 菜单 ...

  3. bat代码小游戏_程序员入职被27岁领导告诫:我被BAT录用过,是算法方面泰斗大哥...

    现如今,如果你想要被对方尊重,想要获得更好的职位,除了有扎实的技能之外,还要学会包装,如果包装的好,还是能够起到很好的效果. 最近在职场论坛上看到这样一个帖子:程序员刚入职就被27岁的领导告诫,我被B ...

  4. 手机小游戏辅助程序的实现

    这两天玩了一个微信的小游戏,想到以前的跳一跳可以通过模拟按键和截取屏幕的方式做辅助程序,所以想针对这个小游戏也做个机器人自动玩,虽然结果是失败的,但是也学到了点东西. 1.做这种小游戏机器人的关键点有 ...

  5. 打砖块小游戏php程序,利用原生js实现html5打砖块小游戏(代码示例)

    本篇文章给大家通过代码示例介绍一下利用原生js实现html5打砖块小游戏的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 前言 PS:本次项目中使用了大量 es6 语法,故对于 ...

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

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

  7. python迷宫小游戏代码_C++课程设计迷宫小游戏

    温馨提示 程序语言: C . C++ . C# . Python ( 红色字体 表示本课设使用的 程序设计语言 ) 图形功能选项: Win32 控制台程序(黑框.文本界面) . Win32 程序. M ...

  8. python迷宫小游戏大全_C课程设计迷宫小游戏

    DOC 格式 . 温馨提示 程序语言: C . C++ . C# . Python ( 红色字体 表示本课设使用的 程序设计语言 ) 图形功能选项: Win32 控制台程序 (黑框. 文本界面) . ...

  9. 简单的控制台五子小游戏棋程序(Java)

    代码中注释很详细,不多做解释,直接上代码: /*** 简单的控制台五子棋程序*/ public class Chess{private static int BOARD_SIZE=30;//初始化数组 ...

最新文章

  1. 推荐几首好听的Coldplay的歌
  2. 一个不定宽高的元素如何在父元素中垂直水平居中
  3. SOA 案例研究:SOA 设计
  4. 《Shell脚本学习指南》第四章 文本处理工具
  5. ffmpeg时间基种类及转换
  6. 贪心 - Dota2 参议院
  7. open一个绝对路径地址 python_实例15:用Python批量转换doc文件为docx文件
  8. 深度学习之卷积和反卷积
  9. nginx----linux安装
  10. 雷林鹏分享:使用Yaf Codes Generator工具构建YAF测试环境
  11. @import与link方式的区别
  12. 动态规划1——生产线调度问题(Dynamic Programming)
  13. NC Viewer 2.41 1CD(NC程式检验程序)
  14. Altium Designer精简版
  15. java图片转为矢量文件_java 通过batik 把svg格式的矢量图生成png图片
  16. matlab 正交park变换 功率守恒,第二章功率变换.ppt
  17. 怎样解决Mac电脑键盘上的大写锁定键灯不亮?
  18. [PTA]实验11-2-7 统计专业人数
  19. 正三角形c语言编程,三角形 (C语言代码)
  20. 学校计算机室上机记录,学生上机记录表

热门文章

  1. 吴恩达Deeplearning.ai课程学习全体验:深度学习必备课程 By 路雪2017年8月14日 11:44 8 月 8 日,吴恩达正式发布了 Deepleanring.ai——基于 Cours
  2. 优步CEO是混蛋吗?
  3. 分布式项目启动时报错:Duplicate spring bean id XXX
  4. ajax的数据库,AJAX 数据库
  5. Java Review - 集合框架=Collection+Map
  6. Java 8 - 收集器Collectors_分区partitioningBy
  7. Java 8 - 时间API
  8. Spring-AOP 自动创建代理之BeanNameAutoProxyCreator
  9. 消费者行为模型_市场调查消费者行为研究模型
  10. python生成字母图片_Python 模拟动态产生字母验证码图片功能