侃侃自己的几个课程设计
大三下的那个学期,咱又做了次课程设计,题目范围是写几个游戏。
俄罗斯方块,这个大家都玩过的,咱做这个东西花了3天,算矩阵算的头脑发昏了。。。
界面是这样的:


附加功能只有计分,没办法,人懒;
关键技术是c++加win32 api,包括界面都是咱用gdi一笔一划的画出来的,这个程序是界面和游戏逻辑完全分离的,后台的算法是这样的,设置一个二维数组,然后方块也用二维数组表示,如:
1 1 1 1
1 0 0 0
0 0 0 0
0 0 0 0
这个知道是啥方块吗?
然后就是纯粹的矩阵的翻转,搬运,界面用一个timer,定时的刷新矩阵数据转换成不同颜色的方块,这样就能做出方块下落的效果,而且响应键盘方向键的消息后,后台矩阵搬运一下,界面重绘一下,就出来效果了。
给出后台游戏逻辑类的接口吧
界面有个地方要注意的就是重绘时的闪烁问题,可以利用内存位图缓冲一下:
- memDC = CreateCompatibleDC(hdc);
- memBM = CreateCompatibleBitmap(hdc,BGD_WIDTH + 100,BGD_LENGTH + 30);
- SelectObject(memDC,memBM);
- ...
除了俄罗斯,咱还做了个万年历的,公历转农历算法是网上down的,还有其他的算法,比如求今天是星期几的,求闰年之类的,相信大家都很熟了,界面是用gdi模拟日历的格式,算法是这样的:
- VOID CCalendar::GetGUICalendar(UINT auiDate[][7])
- {
- int asiMonth[13] = {0,31,0,31,30,31,30,31,31,30,31,30,31};
- asiMonth[2] = (IsLeapYear(m_sysTime.wYear) ? 29 : 28);
-
- int siTmpDay = m_sysTime.wDay;
- SetDate(m_sysTime.wYear,m_sysTime.wMonth,1);
- int siWeekBeg = QueryWeek();
- int siDay = 1;
-
- for (int siCnt1 = 0;siCnt1 != 5 && siDay <= asiMonth[m_sysTime.wMonth];++siCnt1)
- {
- for (int siCnt2 = 0;siCnt2 != 7 && siDay <= asiMonth[m_sysTime.wMonth];++siCnt2)
- {
- if (siCnt1 == 0)
- {
- siCnt2 = siWeekBeg;
- ++siWeekBeg;
- }
- auiDate[siCnt1][siCnt2] = siDay;
- ++siDay;
- }
- }
-
- SetDate(m_sysTime.wYear,m_sysTime.wMonth,siTmpDay);
- }
看出来了吗?给一个二维数组,模拟月历牌上的各个位置,然后算出本月第一天是星期几,之后就从第一行的第几列开始挨个赋值(1、2、3...),之后直接打印出这个数组就行了。
另外还有个程序是网络五子棋对战,别怪我,AI太难了。。。因为程序做的太丑,就不拿出来了,原理就是udp,发来发去,很没技术含量。。。
发表于 @
2008年09月28日 20:02:00 | | 编辑|
举报| 收藏