经过个人整编(.c)的源文件,可以直接在C语言的编译器运行
/*蛇越长跑得越快*///#include <unistd.h>voidfood(); voidshow(); voidmove(); voidturn(); voidcheck(); voidini(); voidcalculate(); intmovable[4] = { 0, 1, 1, 0 }; //数组的下标表示方向,0123分别表示上下左右,下同intdistance[4] = { 9999, 9999, 9999, 9999 }; intdy[4] = { 0, 1, 0, -1 }; intdx[4] = { -1, 0, 1, 0 }; intsum=5; //蛇总长度intover=0; intspeed; intfoodx, foody; //食物的坐标charmap[17][17]; structsnake { intx, y; //身体坐标 intdir; //方向(只有蛇头的方向是有用的) } A[100]; voidini() { //初始化界面speed=500; over=0; sum=5; movable[0] =0; movable[1] =1; movable[2] =1; movable[3] =0; distance[0] =9999; distance[1] =9999; distance[2] =9999; distance[3] =9999; inti, j; for (i=0; i<100; i++) { //初始化蛇头和蛇身的数据A[i].dir=0; A[i].x=0; A[i].y=0; } A[0].x=1; A[0].y=1; //地图左上角设置一条长度为5的蛇A[1].x=1; A[1].y=2; A[2].x=1; A[2].y=3; A[3].x=1; A[3].y=4; A[4].x=1; A[4].y=5; A[4].dir=1; srand(time(0)); for (i=0; i<17; i++) { //设置地图for (j=0; j<17; j++) { map[i][j] ='*'; } } for (i=1; i<16; i++) { for (j=1; j<16; j++) { map[i][j] =' '; } } map[6][5] ='*'; map[6][6] ='*'; map[6][7] ='*'; map[7][5] ='*'; map[7][7] ='*'; map[A[4].x][A[4].y] ='H'; //设置蛇头for (i=0; i<sum-1; i++) { //设置蛇身map[A[i].x][A[i].y] ='X'; } food(); //calculate();} voidshow() { //显示界面 inti, j, x, y; for (i=0; i<17; i++) { //显示界面for (j=0; j<17; j++) { printf("%c", map[i][j]); } printf("\n"); } while (1) { Sleep(speed); //界面刷新速度turn(); move(); if (over) { //设置蛇死掉后可以进行的操作 while (1) { charch=_getch(); if (ch==113) { //输入‘q’结束 return; } elseif (ch==114) { //输入‘r’重新开始 ini(); break; } } } system("cls"); //清屏 for (i=0; i<17; i++) { //重新显示界面for (j=0; j<17; j++) { printf("%c", map[i][j]); } printf("\n"); } calculate(); //计算并记录蛇头与食物距离 } } voidfood() { //生成食物intx, y; while (1) { x= (int)(15*rand() / (RAND_MAX+1.0)); //随机产生一组食物坐标y= (int)(15*rand() / (RAND_MAX+1.0)); if (map[x][y] ==' ') { //如果是空格则在该处生成食物map[x][y] ='O'; foodx=x; //记录食物坐标 foody=y; break; } } } voidmove() { //蛇移动inti, x, y; intt=sum; //t记录当前蛇总长度 check(); //移动前检查按当前方向移动一步后的情况if (t==sum) { //没有吃到苹果for (i=0; i<sum-1; i++) { if (i==0) { //蛇尾坐标处变成空格,把蛇尾坐标变成前一个蛇身的坐标 map[A[i].x][A[i].y] =' '; A[i].x=A[i+1].x; A[i].y=A[i+1].y; } else { //每个蛇身坐标都变为它前一个蛇身的坐标A[i].x=A[i+1].x; A[i].y=A[i+1].y; } map[A[i].x][A[i].y] ='X'; //把地图上蛇身坐标处的字符设置成‘X’ } A[sum-1].x=A[sum-1].x+dx[A[sum-1].dir]; //蛇头按当前方向移动一格 A[sum-1].y=A[sum-1].y+dy[A[sum-1].dir]; map[A[sum-1].x][A[sum-1].y] ='H'; //把地图上蛇头坐标处的字符设置成‘H’ } else { //吃到苹果(sum会加1)map[A[sum-2].x][A[sum-2].y] ='X'; //把地图上原蛇头坐标处的字符设置成‘X’A[sum-1].x=A[sum-2].x+dx[A[sum-2].dir]; //新蛇头的坐标是原蛇头沿当前方向移动一格后的坐标 A[sum-1].y=A[sum-2].y+dy[A[sum-2].dir]; A[sum-1].dir=A[sum-2].dir; //新蛇头方向为原蛇头的方向map[A[sum-1].x][A[sum-1].y] ='H'; //把地图上蛇头坐标处的字符设置成‘H’food(); } for(i=0; i<4; i++) { //记录下能走的方向x=A[sum-1].x+dx[i]; y=A[sum-1].y+dy[i]; if(map[x][y] ==' '||map[x][y] =='O') { movable[i] =1; //能走就把对应方向的值设置为1 } else { if(x!=A[0].x||y!=A[0].y) { movable[i] =0; //不能走就把对应方向的值设置为0 } else { movable[i] =1; } } } } voidcheck() { //检查是否死亡或者吃到食物intx, y, i, j; x=A[sum-1].x+dx[A[sum-1].dir]; //记录按当前方向移动一格后蛇头的坐标 y=A[sum-1].y+dy[A[sum-1].dir]; if (map[x][y] =='*'||map[x][y] =='X') { //如果地图上该坐标处字符为‘*’或‘X’就死亡 if (x!=A[0].x||y!=A[0].y) { //蛇尾除外 map[8][4] ='G'; map[8][5] ='A'; map[8][6] ='M'; map[8][7] ='E'; //输出“GAME OVER” map[8][9] ='O'; map[8][10] ='V'; map[8][11] ='E'; map[8][12] ='R'; map[8][8] =' '; system("cls"); for (i=0; i<17; i++) { for (j=0; j<17; j++) { printf("%c", map[i][j]); } printf("\n"); } printf("Input 'r' to restart\nInput 'q' to quit\n"); over=1; } } elseif (map[x][y] =='O') { //吃到苹果 sum++; //蛇身总长加1 speed= ((600-sum*20) >100) ? (600-sum*20) : 100; //速度加快 } } voidturn() { //转弯if (_kbhit()) { chardir=_getch(); //读取输入的键 switch (dir) { //改变方向 case119: A[sum-1].dir= (A[sum-1].dir==2) ?2 : 0; break; case100: A[sum-1].dir= (A[sum-1].dir==3) ?3 : 1; break; case115: A[sum-1].dir= (A[sum-1].dir==0) ?0 : 2; break; case97: A[sum-1].dir= (A[sum-1].dir==1) ?1 : 3; break; } } } voidcalculate() { //计算并记录蛇头与食物距离inti=0, x, y; for(i=0; i<4; i++) { if(movable[i] ==1) { //如果该方向能走,则记录下沿该方向走一步后与食物的距离x=A[sum-1].x+dx[i]; y=A[sum-1].y+dy[i]; distance[i] =abs(foodx-x)+abs(foody-y); } else { //如果不能走则把距离设置为9999distance[i] =9999; } } } intmain() { printf("'w''s''a''d'控制上下左右\n蛇越长跑得越快~~~\n"); printf("按任意键开始\n"); charch=_getch(); system("cls"); ini(); show(); return0; }
简单易懂,操作方便,一看就明白了