点击此处下载
最近在唯C论坛上看到一个连连看游戏,这也正是我想做的一个游戏,不过一直没有付之实践,呵呵,没想到有人捷足先登了哈。下下来一看,恩,不错,不过就是缺点音乐,要是加是音乐和音效那就更完美了。作者功底可不小哦:)。部分源文件如下(由于源文件太长,不是很方便发上来,就发了一个原作品里的头文件),点上面的连接下载整个源程序和编译好的作品,很好玩的啦!推荐大家下下来研究!!!) #define MAX_X 16 #define MAX_Y 9 #define MAX_CHAR 36 #define MAX_GUAN 6 /* 0-9: number 10-35: lowercase 36-61: capital letter 62-76: other char >76: don’t use it, fill with FILL.CHAR */ /* easy: x=12, y=7, char=21 normal: x=14, y=8, char=xx hard: x=16, y=9, char=36 */
#define SUPPER_FAST 1 #define SELECTED_COLOR 2 /* green */ #define CUR_COLOR 4 /* red */ #define NORMAL_COLOR 7 #define LINK_CHAR ‘.’ #define FILL_CHAR 176 #define DISP_X 2 #define DISP_Y 2 #define SCREEN_X 80 #define SCREEN_Y 25 #define MAX_BANK 20
#define CHOOSE_NOW 1 #define CHOOSE_OUTSIDE 1 #define CHOOSE_INSIDE 2 #define CHOOSE_UP 3 #define CHOOSE_ALL 4
/* detail of link type define see file lian.doc */ #define LINK_NONE 0 #define LINK_0P1 1 #define LINK_0P2 2 #define LINK_1P31 3 #define LINK_1P32 4 #define LINK_1P41 5 #define LINK_1P42 6 #define LINK_21P11 7 #define LINK_21P12 8 #define LINK_21P21 9 #define LINK_21P22 10 #define LINK_21P41 11 #define LINK_21P42 12 #define LINK_22P31 13 #define LINK_22P32 14 #define LINK_22P41 15 #define LINK_22P42 16
#define FINISH_DONE 1 #define FINISH_DIE 2 #define FINISH_ESC 3
#define MATRIX_FILE “Matrix.txt” #define SPACE 0×20 #define ENTER 0x0d #define ESC 0x1b #define ARROW_UP 72 #define ARROW_DOWN 80 #define ARROW_LEFT 75 #define ARROW_RIGHT 77 #define F1 59 #define F2 60 #define F3 61 #define F4 62 #define F5 63 #define F6 64 #define F7 65 #define F8 66 #define F9 67 #define F10 68 /* ——————— */ #define SAME_PERCENT 0.8 #define BMP_FILE “Lian_all.bmp” /* this file must be 16 colors (4 bits) */
#define DRAW_START_X 50 #define DRAW_START_Y 20 #define DRAW_MSG_Y 430 #define EMPTY_CHAR 0xff
/* =============================== */ /* Define of LianLianKan */ /* =============================== */ #define MAX_UNIT_X MAX_X #define MAX_UNIT_Y MAX_Y /* Easy: 12*7, Normal: 14*8, Hard: 16*9 */ #define UNIT_WIDE_ALL 40 #define UNIT_HIGH_ALL 50 #define WIDE_FROM 3 #define HIGH_FROM 3 #define UNIT_WIDE 32 #define UNIT_HIGH 42 /* 方块 = 40×50,包括边框1(左上角) 空白的黑色部分(左上角) = 宽度-6;高度-6 (包括边框) 右下角阴影 = 宽度,高度-2 */ #define START_FROM_X 190 #define START_FROM_Y 203 /* default of hard is: 190, 203 */
/* =============================== */ /* Struct Define of BMP file */ /* =============================== */ /* 1. BMP文件头 BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息 */ typedef struct tagBITMAPFILEHEADER { int bfType; /* 位图文件的类型,必须为BM */ /* offset: 0 */ long bfSize; /* 位图文件的大小,以字节为单位 */ /* offset: 2 */ int bfReserved1; /* 位图文件保留字,必须为0 */ /* offset: 6 */ int bfReserved2; /* 位图文件保留字,必须为0 */ /* offset: 8 */ long bfOffBits; /* 位图数据的起始位置,以相对于位图 / /* offset: 0x0a */ /* 文件头的偏移量表示,以字节为单位 */ } BITMAPFILEHEADER;
/* 2. 位图信息头 BMP位图信息头数据用于说明位图的尺寸等信息。 */ typedef struct tagBITMAPINFOHEADER { long biSize; /* 本结构所占用字节数 */ /* offset: 0x0e */ long biWidth; /* 位图的宽度,以像素为单位 */ /* offset: 0×12 */ long biHeight; /* 位图的高度,以像素为单位 / /* offset: 0×16 */ int biPlanes; /* 目标设备的级别,必须为1 */ /* offset: 0x1a */ int biBitCount;/* 每个像素所需的位数,必须是1(双色), / /* offset: 0x1c */ /* 4(16色),8(256色)或24(真彩色)之一 */ long biCompression; /* 位图压缩类型,必须是 0(不压缩), */ /* offset: 0x1e */ /* 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一 */ long biSizeImage; /* 位图的大小,以字节为单位 */ long biXPelsPerMeter; /* 位图水平分辨率,每米像素数 */ long biYPelsPerMeter; /* 位图垂直分辨率,每米像素数 */ long biClrUsed;/* 位图实际使用的颜色表中的颜色数 */ long biClrImportant;/* 位图显示过程中重要的颜色数 */ } BITMAPINFOHEADER;
/* 3. 颜色表 I don’t care */
/* 4. 位图数据 位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:
当biBitCount=1时,8个像素占1个字节; 当biBitCount=4时,2个像素占1个字节; 当biBitCount=8时,1个像素占1个字节; 当biBitCount=24时,1个像素占3个字节; Windows规定一个扫描行所占的字节数必须是 4的倍数(即以long为单位),不足的以0填充, 一个扫描行所占的字节数计算方法: DataSizePerLine= (biWidth* biBitCount+31)/8; // 一个扫描行所占的字节数 DataSizePerLine= DataSizePerLine/4*4; // 字节数必须是4的倍数 位图数据的大小(不压缩情况下): DataSize= DataSizePerLine* biHeight; */
/* =============================== */ /* Mouse */ /* =============================== */ /* /*鼠标信息宏定义*/
#define WAITING 0xff00 #define LEFTPRESS 0xff01 #define LEFTCLICK 0xff10 #define LEFTDRAG 0xff19 #define RIGHTPRESS 0xff02 #define RIGHTCLICK 0xff20 #define RIGHTDRAG 0xff2a #define MIDDLEPRESS 0xff04 #define MIDDLECLICK 0xff40 #define MIDDLEDRAG 0xff4c #define MOUSEMOVE 0xff08
#define BY_KEY 1 #define BY_MOUSE 2 #define BY_COMPUTER 3
/* ————————– */ #include “stdio.h” #include “conio.h” #include “dos.h” #include “stdlib.h” #include “time.h” #include “process.h” #include “ctype.h” #include “math.h” #include “graphics.h”
void DispPlayTime(void); void HideCur(void); void GetGuan(void); void GetNextGuan(void); void MatrixInitial(void); void CreatMatrix(void); void MatrixDisp(void); void DealKey(void); void MatrixSave(void); void MatrixLoad(void); int CanLink(void); void LinkDisp(void); int IsMatrixEmpty(void); int IsMatrixDie(void); void ReArrangeMatrix(void); void FindLinkPair(void); void ClearSelectBank(void); int SameSelected(void); void DispAllLink(void); void UnDispAllLink(void); int ChooseFromBank(void); int CheckLink(void); void ResetCur(void); char KeyPress(void); void SwapSelected(void); void IsLink0p1(void); void IsLink0p2(void); void IsLink1p31(void); void IsLink1p32(void); void IsLink1p41(void); void IsLink1p42(void); void IsLink21p11(void); void IsLink21p12(void); void IsLink21p21(void); void IsLink21p22(void); void IsLink21p41(void); void IsLink21p42(void); void IsLink22p31(void); void IsLink22p32(void); void IsLink22p41(void); void IsLink22p42(void); void MatrixMove(void); /* —————- */ void OpenBmpFile(void); void GetFileInfo(void); void GetUnit(void); void ClearMatrix(void); void FillMatrix(void); int UnitEmpty(void); int UnitInList(void); void CopyChar(unsigned char *to_unit, unsigned char *from_unit); int CompareChar(unsigned char *unit1, unsigned char *unit2); void MatrixConvert(void); int ColorConvert(int ccolor); void InitialGraph(void); void DrawUnit(int CharNum); void DrawUnitS(int CharNum); void DrawUnitC(int CharNum); int GetCharNum(void); void ClearMsgLine(void); void ClearSelected(void); /* —— mouse program ———– */ void MouseMath(void); void MouseOn(int x,int y); void MouseOff(void); void MouseLoad(void); void MouseReset(void); void MouseSetX(int lx,int rx); void MouseSetY(int uy,int dy); void MouseSetXY(int x,int y); void MouseSpeed(int vx,int vy); int LeftPress(void); int MiddlePress(void); int RightPress(void); void MouseGetXY(void); void InitialMouse(void); void GetMouseCur(void); void DealMouse(void);
unsigned char matrix[MAX_X+1][MAX_Y+1]; /* x,y use from 1 */ /* if char = 0, means it is empty */ int selected1x, selected1y; int selected2x, selected2y; /* if = 0 means not selected yet */ int FinishFlag; /* 0 – not finish, other – see finish code define */ char KeyScan; int LinkType; int type2xy; /* record the x or y of the link path of type2x.x, example: type 22p42 path is from 1 go up to type2xy(y), then go righ, then go down. type2xy get its value in function Can.Link(), and use in Link.Disp() */ int curx,cury; int AutoGoMode=0; struct time starttime,endtime; /* ——–here is for store and choose a selected —— */ struct SelectStruct { int x1,y1; int x2,y2; int type; int xy2; }; typedef struct SelectStruct SELECTED;
SELECTED SelectBank[MAX_BANK]; int BankCounter; int guan; /* —— here is for grap disp ———- */ BITMAPFILEHEADER FileHead; BITMAPINFOHEADER InfoHead; unsigned char *OneLine; int DataSizePerLine; int unitx,unity; unsigned char OneUnit[UNIT_HIGH][UNIT_WIDE]; #define OneUnitSize UNIT_HIGH*UNIT_WIDE FILE *fp; /* it is use for the BMP file only */ unsigned char CharList[MAX_CHAR][OneUnitSize]; int CharCounter[MAX_CHAR]; int MaxChar=0; char dispstr[80]; /* ——- here is for mouse ———– */ int PressState; int MouseExist; int MouseButton; int MouseX; int MouseY; int up[16][16],down[16][16],mouse_draw[16][16],pixel_save[16][16]; int SelectedBy; int MouseCurX,MouseCurY; /* ———————– */ |