当前位置:首页 » 编程语言 » 蛇的c语言是什么
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

蛇的c语言是什么

发布时间: 2022-04-03 03:55:34

c语言贪吃蛇怎么让蛇自己动起来啊

死循环+Sleep可以完成这个功能的
比如说我现在定义了一个小方块,让他自动移动
int i,j;
int a[25][80]={0};
//用数组来覆盖整个运行界面
int x=10,y=0;
//定义一个x,y表示方块当前的位置
while(1)
{
//清楚之前的输出信息
system("cls");//这是调用的命令行,作用是清屏
a[x][y]=1;
//数组元素为1就表示在界面上的这个位置显示方块
//在屏幕上相应位置输出方块
for( i = 0; i<25 ; i++)
for( j=0; j<80 ;j++)
if(a[i][j]==0) printf(" ");
//等于0就表示该位置不是方块,输出一个空格
else printf("%c",2);
//否则就输出这个方块
//然后重置这个数组,这个可以和上一个循环合并在一起
for( i = 0; i<25 ; i++)
for( j=0; j<80 ;j++)
a[i][j]=0;
// 更改方块所在的位置
//向上 x=x-1;
//向下 x=x+1;
//向左 y=y-1;
//向右 y=y-1;
//上面的四句保留一句就可以了
//然后休息休息
Sleep(300);
}
基本算法就如代码所示
具体的肯定和你向做的效果不一样
比如说你要控制蛇的方向
那改变位置的时候就需要判断
而且,改变一条蛇和改变一个方块也不一样
不过总体思路是这样子的
仅作参考
注意一点,Sleep函数是window头文件里面的
需要导入window头文件
如果不是Windows系统,请替换为相应的函数

❷ 关于C语言写贪吃蛇时,蛇的身体以及移动该怎么写

只要记住一点,只有蛇头才会每次赋予新的坐标,之后的身体都是前一个节点的坐标,链表结构里应该有x,y坐标信息,我以前就是这么做的,可行

❸ C语言编写贪吃蛇怎么才能让蛇动起来呀

写成循环 while (1);
循环最后写上清空控制台的函数,好像是 clear 或clean

❹ c语言是什么啊 全是字母啊

小弟,这样说话哈,那里人啊,嘿嘿,真是对你哥不客气哈…………
C语言是一门普修课,你也是大学生?不是吧,应该每一个专业都会开的,要么最迟在大二学期有就这门课。它是一门语言类入门的课,只是自己感觉哈,我也是计科系的,学过之后就那样,大的程序不会,在交课件时也是网上搜的,高手制作的东西太多了,说几个例子哈,像小游戏“蛇吃蛋”,“礼花”那种手拿游戏机上的都可以做出来,不过现在那些游戏不是C语言编的,Java应用起来更胜一筹……C语言最强的要说是可以做一个系统,就像咱们现在最常用的Xp系统,C编的是以前的老系统,说不准那个了,总结一下,C是一门入门语言,对以后某些人可能从事儿这方面的工作时,做一个基础学科……了解一下语句,法则类的等等…………

❺ 用C语言写了贪吃的蛇可是左右显示和上下显示不一样,,求大牛解决。。。给点意见。。

前面定义的是结点和食物,然后while循环一直运行,然后,里面要是和食物的位置一样就添加,就这么简单.

while(pt->next!=NULL)
pt=pt->next ;
p->pre= pt;
pt->next = p;
p->next=NULL;
rear=p;

❻ c语言贪吃蛇源代码怎么用

C语言贪吃蛇源代码必须经过相应的C/C++编译器编译成EXE文件后才能运行。

由于我们通常使用的操作系统是Windows系统,而在该系统下最长用的C/C++编译器是VC++编译器,目前在大专院校常用的版本还是VC++6.0

下面就以VC++6.0来说明编译过程:

1.在VC++6.0中通过“File”菜单下的 “Open”子菜单打开贪吃蛇代码

