简单有趣的C语言贪吃蛇

简介: 越跑越快的C语言贪吃蛇,谁能拒绝在无聊的时候来一把自己的贪吃蛇呢?

  经过个人整编(.c)的源文件,可以直接在C语言的编译器运行

/*蛇越长跑得越快*/#include <stdio.h>#include <windows.h>#include <stdlib.h>#include <math.h>//#include <unistd.h>#include <conio.h>#include <string.h>#include <time.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;
}

image.gif

简单易懂,操作方便,一看就明白了

相关文章
|
1月前
|
API 定位技术 C语言
贪吃蛇---C语言---详解
贪吃蛇---C语言---详解
|
2月前
|
API 定位技术 C语言
C语言项目实战——贪吃蛇
贪吃蛇是久负盛名的游戏,它也和俄罗斯方块,扫雷等游戏位列经典游戏的行列。 在编程语言的学习中,我将以贪吃蛇为例,从设计到代码来展示一个C语言项目实战,进而再一步提升读者对C语言的理解和认知。
86 0
|
2月前
|
存储 定位技术 C语言
【c语言】简单贪吃蛇的实现
【c语言】简单贪吃蛇的实现
|
3月前
|
C语言
C语言之实现贪吃蛇小游戏篇(2)
C语言之实现贪吃蛇小游戏篇(2)
26 1
|
7月前
|
C语言 C++
【c语言】贪吃蛇
【c语言】贪吃蛇
66 0
|
1月前
|
C语言
|
1月前
|
C语言 计算机视觉
C语言贪吃蛇(有详细注释)
C语言贪吃蛇(有详细注释)
11 0
|
1月前
|
存储 定位技术 API
C语言实现贪吃蛇【完整版】
C语言实现贪吃蛇【完整版】
|
4月前
|
C语言
C语言实战演练之贪吃蛇游戏
C语言实战演练之贪吃蛇游戏
|
5月前
|
存储 定位技术 API
贪吃蛇-c语言版本
贪吃蛇-c语言版本