首页 > 编程资源分享区 > C/C++源代码共享 > 连连看游戏[转贴]
2006
05-30

连连看游戏[转贴]





点击此处下载

    最近在唯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;
/* ———————– */


留下一个回复