/*
C/C++贪吃蛇游戏,zjlj,2015.3.16
*/
#defineDEBUG0//当程序在调试阶段时DEBUG为1
#include<iostream>
#include<windows.h>
#include<time.h>
#include<conio.h>
usingnamespacestd;
voidreadini(FILE**fphead,int*score,char*argv[])//创建或打开一个和运行文件对应的ini文件,读取最高纪录
{
charfilename[200],*pfilename;
intflag=-1,i;

strcpy(filename,argv[0]);
for(i=0;filename[i]!='';i++)
{
if('.'==filename[i])flag=1;
}

if(1==flag)
{
filename[i-1]='i';
filename[i-2]='n';
filename[i-3]='i';
}
else
{
filename[i]='.';
filename[i+1]='i';
filename[i+2]='n';
filename[i+3]='i';
filename[i+4]='';
}
for(;filename[i]!='\'&&i>=0;i--)pfilename=&filename[i];
if((*fphead=fopen(pfilename,"rb+"))==NULL)
{
if((*fphead=fopen(pfilename,"wb+"))==NULL)
{
printf("无法创建或打开"%s"文件 ",pfilename);
system("pause");
exit(0);
}
}
else
{
fread(score,sizeof(int),1,*fphead);
}
}
voidwriteini(FILE**fphead,int*score,char*argv[])//打开一个和运行文件对应的ini文件,写入最高纪录
{
charfilename[200],*pfilename;
intflag=-1,i;

strcpy(filename,argv[0]);
for(i=0;filename[i]!='';i++)
{
if('.'==filename[i])flag=1;
}

if(1==flag)
{
filename[i-1]='i';
filename[i-2]='n';
filename[i-3]='i';
}
else
{
filename[i]='.';
filename[i+1]='i';
filename[i+2]='n';
filename[i+3]='i';
filename[i+4]='';
}
for(;filename[i]!='\'&&i>=0;i--)pfilename=&filename[i];
if((*fphead=fopen(pfilename,"wb+"))==NULL)
{
printf("无法写入"%s"文件,磁盘写保护! ",pfilename);
system("pause");
exit(0);
}
else
{
rewind(*fphead);
fwrite(score,sizeof(int),1,*fphead);
fclose(*fphead);
}
}
voidgotoxy(intx,inty)//光标定位,光标定位函数SetConsoleCursorPosition是左上角位置是0,0然后向左向下延伸
{
COORDpos;
pos.X=2*y;
pos.Y=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
voidcolor(inta)//颜色函数
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}

voidRefresh(intq[][22],intgrade,intgamespeed,intlength,intscore)//输出贪吃蛇棋盘
{
inti,j;
for(i=0;i<22;i++)
{
for(j=0;j<22;j++)
{
if(q[i][j]==0)//输出棋盘空白
{
gotoxy(i,j);
color(11);
cout<<"■";
}
if(q[i][j]==1||q[i][j]==2)//输出棋盘墙壁
{
gotoxy(i,j);
color(11);
cout<<"□";
}
if(q[i][j]==3)//输出蛇头
{
gotoxy(i,j);
color(14);
cout<<"★";
}
if(q[i][j]==4)//输出蛇身
{
gotoxy(i,j);
color(12);
cout<<"◆";
}
if(q[i][j]==5)//输出果子
{
gotoxy(i,j);
color(12);
cout<<"●";
}
}
if(i==0)cout<<" ***********************";
if(i==1)cout<<" 等级为:"<<grade;//显示等级
if(i==3)cout<<" 自动前进时间";
if(i==4)cout<<" 间隔为:"<<gamespeed<<"ms";//显示时间
if(i==6)cout<<" 历史最高分为:"<<score<<"分";
if(i==7)cout<<" 你现在得分为:"<<(length+(grade-1)*8)*10<<"分";
if(i==8)cout<<" **********************";
if(i==9)cout<<" 游戏说明:";
if(i==10)cout<<" (1)用小键盘方向键控制";
if(i==11)cout<<" 蛇头运动方向;";
if(i==12)cout<<" (2)蛇每吃一个果子蛇身";
if(i==13)cout<<" 增加一节;";
if(i==14)cout<<" (3)蛇咬到自己或碰到墙";
if(i==15)cout<<" 壁游戏结束。";
if(i==18)cout<<" **********************";
if(i==19)cout<<" C/C++语言作业:";
if(i==20)cout<<" zjlj,2015.03.16";
}
}

intmain(intargc,char*argv[]){
inttcsQipan[22][22];//贪吃蛇棋盘是一个二维数组(如22*22,包括墙壁)
inti,j,score,directiontemp;
FILE*fpini;//*fpini信息文件
readini(&fpini,&score,argv);//读取ini文件的最高纪录
if(score<0)//最高成绩小于零设置为零,初建文件会是负数
score=0;
while(1)
{
for(i=1;i<=20;i++)
for(j=1;j<=20;j++)
tcsQipan[i][j]=0;//贪吃蛇棋盘相应坐标标上中间空白部分的标志0
for(i=0;i<=21;i++)
tcsQipan[0][i]=tcsQipan[21][i]=1;//贪吃蛇棋盘相应坐标标上上下墙壁的标志1
for(i=1;i<=20;i++)
tcsQipan[i][0]=tcsQipan[i][21]=2;//贪吃蛇棋盘相应坐标标上左右墙壁的标志2
inttcsZuobiao[2][500];//蛇的坐标数组
for(i=0;i<4;i++)
{
tcsZuobiao[0][i]=1;//蛇身和蛇头的x坐标
tcsZuobiao[1][i]=i+1;//蛇身和蛇头的y坐标
}
inthead=3,tail=0;//标示蛇头和蛇尾的数组偏移量
for(i=1;i<=3;i++)
tcsQipan[1][i]=4;//蛇身
tcsQipan[1][4]=3;//蛇头
intx1,y1;//随机出果子
srand(time(0));//设置随机种子
do
{
x1=rand()%20+1;
y1=rand()%20+1;
}
while(tcsQipan[x1][y1]!=0);//如果不是在空白处重新出果子
tcsQipan[x1][y1]=5;//贪吃蛇棋盘相应坐标标上果子的标志5
color(12);
cout<<" 贪吃蛇游戏即将开始!"<<endl;//准备开始
longstart,starttemp;
intgrade=1,length=4;//设置初始等级和蛇的初始长度
intgamespeed=500;//设置初始前进时间间隔
for(i=3;i>=0;i--)
{
start=clock();
while(clock()-start<=1000);
system("cls");
if(i>0)
cout<<" 进入倒计时:"<<i<<endl;//倒计时显示
else
Refresh(tcsQipan,grade,gamespeed,length,score);//初始棋盘显示
}
inttimeover=1,otherkey=1;//初始化超时时间和按键判断参数
chardirection=77;//设置初始情况下,向右运动
intx=tcsZuobiao[0][head],y=tcsZuobiao[1][head];//保存蛇头坐标到x,y变量
while(1)//运行一局游戏
{
start=clock();
while((timeover=((starttemp=clock())-start<=gamespeed))&&!kbhit());//如果有键按下或时间超过自动前进时间间隔则终止循环
if(direction==72||direction==80||direction==75||direction==77)
directiontemp=direction;//保留上一次方向按键
//starttemp=gamespeed+start-starttemp;//保留停留时间
if(timeover)
{
#if(DEBUG==1)
direction=getch();//调试代码
#else
if((direction=getch())==-32)
direction=getch();
#endif
}
#if(DEBUG==1)//调试代码
start=clock();
while(clock()-start<=2000);
gotoxy(24,4);
cout<<" 按键ASCII代码"<<(int)direction<<""<<endl;
#endif
if(!(direction==72||direction==80||direction==75||direction==77))
{
otherkey=0;//按键非方向键,otherkey设置为0
}
else
{
otherkey=1;//按键为方向键,otherkey设置为1
}
if(direction==72&&directiontemp==80)//忽略反方向按键
{
direction=32;
otherkey=0;
//start=clock();
//while(clock()-start<=starttemp);
}
elseif(direction==80&&directiontemp==72)
{
direction=32;//设置按键为非方向键
otherkey=0;//按键为非方向键,otherkey设置为0
//start=clock();
//while(clock()-start<=starttemp);//补偿等待时间
}
elseif(direction==75&&directiontemp==77)
{
direction=32;
otherkey=0;
//start=clock();
//while(clock()-start<=starttemp);
}
elseif(direction==77&&directiontemp==75)
{
direction=32;
otherkey=0;
//start=clock();
//while(clock()-start<=starttemp);
}


switch(direction)//判断方向键
{
case72:x=tcsZuobiao[0][head]-1;y=tcsZuobiao[1][head];break;//向上
case80:x=tcsZuobiao[0][head]+1;y=tcsZuobiao[1][head];break;//向下
case75:x=tcsZuobiao[0][head];y=tcsZuobiao[1][head]-1;break;//向左
case77:x=tcsZuobiao[0][head];y=tcsZuobiao[1][head]+1;break;//向右
default:break;
}


if(x==0||x==21||y==0||y==21)//蛇头碰到墙壁,结束本局游戏
{
gotoxy(22,12);
cout<<" 游戏已结束!"<<endl;
if(score>=(length+(grade-1)*8)*10)//判断是否破记录
{
gotoxy(10,7);
color(12);
cout<<"闯关失败加油耶!"<<endl;
fclose(fpini);//关闭ini文件
}
else
{
gotoxy(10,7);
color(12);
cout<<"恭喜您打破记录"<<endl;
score=(length+(grade-1)*8)*10;
writeini(&fpini,&score,argv);//写入ini文件的最高纪录
}
gotoxy(23,12);
cout<<"按回车键重新开始,按ESC退出游戏"<<endl;//显示的提示
break;//退出该局游戏
}
if(tcsQipan[x][y]!=0&&!(x==x1&&y==y1)&&tcsQipan[x][y]!=3)//蛇头碰到蛇身,结束本局游戏
{
gotoxy(22,12);
cout<<" 游戏已结束!"<<endl;
if(score>=(length+(grade-1)*8)*10)//判断是否破记录
{
gotoxy(10,7);
color(12);
cout<<"闯关失败加油耶!"<<endl;
fclose(fpini);//关闭ini文件
}
else
{
gotoxy(10,7);
color(12);
cout<<"恭喜您打破记录"<<endl;
score=(length+(grade-1)*8)*10;
writeini(&fpini,&score,argv);//写入ini文件的最高纪录
}
gotoxy(23,12);
cout<<"按回车键重新开始,按ESC退出游戏"<<endl;//显示的提示
break;//退出该局游戏
}
/*
游戏运行时的核心算法开始
*/
if(x==x1&&y==y1)//吃果子,长度加1
{
length++;
if(length>=8)//长度大于等于8重新计算长度,等级加1
{
length-=8;//重新计算长度
grade++;//等级加1
if(gamespeed>50)//控制最快速度为50
gamespeed=550-grade*50;//改变自动前进时间间隔
}
tcsQipan[x][y]=3;//贪吃蛇棋盘相应坐标现在蛇头标志改为蛇头标志3
tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]=4;//贪吃蛇棋盘相应坐标原来蛇头标志改为蛇身标志4
head=(head+1)%400;//防止数组越界
tcsZuobiao[0][head]=x;//蛇头的x坐标
tcsZuobiao[1][head]=y;//蛇头的y坐标
do//随机出果子
{
x1=rand()%20+1;
y1=rand()%20+1;
}
while(tcsQipan[x1][y1]!=0);//如果不是在空白处重新出果子
tcsQipan[x1][y1]=5;//贪吃蛇棋盘相应坐标标上果子的标志5
gotoxy(22,12);
cout<<" 游戏进行中!"<<endl;
Refresh(tcsQipan,grade,gamespeed,length,score);
}
else//不吃果子
{
if(otherkey)
{
tcsQipan[tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=0;
tail=(tail+1)%400;//防止数组越界
tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]=4;
head=(head+1)%400;//防止数组越界
tcsZuobiao[0][head]=x;//蛇头的x坐标
tcsZuobiao[1][head]=y;//蛇头的y坐标
tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]=3;
gotoxy(22,12);
cout<<" 游戏进行中!"<<endl;
Refresh(tcsQipan,grade,gamespeed,length,score);
}
else
{
gotoxy(22,12);
cout<<" 游戏暂停中!"<<endl;
}
}
/*
游戏运行时的核心算法结束
*/
}
while(1)
{
while(!kbhit());
if((direction=getch())==13)//按回车键开始下一局
break;
if(direction==27)//按ESC退出游戏
exit(0);
}
system("cls");//清除屏幕重新开始
}
return0;
}

