连连看游戏C语言源代码
#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
#include <math.h>
#include <dos.h>
#define    true    1
#define false    0
/* ---------------------全局变量------------------------------------ */
int BkGndColor=BLACK;
int BorderColor=LIGHTGRAY;
int LineColor=LIGHTBLUE;/* 消除一对方块时时候的连线颜 */
/* Pb - ProgressBar */
int PbColor=LIGHTGREEN;
int PbY=4;
int PbHeight=4;
int  PbValue;            /* 进度条百分比,初始值为100.*/
long StartTime;        /* 开始时间的秒数,只统计分钟,秒 */
long TotalTime;        /* 游戏总共的最大秒数!,*/
/* BoardDatas: a small-size board */
/* Board[x][y][0] - 0:empty, 1:filled */
/* Board[x][y][1] - cell's key; */
unsigned char Board[10][10][2];
int CellSize=30;
int BoardX=20;
int BoardY=60;
int BoardWidth=10;
int BoardHeight=10;
int CellColor=WHITE;
int SelColor=BLUE;    /* selCell's border rect color */
int CurColor=RED;        /* curCell's border rect color */
int EraColor=CYAN;    /* 用于擦除cell的颜!*/
int PairsCount;        /* how much pairs we have put on board */
/* 用于存储逻辑坐标(索引) */
typedef struct _tagCELL
{
    char x;
    char y;
} CELL;
CELL selCell,curCell;/*缓存前一个被选中的位置以及当前所处位置!*/
/*Scan Codes Define*/
enum KEYCODES
{
    K_ESC                =0x011b,
    K_UP                =0x4800,        /* upward arrow */
    K_LEFT            =0x4b00,
    K_DOWN            =0x5000,
    K_RIGHT            =0x4d00,
    K_SPACE            =0x3920,
    K_P                    =0x1970,
    K_RETURN        =0x1c0d,        /* Enter */
};
/* ---------------------函数列表------------------------------------ */
void InitGame(char *bgiPath);
void PlayGame();
void QuitGame();
void InitProgressBar();
void UpdateProgressBar(int percent);
void DrawCell(int key,int x,int y,int color);
void EraseCell(int x,int y);
void DrawBorderRect(CELL *c,int color);
void DrawGameOver(char* info);
int  GetKeyCode();
int  FindPath(CELL *c1,CELL *c2);
/*绘制消除方块时候的连接路径!,用指定颜!*/
void DrawPath(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int color);
/* ----------------------函数实现----------------------------------- */
/* ----------------------[ 核心算法 ]---------------------------------
* 先进行水平方向判断,出两点所在的水平直线活动范围,
* 算出这两条线段在垂直方向的共同区域,
* 遍历该区域判断能否在两线段间架起公垂线,能则两点连接上;
* 接着进行垂直方向判断,类同。无论两点在不在一条直线上,
* 都能使用该算法,因为两点同线只是两点作为矩形对角点的特例而已。
*/
/* 到两个CELL之间的路径,成功返回true */
int FindPath(CELL *c1,CELL *c2)
{
    int i,j,path,min1,max1,min2,max2,left,right,top,bottom;
    /*---------------(0)判断是否点中相同块! ------------*/
    if(Board[c1->x][c1->y][1] != Board[c2->x][c2->y][1])
        return false;
    /*---------------(1)查水平方向公共区域!-----------*/
    min1=max1=c1->x;
    min2=max2=c2->x;
    while(min1-1>=0 && Board[min1-1][c1->y][0]==0) min1--;
    while(min2-1>=0 && Board[min2-1][c2->y][0]==0) min2--;
    left=max(min1,min2);    /* 左边界 */
    while(max1+1<BoardWidth && Board[max1+1][c1->y][0]==0) max1++;
    while(max2+1<BoardWidth && Board[max2+1][c2->y][0]==0) max2++;
    right=min(max1,max2); /* 右边界 */
    /* 检查两条水平线之间是否有公垂线连通!*/
    /* 可以在边缘连通 */
    if(left==0)
    {
        /* 左边缘连通 */
        DrawPath(c1->x,c1->y,  -1,c1->y,  -1,c2->y,  c2->x,c2->y, LineColor);
        delay(6000);
        DrawPath(c1->x,c1->y,  -1,c1->y,  -1,c2->y,  c2->x,c2->y, BkGndColor);/*插除线条!*/
手机游戏源码论坛
        return true;
    }
    if(right==(BoardWidth-1))
    {
        DrawPath(c1->x,c1->y,  BoardWidth,c1->y,  BoardWidth,c2->y,  c2->x,c2->y, LineColor);
        delay(6000);
        DrawPath(c1->x,c1->y,  BoardWidth,c1->y,  BoardWidth,c2->y,  c2->x,c2->y, BkGndColor);/*插除线条!*/
        return true;
    }
    for(i=left;i<=right;i++)
    {
        path=0;/*统计垂直的公垂线长度!*/
        for(j=min(c1->y,c2->y)+1;j<max(c1->y,c2->y);j++)
        {
            path+=Board[i][j][0];
            if(path>0) break;
        }
        if(path==0)
        {
            DrawPath(c1->x,c1->y,  i,c1->y,  i,c2->y,  c2->x,c2->y, LineColor);
            delay(6000);
            DrawPath(c1->x,c1->y,  i,c1->y,  i,c2->y,  c2->x,c2->y, BkGndColor);/*插除线条!*/
            return true;
        }
    }
    /*---------------(2)查垂直方向公共区域!-----------*/
    min1=max1=c1->y;
    min2=max2=c2->y;
    while(min1-1>=0 && Board[c1->x][min1-1][0]==0) min1--;
    while(min2-1>=0 && Board[c2->x][min2-1][0]==0) min2--;
    top=max(min1,min2);
    while(max1+1<BoardHeight && Board[c1->x][max1+1][0]==0) max1++;
    while(max2+1<BoardHeight && Board[c2->x][max2+1][0]==0) max2++;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。