//在tc3++下运行
//游戏名孔明棋
#define Up 0x4800
#define Down 0x5000
#define P 0x1970
#define R 0x1372
#define Enter 0x1c0d
#define Esc 0x11b
#define Right 0x4d00
#define Left 0x4b00
#include<bios.h>
#include<stdio.h>
#include<dos.h>
#include<graphics.h>
#include<conio.h>
#include<stdlib.h>
//定义核心数据
int LargeStartx,LargeStarty; //大方格图形左上角坐标
int SmallStartx,SmallStarty;
int RedNum; //红格子的个数。假如红格子的个数为1,则游戏过关
char State; //按键的状态M(move)与S(select),M表示移动红格子。S表示选择要移动的红格子
int Attr[7][7]; //描述7*7矩阵格子的属性N(none),W(white),R(red).N表示没有格子,W表示有白色格子,R示
//有红色格子
int row,tier; //7*7矩阵的行(row)与列(tier)
int Mission; //表示第几关
int MissionNum; //总的关数
typedef strUCt rect1 //描述大方格的属性
{
int startx;
int starty;
int nowx;
int nowy;
int agox;
int agoy;
char color;
int size;
}Large;
Large LargeRect;
typedef struct rect2 //描述小方格的属性
{
int nowx;
int nowy;
char color;
int size;
}Small;
Small SmallRect;
typedef struct add
{
int x;
int y;
}Add;
//declare functions
void InitData1();
void InitData();
void InitMission(int );
void InitPic();
void Help();
void DrawSmallRect(int ,int ,int ,char );
void DrawLargeRect(int ,int ,int ,char );
void ChangeState();
void MoveLargeRect();
void MoveSmallRect(int );
void main()
{
int key;
int gdriver=DETECT, gmode;
registerbgidriver(EGAVGA_driver);
initgraph(&gdriver, &gmode, "");
setbkcolor(BLUE);
cleardevice();
InitData1();
InitData(); //随着关数的变化需要恢复的数据
Mission=1;
InitMission(Mission); //初始化关数.主要是改变一些方格的属性
InitPic();
do
{
key=bioskey(0);
LargeRect.agox=LargeRect.nowx;
LargeRect.agoy=LargeRect.nowy;
SmallRect.nowx=LargeRect.nowx+10;
SmallRect.nowy=LargeRect.nowy+10;
switch(key)
{
case Up:
{
if(State=='S')
{
if( (row-1)>=0&&Attr[row-1][tier]!='N' )
{
row--;
MoveLargeRect();
break;
}
}
if(State=='M')
{
if(Attr[row-1][tier]=='R'&&Attr[row-2][tier]=='W')
{
MoveSmallRect(key);
Attr[row][tier]='W';Attr[row-1][tier]='W';Attr[row-2][tier]='R';
row-=2;
MoveLargeRect();
RedNum--;
ChangeState();
}
}
break;
}
case Down:
{
if(State=='S')
{
if( (row+1)<7&&Attr[row+1][tier]!='N' )
{
row++;
MoveLargeRect();
}
}
if(State=='M')
{
if(Attr[row+1][tier]=='R'&&Attr[row+2][tier]=='W')
{
MoveSmallRect(key);
Attr[row][tier]='W';Attr[row+1][tier]='W';Attr[row+2][tier]='R';
row+=2;
MoveLargeRect();
RedNum--;
ChangeState();
}
}
break;
}
case Left:
{
if(State=='S')
{
if( (tier-1)>=0&&Attr[row][tier-1]!='N' )
{
tier--;
MoveLargeRect();
}
}
if(State=='M')
{
if(Attr[row][tier-1]=='R'&&Attr[row][tier-2]=='W')
{
MoveSmallRect(key);
Attr[row][tier]='W';Attr[row][tier-1]='W';Attr[row][tier-2]='R';
tier-=2;
MoveLargeRect();
RedNum--;
ChangeState();
}
}
break;
}
case Right:
{
if(State=='S')
{
if( (tier+1)>=0&&Attr[row][tier+1]!='N' )
{
tier++;
MoveLargeRect();
}
}
if(State=='M')
{
if(Attr[row][tier+1]=='R'&&Attr[row][tier+2]=='W')
{
MoveSmallRect(key);
Attr[row][tier]='W';Attr[row][tier+1]='W';Attr[row][tier+2]='R';
tier+=2;
MoveLargeRect();
RedNum--;
ChangeState();
}
}
break;
}
case R:
{
InitData();
InitMission(Mission);
InitPic();
break;
}
case P:
{
InitData();
if(Mission<MissionNum) Mission++;
else Mission=1;
InitMission(Mission);
InitPic();
break;
}
case Enter:
{
if(State=='S'&&Attr[row][tier]=='R')
ChangeStat