贪吃蛇 c语言实现

//程序在运行时还有一些错误没有找出,在左右碰壁时会过一个才结束游戏

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char Map[8][16];//游戏地图
int H=8,L=16;//地图的高和长
void MapInitial();//地图的初始化
void CreteFood();//随机产生食物
void getDirection();//读取方向
void Smove();//蛇的移动
void Move();//蛇头,蛇尾移动 (包含在Smove里面)
void Show();//刷新显示地图
void GameOver();//判断是否撞墙,游戏是否结束
int Slength=2;//蛇的长度
int dx[4]={-1,1,0,0};//-1表示向上移动,1表示向下移动(用于蛇头的移动)
int dy[4]={0,0,-1,1};//-1表示向左运动,1表示向右运动
int over=0;
const char Shead=‘@‘;//蛇头
const char Stail=‘*‘;//蛇尾
const char food=‘$‘; //食物

struct {
int x;
int y;//x,y用来确定蛇的某个部位的位置
int direction;//分别用1,2,3,4表示上下左右,刻画蛇头移动的方向
}Snake[8*16];//蛇的每个位置的信息 。Snake[0]表示蛇头

int main(void)
{

MapInitial();
while(1)
{
Smove();

if(over==1)
{
printf("游戏结束\n");
return 0;

}
}

}

void MapInitial()
{

int i=0,j=0;

for(i=0;i<H;i++)
for(j=0;j<L;j++)
Map[i][j]=‘.‘;//Map内存用‘.‘填充

int x=0,y=0;
srand(time(0));
h:
x=rand()%H; //x表示行,y表示列
y=rand()%L;
if(x<H-1)
{
Map[x][y]=Shead;//第一次随机产生蛇头
Map[x+1][y]=Stail;//!!蛇出生时带个小尾巴
}
else
goto h;
Snake[0].x=x;
Snake[0].y=y;
Snake[1].x=x+1;
Snake[1].y=y;

CreteFood();

for(i=0;i<H;i++)
{for(j=0;j<L;j++)
printf("%c",Map[i][j]);
printf("\n");}

getch();//得到第一个方向使其移动,Smove中的按键改变方向

}

void CreteFood()
{
int x,y;
here: //srand()函数为rand函数提供种子,使得rand()函数产生的随机数发生变化
srand(time(0)); //time(0)返回当前时间的秒数%60
x=rand()%H;
y=rand()%L;
if(Map[x][y]==‘.‘)
Map[x][y]=‘$‘;
else
goto here;
}

void getDirection()
{
char key;//读取方向

_sleep(500);//蛇头移动后要停顿,因为玩家在看到蛇到达某一位置时要有按下按钮的时间,以使玩家按下按钮后再下一个坐标处就改变位置
//否则可能玩家在某一处按下按钮,但电脑则已运行至下一次,使得蛇只能在下下次转弯
//!!而停顿的位置应该在电脑读取按键之前,这时候玩家在停顿时间做出的操作才能第一时间在本回合中得到体现!!

if (kbhit()!=0)
{

while(kbhit() != 0)
key=getch();

switch(key)
{

case 72: Snake[0].direction = 0;//上
break;

case 80: Snake[0].direction = 1; //下
break;

case 75: Snake[0].direction = 2; //左
break;

case 77: Snake[0].direction = 3;//右
break;

}

}
}

void Smove()
{
getDirection();//得到按键,没有按键则朝着一个方向移动,有的话则转弯
Move();//蛇头,蛇尾分别移动
Show();//刷新地图

}

void Move()
{
int sum=Slength;//当前蛇的长度

int x=Snake[0].x+dx[Snake[0].direction];
int y=Snake[0].y+dy[Snake[0].direction];

int p=Snake[0].x;
int q=Snake[0].y;//p,q表示蛇头移动前的位置

if(Map[x][y]==‘.‘)
{
Map[Snake[0].x][Snake[0].y]=‘.‘;
Map[x][y]=‘@‘;
}//没吃到食物,继续移动

else if(Map[x][y]==‘$‘)
{
Map[Snake[0].x][Snake[0].y]=‘*‘;
Map[x][y]=‘@‘;
Snake[Slength].x=p;
Snake[Slength].y=q;//新增的蛇长为原来蛇头部分
CreteFood();
Slength++;
}//吃到食物,原来的地方变为蛇尾,产生新食物,蛇长增加
else
{
over=1;//蛇自身相撞游戏结束
printf("游戏结束");
return 0;
}

GameOver();

Snake[0].x=x;
Snake[0].y=y;//移动后蛇头的位置

///////////////////////////////////////////////////////// 以上为蛇头的移动及蛇头吃到食物时长度加1
///////////////////////////////////////////////////////// (原本的食物变为蛇头,原本的蛇头变为蛇尾)

int i;
if(sum==Slength) //当没有吃到食物时蛇身的移动。
{

for(i=1;i<Slength;i++)
{
if(i==1)
Map[Snake[i].x][Snake[i].y]=‘.‘;//把一个置空,使移动后的总长度不变
if(i == Slength-1)
{
Snake[i].x = p;
Snake[i].y = q;

}
else
{
Snake[i].x = Snake[i+1].x;
Snake[i].y = Snake[i+1].y;//i+1是i前面的部分

}

Map[ Snake[i].x ][ Snake[i].y ] = ‘*‘;
}//for
}//if

}

void Show()
{

system("cls");
int i=0,j=0;

for(i = 0; i < H; i++)
{
for(j = 0; j < L; j++)
printf("%c",Map[i][j]);
printf("\n");
}

}

