学习“推箱子”C语言编码:
#include <stdio.h>
#include <conio.h>
#include<stdlib.h>
#include<windows.h>
int m =0 //m代表第几关
struct maps{short a[9][11]}
struct maps map[5]={ 0,0,0,0,0,0,0,0,0,0,0, //共5关,每关9行
0,1,1,1,1,1,1,1,0,0,0,
0,1,0,0,0,0,0,1,1,1,0,
1,1,4,1,1,1,0,0,0,1,0, //0空地,1墙
1,5,0,0,4,0,0,4,0,1,0, //4是箱子,5是人
1,0,3,3,1,0,4,0,1,1,0, //3是目的地
1,1,3,3,1,0,0,0,1,0,0, //7是箱子在目的地(4+3)
0,1,1,1,1,1,1,1,1,0,0, //8是人在目的地(5+3)
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,0,0,0,
0,0,1,5,0,1,1,1,0,0,0,
0,0,1,0,4,0,0,1,0,0,0,
0,1,1,1,0,1,0,1,1,0,0,
0,1,3,1,0,1,0,0,1,0,0,
0,1,3,4,0,0,1,0,1,0,0,
0,1,3,0,0,0,4,0,1,0,0,
0,1,1,1,1,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,1,1,1,1,1,1,1,0,
0,0,1,1,0,0,1,0,5,1,0,
0,0,1,0,0,0,1,0,0,1,0,
0,0,1,4,0,4,0,4,0,1,0,
0,0,1,0,4,1,1,0,0,1,0,
1,1,1,0,4,0,1,0,1,1,0,
1,3,3,3,3,3,0,0,1,0,0,
1,1,1,1,1,1,1,1,1,0,0,
0,1,1,1,1,1,1,1,1,1,0,
0,1,0,0,1,1,0,0,0,1,0,
0,1,0,0,0,4,0,0,0,1,0,
0,1,4,0,1,1,1,0,4,1,0,
0,1,0,1,3,3,3,1,0,1,0,
1,1,0,1,3,3,3,1,0,1,1,
1,0,4,0,0,4,0,0,4,0,1,
1,0,0,0,0,0,1,0,5,0,1,
1,1,1,1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,1,1,1,1,1,1,0,0,
0,1,1,1,0,0,0,0,1,0,0,
1,1,3,0,4,1,1,0,1,1,0,
1,3,3,4,0,4,0,0,5,1,0,
1,3,3,0,4,0,4,0,1,1,0,
1,1,1,1,1,1,0,0,1,0,0,
0,0,0,0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,0,0,0 }
void DrMap( ) //绘制地图
{ CONSOLE_CURSOR_INFO cursor_info={1,0} //隐藏光标的设置
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info)
printf("\n\n \t\t\b推箱子")
printf("\n \t")
for (int i = 0i <9i++)
{for (int j = 0j <11j++)
{switch (map[m].a[i][j])
{case 0: printf(" ")break
case 1: printf("■")break
case 3: printf("◎")break
case 4: printf("□")break
case 5: printf("♀")break //5是人
case 7: printf("□")break //4 + 3箱子在目的地中
case 8: printf("♀")break // 5 + 3人在目的地中
}
}
printf("\n\t")
}
}
void gtxy(int x, int y) //控制光标位置的函数
{ COORD coord
coord.X = x
coord.Y = y
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord)
}
void start( ) //开始游戏
{ int r, c //r,c用于记录人的下标
for (int i = 0i <9i++)
{ for (int j = 0j <11j++)
{if (map[m].a[i][j] == 5||map[m].a[i][j]==8) { r = i c = j} } //i j 人的下标
}
char key
key = getch( )
switch (key)
{case 'W':
case 'w':
case 72:
if (map[m]. a[r - 1][c] == 0|| map[m]. a [r - 1][c] == 3)
{ gtxy(2*c+8,r-1+3)printf("♀") // gtxy(2*c+8,r-1+3)是到指定位置输出字符
if(map[m]. a[r ][c] == 5){gtxy(2*c+8,r+3)printf(" ")}
if(map[m]. a[r ][c] == 8){gtxy(2*c+8,r+3)printf("◎")}
map[m]. a [r - 1][c] += 5 map[m]. a [r][c] -= 5}
else if (map[m]. a [r - 1][c] == 4 || map[m]. a [r - 1][c] == 7)
{ if (map[m]. a [r - 2][c] == 0 || map[m]. a [r - 2][c] == 3)
{ gtxy(2*c+8,r-2+3)printf("□")gtxy(2*c+8,r-1+3)printf("♀")
if(map[m]. a[r ][c] == 5){gtxy(2*c+8,r+3)printf(" ")}
if(map[m]. a[r ][c] == 8){gtxy(2*c+8,r+3)printf("◎")}
map[m]. a [r - 2][c] += 4 map[m]. a [r - 1][c] += 1
map[m]. a [r][c] -= 5}
} break
case 'S':
case 's':
case 80:
if (map[m]. a [r + 1][c] == 0 || map[m]. a [r + 1][c] == 3)
{ gtxy(2*c+8,r+1+3)printf("♀")
if(map[m]. a[r ][c] == 5){gtxy(2*c+8,r+3)printf(" ")}
if(map[m]. a[r ][c] == 8){gtxy(2*c+8,r+3)printf("◎")}
map[m]. a [r + 1][c] += 5 map[m]. a [r][c] -= 5}
else if (map[m]. a [r + 1][c] == 4 || map[m]. a [r+ 1][c] == 7)
{ if (map[m]. a [r + 2][c] == 0 || map[m]. a [r + 2][c] == 3)
{ gtxy(2*c+8,r+2+3)printf("□")gtxy(2*c+8,r+1+3)printf("♀")
if(map[m]. a[r ][c] == 5){gtxy(2*c+8,r+3)printf(" ")}
if(map[m]. a[r ][c] == 8){gtxy(2*c+8,r+3)printf("◎")}
map[m]. a [r + 2][c] += 4map[m]. a [r + 1][c] += 1
map[m]. a [r][c] -= 5}
}break
case 'A':
case 'a':
case 75:
if (map[m]. a [r ][c - 1] == 0 || map[m]. a [r ][c - 1] == 3)
{ gtxy(2*(c-1)+8,r+3)printf("♀")
if(map[m]. a[r ][c] == 5){gtxy(2*c+8,r+3)printf(" ")}
if(map[m]. a[r ][c] == 8){gtxy(2*c+8,r+3)printf("◎")}
map[m]. a [r ][c - 1] += 5map[m]. a [r][c] -= 5}
else if (map[m]. a [r][c - 1] == 4 || map[m]. a [r][c - 1] == 7)
{if (map[m]. a [r ][c - 2] == 0 || map[m]. a [r ][c - 2] == 3)
{ gtxy(2*(c-2)+8,r+3)printf("□")gtxy(2*(c-1)+8,r+3)printf("♀")
if(map[m]. a[r ][c] == 5){gtxy(2*c+8,r+3)printf(" ")}
if(map[m]. a[r ][c] == 8){gtxy(2*c+8,r+3)printf("◎")}
map[m]. a [r ][c - 2] += 4map[m]. a [r ][c - 1] += 1
map[m]. a [r][c] -= 5}
}break
case 'D':
case 'd':
case 77:
if (map[m]. a [r][c + 1] == 0 || map[m]. a [r][c + 1] == 3)
{ gtxy(2*(c+1)+8,r+3)printf("♀")
if(map[m]. a[r ][c] == 5){gtxy(2*c+8,r+3)printf(" ")}
if(map[m]. a[r ][c] == 8) {gtxy(2*c+8,r+3)printf("◎")}
map[m]. a [r][c + 1] += 5 map[m]. a [r][c] -= 5}
else if (map[m]. a [r][c + 1] == 4 || map[m]. a [r][c + 1] == 7)
{ if (map[m]. a [r][c + 2] == 0 || map[m]. a [r][c + 2] == 3)
{ gtxy(2*(c+2)+8,r+3)printf("□")gtxy(2*(c+1)+8,r+3)printf("♀")
if(map[m]. a[r ][c] == 5){gtxy(2*c+8,r+3)printf(" ")}
if(map[m]. a[r ][c] == 8){gtxy(2*c+8,r+3)printf("◎")}
map[m]. a [r][c + 2] += 4map[m]. a [r][c + 1] += 1
map[m]. a [r][c] -= 5}
}break
}
}
int ifwan( ) //是否完成(1是0否)
{ if(m==0){if(map[m].a[5][2]==7&&map[m].a[5][3]==7&&
map[m].a[6][2]==7&&map[m].a[6][3]==7) return 1}
if(m==1){if(map[m].a[5][2]==7&&map[m].a[6][2]==7&&
map[m].a[7][2]==7) return 1}
if(m==2){if(map[m].a[7][1]==7&&map[m].a[7][2]==7&&map[m].a[7][3]==7&&
map[m].a[7][4]==7&&map[m].a[7][5]==7) return 1}
if(m==3){if(map[m].a[4][4]==7&&map[m].a[4][5]==7&&map[m].a[4][6]==7&&
map[m].a[5][4]==7&&map[m].a[5][5]==7&&map[m].a[5][6]==7) return 1}
if(m==4){if(map[m].a[3][2]==7&&map[m].a[4][1]==7&&map[m].a[4][2]==7&&
map[m].a[5][1]==7&&map[m].a[5][2]==7) return 1}
return 0
}
int main( ) //主函数
{ while (1)
{ system("cls")
DrMap( )
while (1)
{ start( )
if(ifwan()){printf(" }7")break} //完成后响铃
m+=1
}
return 0
}
/*用两个链表来存储两个多项式,然后求和;创建的链表的每个节点包含多项式的一个项的信息:系数和指数;从前到后搜索新加入的项应该存放的位置,加入到链表中合适的位置;程序中有提示,输入项的系数是0,结束该多项式的输入*/#include <stdio.h>
#include <malloc.h>
typedef struct node{//定义节点类型
float coef
int expn
struct node * next
}PLOY
void start()//用户选择界面
{printf("************************************\n")
printf(" 两个一元多项式的相加\n")
printf(" 北京航空航天大学 机械设计系 孙兴涛\n")
printf("************************************\n")
printf("请选择 *** 作:\n")
printf("0.退出\n")
printf("1.两个一元多项式相加\n")
printf("2.帮助\n")
}
void notice()//用户帮助界面
{printf("********************帮助*********************\n")
printf("1.输入时只输入多项式的系数与指数,以0 0结束.\n")
printf("2.例如输入“1 1”然后回车,代表“1*X^1”\n")
}
void insert(PLOY *head,PLOY *inpt)//查找位置插入新链节程序
{PLOY *pre,*now
int signal=0
pre=head//pre定义为现在的前一个链节
if(pre->next==NULL) {pre->next=inpt}
else {now=pre->next
while(signal==0)
{if(inpt->expn<now->expn)//当新链节小于现在的连接时向后移一个链节
{if(now->next==NULL) {now->next=inptsignal=1}
else {pre=nownow=pre->next}}
else if(inpt->expn>now->expn)//如果发现比现在的链节大了就插入到这个连接的前面
{inpt->next=nowpre->next=inptsignal=1}
else {now->coef=now->coef+inpt->coefsignal=1free(inpt)//与当前链节相等指数
if(now->coef==0) {pre->next=now->nextfree(now)}}}}
}
PLOY * creat(char ch) //输入多项式
{PLOY *head, *inpt
float xint y
head=(PLOY *)malloc(sizeof(PLOY))//创建链表头
head->next=NULL
printf("请输入一元多项式%c:(格式:系数 指数,以0 0结束.)\n",ch)
scanf("%f %d",&x,&y)
while(x!=0)
{inpt=(PLOY *)malloc(sizeof(PLOY))//创建新链节
inpt->coef=x
inpt->expn=y
inpt->next=NULL
insert(head,inpt)//不然就查找位置并且插入新链节
scanf("%f %d",&x,&y)
}
return head
}
void addPLOY(PLOY *head,PLOY *pre)//多项式相加
{PLOY *inpt
int flag=0
while(flag==0)
{if(pre->next==NULL) flag=1//当现在指向空时跳出循环
else {pre=pre->next
inpt=(PLOY *)malloc(sizeof(PLOY))//创建新链节
inpt->coef=pre->coef
inpt->expn=pre->expn
inpt->next=NULL
insert(head,inpt)}//否则把当前“g(x)”的链节插入到“y(x)”中
}
}
void print(PLOY *fun)//输出多项式
{PLOY *printing
int flag=0
printing=fun->next//正在被打印的链节
if(fun->next==NULL)//如果函数为空打印0
{printf("0\n") return}
while(flag==0)
{if(printing->coef>0&&fun->next!=printing) printf("+")//为正数时打印“+”号
if(printing->coef==1)//如果为“1”就不用打印系数了
else if(printing->coef==-1) printf("-")//如果为“-1”就打印“-”号就行了
else printf("%f",printing->coef)//其余情况都得打印
if(printing->expn!=0) printf("x^%d",printing->expn)//如果指数为“0”不打印指数项
else if((printing->coef==1)||(printing->coef==-1)) printf("1")
if(printing->next==NULL) flag=1//如果现在的链节没有下一个就结束
else printing=printing->next
}
printf("\n")
}
void main()
{PLOY *f,*g
int sign=-1//设置标志
start()
while(sign!=0)
{scanf("%d",&sign)
switch(sign)
{case 0:break//退出
case 1:{printf("你选择的 *** 作是多项式相加:\n")
f=creat('f')//输入多项式f(x)
printf("f(x)=")
print(f)
g=creat('g')//输入多项式g(x)
printf("g(x)=")
print(g)
printf("F(x)=f(x)+g(x)=")
addPLOY(f,g)//两个多项式相加
print(f)
sign=-1//复位标志
start()//回复用户选择界面
break}
case 2:{notice()
sign=-1//复位标志
start()//回复用户选择界面
break}
default:{printf("输入有误!请重新选择 *** 作!\n")//选择错误,返回选择界面
start()break}}
}
printf("谢谢使用!\n")
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)