写的几个小玩意

原创 2008年09月28日 20:02:00
 侃侃自己的几个课程设计

 

  大三下的那个学期,咱又做了次课程设计,题目范围是写几个游戏。

  俄罗斯方块,这个大家都玩过的,咱做这个东西花了3天,算矩阵算的头脑发昏了。。。

 

界面是这样的:


 

附加功能只有计分,没办法,人懒;

关键技术是c++win32 api,包括界面都是咱用gdi一笔一划的画出来的,这个程序是界面和游戏逻辑完全分离的,后台的算法是这样的,设置一个二维数组,然后方块也用二维数组表示,如:

1 1 1 1

1 0 0 0

0 0 0 0

0 0 0 0

这个知道是啥方块吗?

然后就是纯粹的矩阵的翻转,搬运,界面用一个timer,定时的刷新矩阵数据转换成不同颜色的方块,这样就能做出方块下落的效果,而且响应键盘方向键的消息后,后台矩阵搬运一下,界面重绘一下,就出来效果了。

给出后台游戏逻辑类的接口吧

 

 

  1. /*************************************************
  2.   Filename: Game.h
  3.   Author: Haoran Wang     
  4.   Date: 2008-06-14
  5.   Description: 游戏逻辑类CTetris的定义文件
  6.   Function(or class)List:
  7.         1.class CTetris 
  8.   History:
  9. *************************************************/
  10.  
  11. #ifndef __GAME_H__
  12. #define __GAME_H__
  13.  
  14. #include <cstdlib>
  15. #include <cstdio>
  16. #include <ctime>
  17. #include <windows.h>
  18. #include <iostream>
  19.  
  20. #define BGD_LINE    20
  21. #define BGD_ROW     10
  22.  
  23. #define FIG_SIZE        4
  24.  
  25. #define FIG_TRIADA      1
  26. #define FIG_LCORNER     FIG_TRIADA + 1               
  27. #define FIG_RCORNER     FIG_TRIADA + 2
  28. #define FIG_LZIGZAG     FIG_TRIADA + 3
  29. #define FIG_RZIGZAG     FIG_TRIADA + 4
  30. #define FIG_STICK       FIG_TRIADA + 5
  31. #define FIG_BOX         FIG_TRIADA + 6
  32.  
  33. #define GAME_FAIL       100
  34. #define GAME_WIN        GAME_FAIL + 1
  35. #define RET_OK          GAME_FAIL + 2
  36.  
  37. #define GAME_BEGIN_X    4
  38. #define GAME_BEGIN_Y    0
  39.  
  40. #define FIG_STOPPED     8
  41.  
  42. #define DIRECTION_DOWN      200
  43. #define DIRECTION_LEFT      DIRECTION_DOWN + 1
  44. #define DIRECTION_RIGHT     DIRECTION_DOWN + 2
  45.  
  46. //type
  47. typedef BYTE(*FIG_TYPE)[4];
  48.  
  49. typedef struct FigPosType
  50. {
  51.     UINT x;
  52.     UINT y;
  53. }FIGPOS;
  54.  
  55. //描述游戏逻辑的类
  56. class CTetris
  57. {
  58. public:
  59.     CTetris();
  60.     ~CTetris();
  61. public:
  62.     void Start();
  63.     UINT CreateFig();
  64.     bool MoveDown();
  65.     bool MoveLeft();
  66.     bool MoveRight();
  67.     bool TurnFig();         //旋转
  68.     UINT ClearFillLine();   //扫描并清除满行
  69.     BYTE** GetBackground();
  70.     UINT GetNextFig();      //获取下一轮方块
  71. private:
  72.     FIG_TYPE    *m_pstFigSet;       //保存所有方块种类描述的入口
  73.     BYTE        **m_pbyBackground;  //游戏屏幕背景
  74.     UINT        m_uiCurFig;         //当前方块种类
  75.     UINT        m_uiNextFig;        //下一个方块种类
  76.     FIGPOS      m_stCurPos;         //当前方块的位置,左上角坐标
  77.     UINT        m_uiCurFigLength;   //当前方块的长度
  78.     UINT        m_uiCurFigWidth;    //当前方块的宽度
  79.     BYTE        **m_pbyCurFig;      //当前方块描述,考虑到方块旋转
  80.     UINT        m_uiScore;          //分数
  81. private:
  82.     UINT RandomFig();
  83.     void SetBgdFig(UINT uiType,UINT uiX,UINT uiY);
  84.     void MatrixCopy(FIGPOS stDesPos,BYTE abySrc[4][4]);
  85.     bool IsHit(FIGPOS stPos,UINT uiDirection);
  86.     void GetCurFigLW();
  87. };
  88.  
  89. #endif


  界面有个地方要注意的就是重绘时的闪烁问题,可以利用内存位图缓冲一下:
  1. memDC = CreateCompatibleDC(hdc);//创建一个内存设备的DC
  2. memBM = CreateCompatibleBitmap(hdc,BGD_WIDTH + 100,BGD_LENGTH + 30);
  3. //创建内存位图
  4. SelectObject(memDC,memBM);
  5. ...
  6. //调用BitBlt输出到设备就行了

  除了俄罗斯,咱还做了个万年历的,公历转农历算法是网上down的,还有其他的算法,比如求今天是星期几的,求闰年之类的,相信大家都很熟了,界面是用gdi模拟日历的格式,算法是这样的:
  1. VOID CCalendar::GetGUICalendar(UINT auiDate[][7])
  2. {
  3.     int asiMonth[13]    = {0,31,0,31,30,31,30,31,31,30,31,30,31};
  4.     asiMonth[2]         = (IsLeapYear(m_sysTime.wYear) ? 29 : 28);
  5.     //暂存当前日期的day
  6.     int siTmpDay        = m_sysTime.wDay;
  7.     SetDate(m_sysTime.wYear,m_sysTime.wMonth,1);
  8.     int siWeekBeg       = QueryWeek();
  9.     int siDay           = 1;
  10.     
  11.     for (int siCnt1 = 0;siCnt1 != 5 && siDay <= asiMonth[m_sysTime.wMonth];++siCnt1)
  12.     {
  13.         for (int siCnt2 = 0;siCnt2 != 7 && siDay <= asiMonth[m_sysTime.wMonth];++siCnt2)
  14.         {
  15.             if (siCnt1 == 0)
  16.             {
  17.                 siCnt2 = siWeekBeg;
  18.                 ++siWeekBeg;
  19.             }
  20.             auiDate[siCnt1][siCnt2] = siDay;
  21.             ++siDay;
  22.         }
  23.     }
  24.     //还原时间
  25.     SetDate(m_sysTime.wYear,m_sysTime.wMonth,siTmpDay);
  26. }
  看出来了吗?给一个二维数组,模拟月历牌上的各个位置,然后算出本月第一天是星期几,之后就从第一行的第几列开始挨个赋值(1、2、3...),之后直接打印出这个数组就行了。

  另外还有个程序是网络五子棋对战,别怪我,AI太难了。。。因为程序做的太丑,就不拿出来了,原理就是udp,发来发去,很没技术含量。。。


Python编写一些小玩意儿(《Python核心编程》第11章)

本人理科学生狗,本科时抱着自己以后绝不会从事计算机相关工作的态度而对编程敬而远之,大一学习C++也是苦不堪言,期末背背书上的代码,勉强及格,大二之后再也没有碰过。 对于我这样一个编程菜鸟来说,Pyt...
  • zuolixiangfisher
  • zuolixiangfisher
  • 2015年07月05日 16:35
  • 200

习题 7.15 写几个函数:1.输入10个职工的姓名和职工号;2.按职工号由小到大顺序排序,姓名顺序也随之调整;。。。

C程序设计(第四版) 谭浩强 习题7.15 个人设计习题 7.15 写几个函数:1. 输入10个职工的姓名和职工号;2. 按职工号由小到大顺序排序,姓名顺序也随之调整;3. 要求输入一个职工号,用折半...
  • navicheung
  • navicheung
  • 2017年10月01日 13:11
  • 2111

前端的小玩意(5)——用dojo写的二级下拉菜单自动添加功能

先上DEMO, 虽然丑,那是因为零级按钮的界面太丑了,图标也丑┑( ̄Д  ̄)┍ 这两个优化后会好很多,毕竟美观不是我的特长嘛 DEMO链接: http://download.csdn....
  • qq20004604
  • qq20004604
  • 2016年07月06日 14:20
  • 666

一些常用的小玩意之Freemarker

1. 网页静态化 可以使用Freemarker实现网页静态化(真正静态化,不是伪静态)。   1.1. 什么是freemarker FreeMarker是一个用Java语言编写的模板引擎,它基...
  • wang_3600
  • wang_3600
  • 2017年11月17日 19:28
  • 28

颠覆常识?!有趣的小玩意

日经杂志(TRENDY),于2014年9月推出特辑,介绍了许多颠覆大家传统思考逻辑的日常小玩意,引起读者们的巨大回响。今天我们就大家来看看这些厉害的小东西吧,究竟都是些什么呢? NO.1 可计重的行...
  • swpton
  • swpton
  • 2014年08月21日 15:02
  • 384

一些常用的小玩意之solr

1. Solr服务搭建 1.1. Solr的环境 Solr是java开发。 需要安装jdk。 安装环境Linux。 需要安装Tomcat。 1.2. 搭建步骤 第一步:把solr 的压缩...
  • wang_3600
  • wang_3600
  • 2017年11月17日 18:56
  • 20

一个小玩意引起的反思

最近在给公司写一个小玩意,虽说写了有几个月了,但写的实在是烂的惨不忍睹.所以,我觉得这事还是值得反思一下的. 几个月前,接到这个活,然后感觉两三周就能搞完,然后开始连续奋战. 一切按照预期的,两三...
  • tjns8
  • tjns8
  • 2016年07月24日 03:38
  • 177

一些常用的小玩意之FastDFS

1. FastDFS 1、存储空间可扩展。 2、提供一个统一的访问方式。   使用FastDFS,分布式文件系统。存储空间可以横向扩展,可以实现服务器的高可用。支持每个节点有备份机。   1.1. 什...
  • wang_3600
  • wang_3600
  • 2017年11月17日 17:25
  • 31

一些常用的小玩意之ActiveMQ

1. ActiveMQ 1.1. 什么是ActiveMQ ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 ...
  • wang_3600
  • wang_3600
  • 2017年11月17日 19:14
  • 25

一些常用的小玩意之dubbo

在基于soa的架构的项目中,表现层和服务层是不同的工程。所以两个系统之间进行通信是必须的。 如何实现远程通信? 1、Webservice:效率不高基于soap协议。项目中不推荐使用。 2、使用rest...
  • wang_3600
  • wang_3600
  • 2017年11月17日 15:42
  • 31
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:写的几个小玩意
举报原因:
原因补充:

(最多只允许输入30个字)