void GameOver()
{
if(Snake[0].x<0||Snake[0].x>=H||Snake[0].y<0||Snake[0].y>=L)
over=1;
}

时间: 2024-10-12 14:06:00

贪吃蛇 c语言实现的相关文章

贪吃蛇C语言代码

贪吃蛇C语言代码 贪吃蛇C语言代码 手动贪吃蛇 智能贪吃蛇 1.手动贪吃蛇 /*蛇越长跑得越快*/ /*作者:SGAFPZ*/ #include <stdio.h> #include <windows.h> #include <stdlib.h> #include <math.h> //#include <unistd.h> #include <conio.h> #include <string.h> #include &

贪吃蛇C语言实现

/*     /*   头尾平移的方法实现   By black4yl   原理:   在大小为100的数组中,利用head,rear标记的头,尾坐标值,定位当前头和尾巴.   在行走时,擦去尾巴,按方向标记新头,擦去旧头, 实现蛇行走.   当吃到食物时,只变化头,不变化 */ #include"windows.h" #include"conio.h" #include"iostream" #include<time.h> usin

C语言学习必须拥有学习路线,不然你就只会写贪吃蛇

C语言学习必须拥有学习路线,不然你就只会写贪吃蛇这些天一直有人问我,c语言好学吗?我是个新手,该如何学习? 其实,这类问题困扰着很多新手.在如何学习之前,我们想简单的了解一下什么是C语言: C语言是一种计算机程序设计语言.它既有高级语言的特点,又具有汇编语言的特点.它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序.创一个小群,供大家学习交流聊天如果有对学C++方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望

俄罗斯方块和贪吃蛇游戏软件:C语言应用初始感受

C语言课程设以一节课,老师提供了一个C语言的飞俄罗斯方块让我们感受,我们所学的C语言课程,主要是各种语句的练习,这次是用我们所学过的知识来感受一个实际的系统. 首先安装c-free,然后是将代码贴进去运行 界面虽然有点简单,但这确实使用C语言做出来的游戏. 分析一下程序,感觉没有太复杂的,就是上学期学习的简单语句的组合,但是用的非常好.首先看看用到了几种语句: 1.首先是在屏幕上显示的语句printf, 2.另外一个就是多条件判断switch--case 应用方法 switch(tetris->

C语言实现贪吃蛇之结构链表篇

之前的两篇博客将运用的C语言知识限定在了一般的数组上,但如果已经完整地了解过C语言的话,运用结构和链表会让程序的结构更明了,逻辑更清晰.这篇博客就将介绍如何用结构和链表改善之前的程序. 首先,我们为蛇的节点定义一个结构: typedef struct node{ COORD cor; struct node *next; }node; COORD结构我在上一篇已经介绍过,这里就直接借用了. COORD food = { 3,5 }; node *head; food也相应地由COORD来定义,并

小项目特供 贪吃蛇游戏(基于C语言)

C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第二天写了第二版和第三版. 相信C语言写个小游戏或小项目是大多数计算机相关专业的学生都做的事情,但是作为一个数学专业的学生,我们教研室的老师对C语言的要求也就比较低了,大一没有让我们做个小项目实践一次.至今为止用C/C++做过的三个小项目(大作业),一个是外校同学让我帮忙写的学生信息管理系统(天呐,这

C语言小游戏开发之贪吃蛇

寒假期间一时兴起,想着用C语言能开发出贪吃蛇小游戏应该是一件不错的事!但C语言学习过程中从来都是字符界面的编程,如何能有"图形化"的效果呢?于是小编就在度娘, 谷歌等网站搜索了一番,发现了一些有用的Win32 API函数,于是小编的心一下子激动了起来,有了这些API函数也许能够实现哟!开始吧! 编程之前小编的构思是这样的,贪吃蛇小游戏应该实现的有: 1.贪吃蛇在不进行控制的条件下应该能够自主前进. 2.玩家可以通过WASD键来控制贪吃蛇的前进方向. 3.运行过程中若贪吃蛇撞击到墙壁或自

C语言实现贪吃蛇之全靠数组篇

贪吃蛇游戏的设计思路很简单,相信有过一些编程经验的同学都不至于束手无策,可在我刚刚接触编程时,这个小小的贪吃蛇游戏可是让我费了不少脑筋,如今学习编程已经快一年了,前几天又看了一遍K&R,打算写几个贪吃蛇程序巩固一下知识.我打算写若干篇贪吃蛇的博客,从简单粗糙的开始,不断改良,希望能给初学C语言的同学一点借鉴. 话不多说,我们现在就开始吧,首先我们整理一下思路.首先我们要明确,既然贪吃蛇游戏理论上可以无限继续下去,那么游戏主体一定就是一个循环.蛇的移动就在这个循环中完成.如果是初学编程的话,可能会

C语言之贪吃蛇(curses库函数)

上大学学习编程的初始目的就是冲着游戏来的~不过在刚学习C语言的时候,完全无法利用所学知识弄出一个可玩的游戏╮(╯_╰)╭,学了1年后仍然对最简单的贪吃蛇没有思路(当然不是说没有打代码的思路,而是没有办法弄出动态的东西,而且当时往算法那走了~),直到如今大二,利用寒假的一点时间入门Linux的时候,发现了curses库函数!当我看明白它的作用时,拍案而起,TM这玩意不就是我梦寐以求的可实现界面的东东么!当我学了一点点就觉悟到,用一个move()和printw()函数就完全可以把贪吃蛇这种级别的写出