❼ c语言简易版贪吃蛇怎么写用一个方块形状代表蛇的一个关节(如:printf("%c",4)是一个方块图样)

达到你说的要求,可以使用kbhit()函数,上网络搜一下它的用法,这个函数可以检测到游戏中是否有按键被按下,如果没有就使用一个死循环使蛇身一直移动,如果检测到了有按键被按下,就判断是否是方向键或者程序中设置的其他功能键(如ESC退出键,调速键等),如果不是,不做响应,如果是,就就bioskey()函数接收这个键,并根据这个键值做出相应的响应!
写游戏要注意模块化,你这样全写在main里很乱的。
使用数组解决贪吃蛇的问题有点挠头,最好是自己构造一个合适的数据类型。
还有就是学习一下<graphics.h>这个头文件,只需要里面的几个函数就可以设计贪吃蛇的图形界面。
给你个现成的贪吃蛇游戏,代码不长,仔细看一下里面的数据结构和算法思想。

/* 贪吃蛇游戏 */

#define N 200
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;/*得分*/
int gamespeed=50000;/*游戏速度自己调整*/
struct Food
{
int x;/*食物的横坐标*/
int y;/*食物的纵坐标*/
int yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的节数*/
int direction;/*蛇移动方向*/
int life;/* 蛇的生命,0活着,1死亡*/
}snake;
void Init(void);/*图形驱动*/
void Close(void);/*图形结束*/
void DrawK(void);/*开始画面*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
/*主函数*/
void main(void)
{
Init();/*图形驱动*/
DrawK();/*开始画面*/
GamePlay();/*玩游戏具体过程*/
Close();/*图形结束*/
}
/*图形驱动*/
void Init(void)
{
int gd=DETECT,gm;
/* initgraph(&gd,&gm,"c:\\tc"); */
initgraph(&gd,&gm,"c:\\JMSOFT\\DRV");
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
for(i=50;i<=600;i+=10)/*画围墙*/
{
rectangle(i,40,i+10,49); /*上边*/
rectangle(i,451,i+10,460);/*下边*/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10); /*左边*/
rectangle(601,i,610,i+10);/*右边*/
}
}
/*玩游戏具体过程*/
void GamePlay(void)
{
randomize();/*随机数发生器*/
food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.life=0;/*活着*/
snake.direction=1;/*方向往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇头*/
snake.x[1]=110;snake.y[1]=100;
snake.node=2;/*节数*/
PrScore();/*输出得分*/
while(1)/*可以重复玩游戏,压ESC键结束*/
{
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
{
if(food.yes==1)/*需要出现新食物*/
{
food.x=rand()%400+60;
food.y=rand()%350+60;
while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;/*画面上有食物了*/
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);
}

for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
switch(snake.direction)
{
case 1:snake.x[0]+=10;break;
case 2: snake.x[0]-=10;break;
case 3: snake.y[0]-=10;break;
case 4: snake.y[0]+=10;break;
}
for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();/*显示失败*/
snake.life=1;
break;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到墙壁*/
{
GameOver();/*本次游戏结束*/
snake.life=1; /*蛇死*/
break;
}
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
{
setcolor(0);/*把画面上的食物东西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
snake.node++;/*蛇的身体长一节*/
food.yes=1;/*画面上需要出现新的食物*/
score+=10;
PrScore();/*输出新得分*/
}
setcolor(4);/*画出蛇*/
for(i=0;i<snake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
snake.y[i]-10);
delay(gamespeed);
setcolor(0);/*用黑色去除蛇的的最后一节*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
} /*endwhile(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循环*/
break;
key=bioskey(0);/*接收按键*/
if(key==ESC)/*按ESC键退出*/
break;
else
if(key==UP&&snake.direction!=4)
/*判断是否往相反的方向移动*/
snake.direction=3;
else
if(key==RIGHT&&snake.direction!=2)
snake.direction=1;
else
if(key==LEFT&&snake.direction!=1)
snake.direction=2;
else
if(key==DOWN&&snake.direction!=3)
snake.direction=4;
}/*endwhile(1)*/
}
/*游戏结束*/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
/*输出成绩*/
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
/*图形结束*/
void Close(void)
{
getch();
closegraph();
}
这个程序有只有一个地方需要改,就是initgraph(&gd,&gm,"c:\\JMSOFT\\DRV");
这句代码中的第三个参数是 bgi文件的路径,你按下键盘上的alt + f 搜索一下 *.bgi在哪个目录下,把那个路径复制到这个地方就可以了直接运行了,不然可能提示你 初始化错误!。

❽ C语言贪吃蛇

用蛇头的坐标分别与蛇身的坐标一一比较,看是否相等,相等就吃到自己的身体了;
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的节数*/
int dir;/*蛇移动方向*/
int life;/*标志是死是活*/
}snake;
在这里里面定义存储蛇结点的X Y,
应该能明白了 !!!

❾ C语言编的贪吃蛇, W控制蛇往上走的这段看不懂啊 有哪位大神能解答一下

嘻嘻,大作业做完了吗