gameplay.c

来自「bbs server linux平台下软件源码」· C语言 代码 · 共 174 行

C
174
字号
#include"gamedefs.h"#include"gamedraw.h"#include"gameinit.h"#include"gameplay.h"#include"screens.h"extern BoxPoint *GameTargetData;extern int TargetPointNum;      //  Target Point Numberextern int BoxPointNum;         //  Target Point Numberextern int PadBaseX, PadBaseY;  //  Pad Base X, Yextern BoxPoint WorkerPoint;    //  Worker Current Positionextern char *GamePad;           //  Game Pad Mapextern int PadWidth, PadHeight; //  Game Pad Width, HeightBoxPoint PadDiff[MaxDiff];int PadDiffNum = 0;Boolean addiff(int x, int y){    if (PadDiffNum >= MaxDiff)        return FALSE;    PadDiff[PadDiffNum].x = x;    PadDiff[PadDiffNum].y = y;    PadDiffNum++;    return TRUE;}void showdiff(void){    int i;    for (i = 0; i < PadDiffNum; i++)        DrawCell(PadDiff[i].x, PadDiff[i].y);    worker(WorkerPoint.x, WorkerPoint.y);}void cleardiff(void){    PadDiffNum = 0;}void movebox(int x, int y, int xoff, int yoff){    char *ptr, *target;    ptr = GamePad + y * PadWidth + x;    target = ptr + xoff + yoff * PadWidth;    if (PadSpace != *target && PadTarget != *target)        return;    if (0 == (PadBox & *ptr))        return;    *target++ |= PadBox;    *target |= PadBox;    *ptr++ &= ~PadBox;    *ptr &= ~PadBox;}/*Boolean workermove(Direction dir)*/int workermove(int dir){    Boolean b_rtn;    char other, target;    char *ptr;    int x, y, xoff, yoff;    b_rtn = 0;    x = WorkerPoint.x;    y = WorkerPoint.y;    ptr = GamePad + y * PadWidth + x;    switch (dir) {    case East:        xoff = 2;        yoff = 0;        break;                  //      2 space for each cell    case West:        xoff = -2;        yoff = 0;        break;    case North:        xoff = 0;        yoff = -1;        break;    case South:        xoff = 0;        yoff = 1;        break;    default:        return 0;               //      break;    }    target = *(ptr + xoff + yoff * PadWidth);    other = *(ptr + ((xoff + yoff * PadWidth) << 1));    if (PadSpace == target || PadTarget == target)        b_rtn = 1;    else if (PadBox & target) {        if (PadSpace == other || PadTarget == other) {            addiff(x + xoff * 2, y + yoff * 2);            movebox(x + xoff, y + yoff, xoff, yoff);            b_rtn = 2;        } else            b_rtn = 0;    } else        b_rtn = 0;    if (b_rtn) {        addiff(x, y);        addiff(x + xoff, y + yoff);        WorkerPoint.x = x + xoff;        WorkerPoint.y = y + yoff;    }    return b_rtn;}void regretmove(dir){    int x, y, xoff, yoff;    int bmovebox = 0;    x = WorkerPoint.x;    y = WorkerPoint.y;    if (dir > 8) {        dir -= 8;        bmovebox = 1;    }    switch (dir) {    case East:        xoff = 2;        yoff = 0;        break;                  //      2 space for each cell    case West:        xoff = -2;        yoff = 0;        break;    case North:        xoff = 0;        yoff = -1;        break;    case South:        xoff = 0;        yoff = 1;        break;    default:        return;                 //      break;    }    addiff(x + xoff, y + yoff);    addiff(x, y);    addiff(x - xoff, y - yoff);    WorkerPoint.x = x - xoff;    WorkerPoint.y = y - yoff;    if (bmovebox)        movebox(x + xoff, y + yoff, -xoff, -yoff);}Boolean wingame(void){    int i, x, y, num;    char *ptr;    num = 0;    for (i = 0; i < TargetPointNum; i++) {        x = GameTargetData[i].x;        y = GameTargetData[i].y;        ptr = GamePad + x + y * PadWidth;        if ((*ptr & PadTarget) && (*ptr & PadBox))            num++;        else            break;    }    if (num != TargetPointNum)        return FALSE;    else        return TRUE;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?