首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言写连连看的疑问解决思路

2012-04-23 
C语言写连连看的疑问[codeC/C++][/code]#include stdio.h#include graphics.h#include stdlib.h#in

C语言写连连看的疑问
[code=C/C++][/code]#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
#include <math.h>
#include <dos.h>
#include <bios.h>
#include <string.h>

#define true 1
#define false 0

typedef struct cell
{
  char x;
  char y;
} CELL;

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; /* 游戏总共的最大秒数!,*/

int m,n;
unsigned char Board[20][20][2];
int CellSize=30;
int BoardX=20;
int BoardY=60;
int CellNumX;/*列数*/
int CellNumY; /*行数*/
int m,n;
int CellColor=WHITE;
int SelColor=BLUE; /* selCell边界颜色 */
int CurColor=YELLOW; /* curCell边界颜色 */
int EraColor=CYAN; /* 用于擦除cell的颜色!*/
int PairsCount; /* 屏幕中有多少对 */

CELL selCell,curCell;/*缓存前一个被选中的位置以及当前所处位置!*/

enum KEYCODES
{
  K_ESC =0x011b,
  K_UP =0x4800,
  K_LEFT =0x4b00,
  K_DOWN =0x5000,
  K_RIGHT =0x4d00,
  K_SPACE =0x3920,
  K_P =0x1970,
  K_RETURN =0x1c0d,
};



/*函数列表*/
void attention();
void InitGame(char *bgiPath);
void PlayGame();
void QuitGame();
void InitProgressBar();
void UpdateProgressBar(int percent);
void DrawCell(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);

/* 函数实现 */

void attention()
{
  int i,j;
  window(1,1,100,50);
  textbackground(LIGHTBLUE);
  textcolor(YELLOW);
  clrscr();
  gotoxy(25,4);
  printf("Game Start:(1)");
  gotoxy(25,10);
  printf("Game Over:(0)");
  gotoxy(25,16);
  printf("Please choose,press enter sure");
  gotoxy(25,20);
  scanf("%d",&i);
  if(i==1)
  {
  clrscr();
  window(1,1,100,50);
  textbackground(LIGHTBLUE);
  textcolor(YELLOW);
  gotoxy(25,10);
  printf("Game rules:");
  gotoxy(25,14);
  printf("press Left,Right,Up,Down key to move");
  gotoxy(25,18);
  printf("press ESC to quit");
  gotoxy(20,22);
  printf("Choose easy:(2) difficult:(3)");
  gotoxy(25,26);
  scanf("%d",&j);
  if(j==2)
  {
  clrscr();
  CellNumX=8;
  CellNumY=5;
  m=2;
  n=12;
   
  }
  if(j==3)
  {
  clrscr();
  CellNumX=16;
  CellNumY=9;
  m=2;
  n=38;
   
   
  }
  InitGame("");
  InitProgressBar();
  PlayGame();


  getch();
  QuitGame();
  }
  else
  {
  if(i==0)
  {
  clrscr();
  window(1,1,100,50);
  textbackground(LIGHTBLUE);
  textcolor(YELLOW);
  gotoxy(25,10);
  printf("Thank you");
  getch();
   
  }
  }
}

/* 找到两个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<CellNumX && Board[max1+1][c1->y][0]==0) max1++;
  while (max2+1<CellNumX && 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==(CellNumX-1))
  {
  DrawPath(c1->x,c1->y, CellNumX,c1->y, CellNumX,c2->y, c2->x,c2->y, LineColor);
  delay(6000);
  DrawPath(c1->x,c1->y, CellNumX,c1->y, CellNumX,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<CellNumY && Board[c1->x][max1+1][0]==0) max1++;
  while (max2+1<CellNumY && Board[c2->x][max2+1][0]==0) max2++;
  bottom=min(max1,max2);

  /* 检查两条垂直线之间是否有公垂线连通!*/
  /* 可以在边缘连通 */
  if (top==0)
  {
  /* 同在顶端消除 */
  DrawPath(c1->x,c1->y, c1->x,-1, c2->x,-1, c2->x,c2->y, LineColor);
  delay(6000);
  DrawPath(c1->x,c1->y, c1->x,-1, c2->x,-1, c2->x,c2->y, BkGndColor);/*插除线条!*/
  return true;
  }
  if (bottom==(CellNumY-1))
  {
  DrawPath(c1->x,c1->y, c1->x,CellNumY, c2->x,CellNumY, c2->x,c2->y, LineColor);


  delay(6000);
  DrawPath(c1->x,c1->y, c1->x,CellNumY, c2->x,CellNumY, c2->x,c2->y, BkGndColor);/*插除线条!*/
  return true;
  }

  for (j=top;j<=bottom;j++)
  {
  path=0;/*统计水平的公垂线长度!*/
  for (i=min(c1->x,c2->x)+1; i<max(c1->x,c2->x); i++)
  {
  path+=Board[i][j][0];
  if (path>0) break;
  }
  if (path==0)
  {
  /* 水平公垂线 */
  DrawPath(c1->x,c1->y, c1->x,j, c2->x,j, c2->x,c2->y, LineColor);
  delay(6000);
  DrawPath(c1->x,c1->y, c1->x,j, c2->x,j, c2->x,c2->y, BkGndColor);/*插除线条!*/
  return true;
  }
  }

  /* 到达这里说明没有任何通路 */
  return false;
}
/*Get Key Code */
int GetKeyCode()
{
  int key=0;
  if (bioskey(1))
  {
  key=bioskey(0);
  }
  return key;
}

/*绘制消除方块时候的连接路径!,用指定颜色!,坐标是CELL逻辑坐标!*/
void DrawPath(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int color)
{
  setcolor(color);
  moveto(BoardX+CellSize/2+CellSize*x1,BoardY+CellSize/2+CellSize*y1);
  lineto(BoardX+CellSize/2+CellSize*x2,BoardY+CellSize/2+CellSize*y2);
  lineto(BoardX+CellSize/2+CellSize*x3,BoardY+CellSize/2+CellSize*y3);
  lineto(BoardX+CellSize/2+CellSize*x4,BoardY+CellSize/2+CellSize*y4);
}


/* congratulations info,the user has success finish the game ! */
void DrawGameOver(char* info)
{
  /*计算棋盘的中心点*/
  int cx=BoardX+CellSize*CellNumX/2;
  int cy=BoardY+CellSize*CellNumY/2;
  struct textsettingstype textInfos;
  /*获取此前的文字信息*/
  gettextsettings(&textInfos);
  setcolor(DARKGRAY);
  setfillstyle(SOLID_FILL,BLUE);
  /* 文字居中 */
  rectangle(cx-102,cy-22,cx+102,cy+22);
  floodfill(cx,cy,DARKGRAY);
  rectangle(cx-100,cy-20,cx+100,cy+20);
  settextjustify(CENTER_TEXT,CENTER_TEXT);
  setcolor(LIGHTBLUE);
  outtextxy(cx,cy,info);
  /*restore orignal text settings */
  settextjustify(textInfos.horiz, textInfos.vert);
}




[解决办法]
可能你的编译器没有加载这个图像库;

可以的,楼主学习 一下 window 编程

热点排行