📄 pushbox.c
字号:
#include"stdio.h"
#include"graphics.h"
struct box
{
int x0,y0;
int flag;
struct box *next,*prior,*left,*right;
};
struct box a[12][15],*head;
int stage,total,steps,*buffer,b[12][15],c[12][15],d[12][15];
char str1[3],str2[3],str3[3]="000";
main()
{
char ch;
int i,j,k;
void calculate(int n,char *p);
void init1();
void init2();
void init3();
void init4();
void init5();
void init6();
void init7();
void init8();
void init9();
void init10();
void init11();
void init12();
void init13();
void init14();
void init15();
void init16();
void init17();
void init18();
void init19();
void init20();
void init21();
void init22();
void init23();
void init24();
void init25();
void init26();
void init27();
void init28();
void init29();
void init30();
void init31();
void init32();
void init33();
void init34();
void init35();
void init36();
void init37();
void init38();
void init39();
void init40();
void init41();
void init42();
void init43();
void init44();
void init45();
void init46();
void init47();
void init48();
void init49();
void init50();
void init51();
void init52();
void init53();
void init54();
void init55();
void init56();
void init57();
void init();
void print(struct box *p);
void printall();
void up();
void down();
void left();
void right();
void recover();
void restart();
void check();
int driver=VGA,mode=VGAHI;
initgraph(&driver,&mode,"");
for(i=0;i<12;i++)
{for(j=0;j<14;j++)
a[i][j].next=&a[i][j+1];
a[i][14].next=NULL;}
for(i=0;i<12;i++)
{for(j=14;j>0;j--)
a[i][j].prior=&a[i][j-1];
a[i][0].prior=NULL;}
for(j=0;j<15;j++)
{for(i=0;i<11;i++)
a[i][j].right=&a[i+1][j];
a[11][j].right=NULL;}
for(j=0;j<15;j++)
{for(i=11;i>0;i--)
a[i][j].left=&a[i-1][j];
a[0][j].left=NULL;}
setbkcolor(7);
setcolor(1);
settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
rectangle(120,90,520,380);
outtextxy(220,130,"Welcome to PushBox !");
outtextxy(220,160,"'w' to up,'s' to down");
outtextxy(220,190,"'a' to left,'d' to right");
outtextxy(220,220,"'r' to back ,'q' to restart");
outtextxy(220,260,"Please choose stage:");
gets(str2);
stage=atoi(str2);
outtextxy(220,290,"The stage is :");
outtextxy(322,290,str2);
outtextxy(220,320,"press an key to enter game !");
getch();
clrscr();
rectangle(169,40,510,440);
rectangle(169,40,510,89);
outtextxy(270,60,"PUSH BOX");
rectangle(169,391,510,440);
outtextxy(270,410,"Welcome...");
setviewport(170,90,510,390,0);
rectangle(240,0,340,49);
setfillstyle(7,1);
bar(241,2,339,47);
setcolor(15);
outtextxy(250,15,"stage");
setcolor(1);
rectangle(240,50,340,99); /*stage输出区*/
outtextxy(265,70,"00");
rectangle(240,100,340,149);
bar(241,102,339,147);
setcolor(15);
outtextxy(250,115,"total");
setcolor(1);
rectangle(240,150,340,199); /*total输出区*/
outtextxy(265,170,"000");
setcolor(1);
rectangle(240,200,340,249);
bar(241,201,339,248);
setcolor(15);
outtextxy(250,215,"steps");
setcolor(1);
rectangle(240,250,340,300); /*steps输出区*/
outtextxy(265,270,str3);
setcolor(1);
init();
while(ch!=27)
{
ch=getch();
switch(ch)
{
case 'w':
up();
break;
case 's':
down();
break;
case 'a':
left();
break;
case 'd':
right();
break;
case 'r':
recover();
break;
case 'q':
restart();
break;
default:
break;
}
check();
}
}
void init()
{ int i,j;
for(i=0;i<12;i++)
for(j=0;j<15;j++)
{a[i][j].x0=i*20;
a[i][j].y0=j*20;}
switch(stage) /* 选关并且地图的详细信息初始化*/
{
case 1: init1();break;
case 2: init2();break;
case 3: init3();break;
case 4: init4();break;
case 5: init5();break;
case 6: init6();break;
case 7: init7();break;
case 8: init8();break;
case 9: init9();break;
case 10: init10();break;
case 11: init11();break;
case 12: init12();break;
case 13: init13();break;
case 14: init14();break;
case 15: init15();break;
case 16: init16();break;
case 17: init17();break;
case 18: init18();break;
case 19: init19();break;
case 20: init20();break;
case 21: init21();break;
case 22: init22();break;
case 23: init23();break;
case 24: init24();break;
case 25: init25();break;
case 26: init26();break;
case 27: init27();break;
case 28: init28();break;
case 29: init29();break;
case 30: init30();break;
case 31: init31();break;
case 32: init32();break;
case 33: init33();break;
case 34: init34();break;
case 35: init35();break;
case 36: init36();break;
case 37: init37();break;
case 38: init38();break;
case 39: init39();break;
case 40: init40();break;
case 41: init41();break;
case 42: init42();break;
case 43: init43();break;
case 44: init44();break;
case 45: init45();break;
case 46: init46();break;
case 47: init47();break;
case 48: init48();break;
case 49: init49();break;
case 50: init50();break;
case 51: init51();break;
case 52: init52();break;
case 53: init53();break;
case 54: init54();break;
case 55: init55();break;
case 56: init56();break;
case 57: init57();break;
default: init1();break;
}
a[11][14].flag=2;
print(&a[11][14]);
for(i=0;i<12;i++)
for(j=0;j<15;j++)
{b[i][j]=a[i][j].flag;
d[i][j]=a[i][j].flag;}
for(i=0;i<12;i++)
for(j=0;j<15;j++)
print(&a[i][j]);
}
void print(struct box *p)
{ int x,y;
x=p->x0;
y=p->y0;
switch(p->flag)
{ case 0: /*空位*/
setfillstyle(0,1);
bar(x,y,x+18,y+18);
break;
case 1: /* 固定的实体位置*/
rectangle(x,y,x+18,y+18);
setfillstyle(7,1);
bar(x+1,y+1,x+17,y+17);
break;
case 2: /*箱子*/
rectangle(x,y,x+18,y+18);
setfillstyle(11,1);
bar(x+1,y+1,x+17,y+17);
break;
case 3: /*目标位置*/
setcolor(7);
rectangle(x,y,x+18,y+18);
setcolor(1);
setfillstyle(8,1);
bar(x+1,y+1,x+17,y+17);
break;
case 4:/*重叠现象,箱子到了目标位置*/
rectangle(x,y,x+18,y+18);
setfillstyle(8,1);
bar(x+1,y+1,x+17,y+17);
getimage(a[11][14].x0,a[11][14].y0,a[11][14].x0+18,a[11][14].y0+18,buffer);
putimage(x,y,buffer,2);
break;
case 5:
case 6: /*小人头 小人头到了阴影目标区域*/
setfillstyle(0,1);
bar(x,y,x+18,y+18);
circle(x+9,y+9,7);
putpixel(x+5,y+8,1);
putpixel(x+13,y+8,1);
putpixel(x+9,y+12,1);
break;
default:
break;
}
}
void printall()
{ int i,j;
calculate(steps,str3);
rectangle(240,250,340,300);
setfillstyle(0,1);
bar(241,251,339,299);
outtextxy(265,270,str3);
for(i=0;i<12;i++)
for(j=0;j<15;j++)
print(&a[i][j]);
}
void up()
{ int i,j;
switch(head->prior->flag)
{ case 0:
if(head->flag==6)
head->flag=3;
else head->flag=0;
head=head->prior;
head->flag=5;
steps++;
break;
case 1:
break;
case 2:
if(head->prior->prior==NULL||head->prior->prior->flag==1
||head->prior->prior->flag==2||head->prior->prior->flag==4)
break;
else if(head->prior->prior->flag==0)
{
if(head->flag==6)
head->flag=3;
else head->flag=0;
head->prior->prior->flag=2;
head=head->prior;
head->flag=5;
steps++;
}
else if(head->prior->prior->flag==3)
{
if(head->flag==6)
head->flag=3;
else
head->flag=0;
head->prior->prior->flag=4;
head=head->prior;
head->flag=5;
steps++;
}
break;
case 3:
if(head->flag==6)
head->flag=3;
else
head->flag=0;
head->prior->flag=6;
head=head->prior;
steps++;
break;
case 4:
if(head->prior->prior==NULL||head->prior->prior->flag==1
||head->prior->prior->flag==2||head->prior->prior->flag==4)
break;
else if(head->prior->prior->flag==0)
{
if(head->flag==6)
head->flag=3;
else head->flag=0;
head->prior->prior->flag=2;
head=head->prior;
head->flag=6;
steps++;
}
else if(head->prior->prior->flag==3)
{
if(head->flag==6)
head->flag=3;
else head->flag=0;
head->prior->prior->flag=4;
head=head->prior;
head->flag=6;
steps++;
}
break;
default:
break;
}
for(i=0;i<12;i++)
for(j=0;j<15;j++)
c[i][j]=b[i][j];
for(i=0;i<12;i++)
for(j=0;j<15;j++)
b[i][j]=a[i][j].flag;
printall();
}
void down()
{ int i,j;
switch(head->next->flag)
{
case 0:
if(head->flag==6)
head->flag=3;
else head->flag=0;
head=head->next;
head->flag=5;
steps++;
break;
case 1:
break;
case 2:
if(head->next->next==NULL||head->next->next->flag==1
||head->next->next->flag==2||head->next->next->flag==4)
break;
else if(head->next->next->flag==0)
{
if(head->flag==6)
head->flag=3;
else head->flag=0;
head->next->next->flag=2;
head=head->next;
head->flag=5;
steps++;
}
else if(head->next->next->flag=3)
{
if(head->flag==6)
head->flag=3;
else head->flag=0;
head->next->next->flag=4;
head=head->next;
head->flag=5;
steps++;
}
break;
case 3:
if(head->flag==6)
head->flag=3;
else head->flag=0;
head->next->flag=6;
head=head->next;
steps++;
break;
case 4:
if(head->next->next==NULL||head->next->next->flag==1
||head->next->next->flag==2||head->next->next->flag==4)
break;
else if(head->next->next->flag==0)
{
if(head->flag==6)
head->flag=3;
else head->flag=0;
head->next->next->flag=2;
head=head->next;
head->flag=6;
steps++;
}
else if(head->next->next->flag=3)
{
if(head->flag==6)
head->flag=3;
else head->flag=0;
head->next->next->flag=4;
head=head->next;
head->flag=6;
steps++;
}
break;
default:
break;
}
for(i=0;i<12;i++)
for(j=0;j<15;j++)
c[i][j]=b[i][j];
for(i=0;i<12;i++)
for(j=0;j<15;j++)
b[i][j]=a[i][j].flag;
printall();
}
void left()
{ int i,j;
switch(head->left->flag)
{
case 0:
if(head->flag==6)
head->flag=3;
else head->flag=0;
head=head->left;
head->flag=5;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -