rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_editdata.mso">
侃侃自己的几个课程设计
除了俄罗斯,咱还做了个万年历的,公历转农历算法是网上down的,还有其他的算法,比如求今天是星期几的,求闰年之类的,相信大家都很熟了,界面是用gdi模拟日历的格式,算法是这样的:
看出来了吗?给一个二维数组,模拟月历牌上的各个位置,然后算出本月第一天是星期几,之后就从第一行的第几列开始挨个赋值(1、2、3...),之后直接打印出这个数组就行了。
另外还有个程序是网络五子棋对战,别怪我,AI太难了。。。因为程序做的太丑,就不拿出来了,原理就是udp,发来发去,很没技术含量。。。
大三下的那个学期,咱又做了次课程设计,题目范围是写几个游戏。
俄罗斯方块,这个大家都玩过的,咱做这个东西花了3天,算矩阵算的头脑发昏了。。。
界面是这样的:
附加功能只有计分,没办法,人懒;
关键技术是c++加win32 api,包括界面都是咱用gdi一笔一划的画出来的,这个程序是界面和游戏逻辑完全分离的,后台的算法是这样的,设置一个二维数组,然后方块也用二维数组表示,如:
1 1 1 1
1 0 0 0
0 0 0 0
0 0 0 0
这个知道是啥方块吗?
然后就是纯粹的矩阵的翻转,搬运,界面用一个timer,定时的刷新矩阵数据转换成不同颜色的方块,这样就能做出方块下落的效果,而且响应键盘方向键的消息后,后台矩阵搬运一下,界面重绘一下,就出来效果了。
给出后台游戏逻辑类的接口吧
- /*************************************************
- Filename: Game.h
- Author: Haoran Wang
- Date: 2008-06-14
- Description: 游戏逻辑类CTetris的定义文件
- Function(or class)List:
- 1.class CTetris
- History:
- *************************************************/
- #ifndef __GAME_H__
- #define __GAME_H__
- #include <cstdlib>
- #include <cstdio>
- #include <ctime>
- #include <windows.h>
- #include <iostream>
- #define BGD_LINE 20
- #define BGD_ROW 10
- #define FIG_SIZE 4
- #define FIG_TRIADA 1
- #define FIG_LCORNER FIG_TRIADA + 1
- #define FIG_RCORNER FIG_TRIADA + 2
- #define FIG_LZIGZAG FIG_TRIADA + 3
- #define FIG_RZIGZAG FIG_TRIADA + 4
- #define FIG_STICK FIG_TRIADA + 5
- #define FIG_BOX FIG_TRIADA + 6
- #define GAME_FAIL 100
- #define GAME_WIN GAME_FAIL + 1
- #define RET_OK GAME_FAIL + 2
- #define GAME_BEGIN_X 4
- #define GAME_BEGIN_Y 0
- #define FIG_STOPPED 8
- #define DIRECTION_DOWN 200
- #define DIRECTION_LEFT DIRECTION_DOWN + 1
- #define DIRECTION_RIGHT DIRECTION_DOWN + 2
- //type
- typedef BYTE(*FIG_TYPE)[4];
- typedef struct FigPosType
- {
- UINT x;
- UINT y;
- }FIGPOS;
- //描述游戏逻辑的类
- class CTetris
- {
- public:
- CTetris();
- ~CTetris();
- public:
- void Start();
- UINT CreateFig();
- bool MoveDown();
- bool MoveLeft();
- bool MoveRight();
- bool TurnFig(); //旋转
- UINT ClearFillLine(); //扫描并清除满行
- BYTE** GetBackground();
- UINT GetNextFig(); //获取下一轮方块
- private:
- FIG_TYPE *m_pstFigSet; //保存所有方块种类描述的入口
- BYTE **m_pbyBackground; //游戏屏幕背景
- UINT m_uiCurFig; //当前方块种类
- UINT m_uiNextFig; //下一个方块种类
- FIGPOS m_stCurPos; //当前方块的位置,左上角坐标
- UINT m_uiCurFigLength; //当前方块的长度
- UINT m_uiCurFigWidth; //当前方块的宽度
- BYTE **m_pbyCurFig; //当前方块描述,考虑到方块旋转
- UINT m_uiScore; //分数
- private:
- UINT RandomFig();
- void SetBgdFig(UINT uiType,UINT uiX,UINT uiY);
- void MatrixCopy(FIGPOS stDesPos,BYTE abySrc[4][4]);
- bool IsHit(FIGPOS stPos,UINT uiDirection);
- void GetCurFigLW();
- };
- #endif
- memDC = CreateCompatibleDC(hdc);//创建一个内存设备的DC
- memBM = CreateCompatibleBitmap(hdc,BGD_WIDTH + 100,BGD_LENGTH + 30);
- //创建内存位图
- SelectObject(memDC,memBM);
- ...
- //调用BitBlt输出到设备就行了
除了俄罗斯,咱还做了个万年历的,公历转农历算法是网上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);
- //暂存当前日期的day
- 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);
- }
另外还有个程序是网络五子棋对战,别怪我,AI太难了。。。因为程序做的太丑,就不拿出来了,原理就是udp,发来发去,很没技术含量。。。