当前位置:首页 > 代码 > 正文

贪吃蛇c语言代码(贪吃蛇C语言程序)

admin 发布:2022-12-20 00:36 132


本篇文章给大家谈谈贪吃蛇c语言代码,以及贪吃蛇C语言程序对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

贪吃蛇游戏的C语言编程

#include windows.h

#include ctime

#include iostream

#include vector

#include queue

using namespace std;

#ifndef SNAKE_H

#define SNAKE_H

class Cmp

{

friend class Csnake;

int rSign; //横坐标

int lSign; //竖坐标

public:

// friend bool isDead(const Cmp cmp);

Cmp(int r,int l){setPoint(r,l);}

Cmp(){}

void setPoint(int r,int l){rSign=r;lSign=l;}

Cmp operator-(const Cmp m)const

{

return Cmp(rSign-m.rSign,lSign-m.lSign);

}

Cmp operator+(const Cmp m)const

{

return Cmp(rSign+m.rSign,lSign+m.lSign);

}

};

const int maxSize = 5; //初始蛇身长度

class Csnake

{

Cmp firstSign; //蛇头坐标

Cmp secondSign;//蛇颈坐标

Cmp lastSign; //蛇尾坐标

Cmp nextSign; //预备蛇头

int row; //列数

int line; //行数

int count; //蛇身长度

vectorvectorchar snakeMap;//整个游戏界面

queueCmp snakeBody; //蛇身

public:

int GetDirections()const;

char getSymbol(const Cmp c)const

//获取指定坐标点上的字符

{

return snakeMap[c.lSign][c.rSign];

}

Csnake(int n)

//初始化游戏界面大小

{

if(n20)line=20+2;

else if(n30)line=30+2;

else line=n+2;

row=line*3+2;

}

bool isDead(const Cmp cmp)

{

return ( getSymbol(cmp)=='@' || cmp.rSign == row-1

|| cmp.rSign== 0 || cmp.lSign == line-1 ||

cmp.lSign == 0 );

}

void InitInstance(); //初始化游戏界面

bool UpdataGame(); //更新游戏界面

void ShowGame(); //显示游戏界面

};

#endif // SNAKE_H

using namespace std;

//测试成功

void Csnake::InitInstance()

{

snakeMap.resize(line); // snakeMap[竖坐标][横坐标]

for(int i=0;iline;i++)

{

snakeMap[i].resize(row);

for(int j=0;jrow;j++)

{

snakeMap[i][j]=' ';

}

}

for(int m=1;mmaxSize+1;m++)

{

//初始蛇身

snakeMap[line/2][m]='@';

//将蛇身坐标压入队列

snakeBody.push(Cmp(m,(line/2)));

//snakeBody[横坐标][竖坐标]

}

//链表头尾

firstSign=snakeBody.back();

secondSign.setPoint(maxSize-1,line/2);

}

//测试成功

int Csnake::GetDirections()const

{

if(GetKeyState(VK_UP)0) return 1; //1表示按下上键

if(GetKeyState(VK_DOWN)0) return 2; //2表示按下下键

if(GetKeyState(VK_LEFT)0) return 3; //3表示按下左键

if(GetKeyState(VK_RIGHT)0)return 4; //4表示按下右键

return 0;

}

bool Csnake::UpdataGame()

{

//-----------------------------------------------

//初始化得分0

static int score=0;

//获取用户按键信息

int choice;

choice=GetDirections();

cout"Total score: "scoreendl;

//随机产生食物所在坐标

int r,l;

//开始初始已经吃食,产生一个食物

static bool eatFood=true;

//如果吃了一个,才再出现第2个食物

if(eatFood)

{

do

{

//坐标范围限制在(1,1)到(line-2,row-2)对点矩型之间

srand(time(0));

r=(rand()%(row-2))+1; //横坐标

l=(rand()%(line-2))+1;//竖坐标

//如果随机产生的坐标不是蛇身,则可行

//否则重新产生坐标

if(snakeMap[l][r]!='@')

{snakeMap[l][r]='*';}

}while (snakeMap[l][r]=='@');

}

switch (choice)

{

case 1://向上

//如果蛇头和社颈的横坐标不相同,执行下面操作

if(firstSign.rSign!=secondSign.rSign)nextSign.setPoint(firstSign.rSign,firstSign.lSign-1);

//否则,如下在原本方向上继续移动

else nextSign=firstSign+(firstSign-secondSign);

break;

case 2://向下

if(firstSign.rSign!=secondSign.rSign)nextSign.setPoint(firstSign.rSign,firstSign.lSign+1);

else nextSign=firstSign+(firstSign-secondSign);

break;

case 3://向左

if(firstSign.lSign!=secondSign.lSign)nextSign.setPoint(firstSign.rSign-1,firstSign.lSign);

else nextSign=firstSign+(firstSign-secondSign);

break;

case 4://向右

if(firstSign.lSign!=secondSign.lSign)nextSign.setPoint(firstSign.rSign+1,firstSign.lSign);

else nextSign=firstSign+(firstSign-secondSign);

break;

default:

nextSign=firstSign+(firstSign-secondSign);

}

//----------------------------------------------------------

if(getSymbol(nextSign)!='*' !isDead(nextSign))

//如果没有碰到食物(且没有死亡的情况下),删除蛇尾,压入新的蛇头

{

//删除蛇尾

lastSign=snakeBody.front();

snakeMap[lastSign.lSign][lastSign.rSign]=' ';

snakeBody.pop();

//更新蛇头

secondSign=firstSign;

//压入蛇头

snakeBody.push(nextSign);

firstSign=snakeBody.back();

snakeMap[firstSign.lSign][firstSign.rSign]='@';

//没有吃食

eatFood=false;

return true;

}

//-----吃食-----

else if(getSymbol(nextSign)=='*' !isDead(nextSign))

{

secondSign=firstSign;

snakeMap[nextSign.lSign][nextSign.rSign]='@';

//只压入蛇头

snakeBody.push(nextSign);

firstSign=snakeBody.back();

eatFood=true;

//加分

score+=20;

return true;

}

//-----死亡-----

else {cout"Dead"endl;cout"Your last total score is "scoreendl; return false;}

}

void Csnake::ShowGame()

{

for(int i=0;iline;i++)

{

for(int j=0;jrow;j++)

coutsnakeMap[i][j];

coutendl;

}

Sleep(1);

system("cls");

}

int main()

{

Csnake s(20);

s.InitInstance();

//s.ShowGame();

int noDead;

do

{

s.ShowGame();

noDead=s.UpdataGame();

}while (noDead);

system("pause");

return 0;

}

这个代码可以运行的,记得给分啦

求 贪吃蛇C语言代码

#include windows.h

#include stdlib.h

#include time.h

#include stdio.h

#include string.h

#include conio.h

#define N 21

int apple[3],num;

char score[3];

char tail[3];

void gotoxy(int x, int y) //输出坐标

{

COORD pos;

pos.X = x;

pos.Y = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);

}

void color(int b) //颜色函数

{

HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;

SetConsoleTextAttribute(hConsole,b) ;

}

int Block(char head[2]) //判断出界

{

if ((head[0] 1) || (head[0] N) || (head[1] 1) || (head[1] N))

return 1;

return 0;

}

int Eat(char snake[2]) //吃了苹果

{

if ((snake[0] == apple[0]) (snake[1] == apple[1]))

{

apple[0] = apple[1] = apple[2] = 0;

gotoxy(N+44,10);

color(13);

printf("%d",score[0]*10);

color(11);

return 1;

}

return 0;

}

void Draw(char **snake, int len) //蛇移动

{

if (apple[2])

{

gotoxy(apple[1] * 2, apple[0]);

color(12);

printf("●");

color(11);

}

gotoxy(tail[1] * 2, tail[0]);

if (tail[2])

{

color(num);

printf("★");

color(num);

}

else

printf("■");

gotoxy(snake[0][1] * 2, snake[0][0]);

color(num);

printf("★");

color(num);

putchar('\n');

}

char** Move(char **snake, char dirx, int *len) //控制方向

{

int i, full = Eat(snake[0]);

memcpy(tail, snake[(*len)-1], 2);

for (i = (*len) - 1; i 0; --i)

memcpy(snake[i], snake[i-1], 2);

switch (dirx)

{

case 'w': case 'W': --snake[0][0]; break;

case 's': case 'S': ++snake[0][0]; break;

case 'a': case 'A': --snake[0][1]; break;

case 'd': case 'D': ++snake[0][1]; break;

default: ;

}

if (full)

{

snake = (char **)realloc(snake, sizeof(char *) * ((*len) + 1));

snake[(*len)] = (char *)malloc(sizeof(char) * 2);

memcpy(snake[(*len)], tail, 2);

++(*len);

++score[0];

if(score[3] 16)

++score[3];

tail[2] = 1;

}

else

tail[2] = 0;

return snake;

}

void init(char plate[N+2][N+2], char ***snake_x, int *len) //初始化

{

int i, j;

char **snake = NULL;

*len = 3;

score[0] = score[3] =3;

snake = (char **)realloc(snake, sizeof(char *) * (*len));

for (i = 0; i *len; ++i)

snake[i] = (char *)malloc(sizeof(char) * 2);

for (i = 0; i 3; ++i)

{

snake[i][0] = N/2 + 1;

snake[i][1] = N/2 + 1 + i;

}

for (i = 1; i = N; ++i)

for (j = 1; j = N; ++j)

plate[i][j] = 1;

apple[0] = rand()%N + 1; apple[1] = rand()%N + 1;

apple[2] = 1;

for (i = 0; i N + 2; ++i)

{

gotoxy(0, i);

for (j = 0; j N + 2; ++j)

{

switch (plate[i][j])

{

case 0:

color(12);printf("□");color(11); continue;

case 1: printf("■"); continue;

default: ;

}

}

putchar('\n');

}

for (i = 0; i (*len); ++i)

{

gotoxy(snake[i][1] * 2, snake[i][0]);

printf("★");

}

putchar('\n');

*snake_x = snake;

}

void Manual()

{

gotoxy(N+30,2);

color(10);

printf("按 W S A D 移动方向");

gotoxy(N+30,4);

printf("按 space 键暂停");

gotoxy(N+30,8);

color(11);

printf("历史最高分为: ");

color(12);

gotoxy(N+44,8);

printf("%d",score[1]*10);

color(11);

gotoxy(N+30,12);

printf("你现在得分为: 0");

}

int File_in() //取记录的分数

{

FILE *fp;

if((fp = fopen("C:\\tcs.txt","a+")) == NULL)

{

gotoxy(N+18, N+2);

printf("文件不能打开\n");

exit(0);

}

if((score[1] = fgetc(fp)) != EOF);

else

score[1] = 0;

return 0;

}

int File_out() //存数据

{

FILE *fp;

if(score[1] score[0])

{gotoxy(10,10);

color(12);

puts("闯关失败 加油耶");

gotoxy(0,N+2);

return 0;

}

if((fp = fopen("C:\\tcs.txt","w+")) == NULL)

{

printf("文件不能打开\n");

exit(0);

}

if(fputc(--score[0],fp)==EOF)

printf("输出失败\n");

gotoxy(10,10);

color(12);

puts("恭喜您打破记录");

gotoxy(0,N+2);

return 0;

}

void Free(char **snake, int len) //释放空间

{

int i;

for (i = 0; i len; ++i)

free(snake[i]);

free(snake);

}

int main(void)

{

int len;

char ch = 'g';

char a[N+2][N+2] = {{0}};

char **snake;

srand((unsigned)time(NULL));

color(11);

File_in();

init(a, snake, len);

Manual();

while (ch != 0x1B) // 按 ESC 结束

{

Draw(snake, len);

if (!apple[2]) {

apple[0] = rand()%N + 1;

apple[1] = rand()%N + 1;

apple[2] = 1;

num++;

if(num8)

num=0;

}

Sleep(200-score[3]*10);

setbuf(stdin, NULL);

if (kbhit())

{

gotoxy(0, N+2);

ch = getche();

}

snake = Move(snake, ch, len);

if (Block(snake[0])==1)

{

gotoxy(N+2, N+2);

puts("你输了");

File_out();

Free(snake, len);

getche();

exit(0);

}

}

Free(snake, len);

exit(0);

}

C语言的贪吃蛇源代码

 

//******友情提示:如想速度快点,请改小_sleep(500)函数中参数*****  

#include stdio.h  

#include stdlib.h  

#include conio.h  

#include string.h  

#include time.h  

const int H = 8;   //地图的高  

const int L = 16;  //地图的长  

char GameMap[H][L];   //游戏地图  

int  key;  //按键保存  

int  sum = 1, over = 0;  //蛇的长度, 游戏结束(自吃或碰墙)  

int  dx[4] = {0, 0, -1, 1};  //左、右、上、下的方向  

int  dy[4] = {-1, 1, 0, 0};  

struct Snake   //蛇的每个节点的数据类型  

{  

 int x, y;  //左边位置  

 int now;   //保存当前节点的方向, 0,1,2,3分别为左右上下  

}Snake[H*L];  

const char Shead = '@';  //蛇头  

const char Sbody = '#';  //蛇身  

const char Sfood = '*';  //食物  

const char Snode = '.';  //'.'在地图上标示为空  

void Initial();  //地图的初始化  

void Create_Food(); //在地图上随机产生食物  

void Show();   //刷新显示地图  

void Button();  //取出按键,并判断方向  

void Move();   //蛇的移动  

void Check_Border();  //检查蛇头是否越界  

void Check_Head(int x, int y);   //检查蛇头移动后的位置情况  

int main()   

{  

 Initial();  

 Show();  

 return 0;  

}  

void Initial()  //地图的初始化  

{  

 int i, j;  

 int hx, hy;  

 system("title 贪吃蛇");  //控制台的标题  

 memset(GameMap, '.', sizeof(GameMap));  //初始化地图全部为空'.'  

 system("cls");  

 srand(time(0));   //随机种子  

 hx = rand()%H;    //产生蛇头  

 hy = rand()%L;  

 GameMap[hx][hy] = Shead;  

 Snake[0].x = hx;  Snake[0].y = hy;  

 Snake[0].now = -1;  

 Create_Food();   //随机产生食物  

 for(i = 0; i  H; i++)   //地图显示  

 {   

  for(j = 0; j  L; j++)  

   printf("%c", GameMap[i][j]);  

  printf("\n");  

 }  

     

 printf("\n小小C语言贪吃蛇\n");  

 printf("按任意方向键开始游戏\n");  

    

 getch();   //先接受一个按键,使蛇开始往该方向走  

 Button();  //取出按键,并判断方向  

}  

void Create_Food()  //在地图上随机产生食物  

{  

 int fx, fy;  

 while(1)  

 {  

  fx = rand()%H;  

     fy = rand()%L;  

     

  if(GameMap[fx][fy] == '.')  //不能出现在蛇所占有的位置  

  {   

   GameMap[fx][fy] = Sfood;  

      break;  

  }  

 }  

}  

void Show()  //刷新显示地图  

{  

 int i, j;  

 while(1)  

 {    

  _sleep(500); //延迟半秒(1000为1s),即每半秒刷新一次地图  

  Button();   //先判断按键在移动  

  Move();  

  if(over)  //自吃或碰墙即游戏结束  

  {   

   printf("\n**游戏结束**\n");  

   printf("     _\n");  

   getchar();  

      break;  

  }  

  system("cls");   //清空地图再显示刷新吼的地图  

  for(i = 0; i  H; i++)   

  {   

   for(j = 0; j  L; j++)  

    printf("%c", GameMap[i][j]);  

   printf("\n");  

  }  

     

  printf("\n小小C语言贪吃蛇\n");  

  printf("按任意方向键开始游戏\n");  

 }  

}  

void Button()  //取出按键,并判断方向  

{  

 if(kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0  

 {   

  while(kbhit() != 0)  //可能存在多个按键,要全部取完,以最后一个为主  

      key = getch(); //将按键从控制台中取出并保存到key中  

  switch(key)  

  {   //左  

   case 75:  Snake[0].now = 0;  

          break;  

            //右  

            case 77:  Snake[0].now = 1;       

          break;  

            //上  

   case 72:  Snake[0].now = 2;  

          break;  

            //下  

   case 80:  Snake[0].now = 3;  

          break;  

  }  

 }  

}  

void Move()   //蛇的移动  

{  

 int i, x, y;  

    int t = sum;  //保存当前蛇的长度  

 //记录当前蛇头的位置,并设置为空,蛇头先移动  

 x = Snake[0].x;  y = Snake[0].y;  GameMap[x][y] = '.';  

 Snake[0].x = Snake[0].x + dx[ Snake[0].now ];  

 Snake[0].y = Snake[0].y + dy[ Snake[0].now ];  

 Check_Border();   //蛇头是否越界  

 Check_Head(x, y);  //蛇头移动后的位置情况,参数为: 蛇头的开始位置  

 if(sum == t)  //未吃到食物即蛇身移动哦  

    for(i = 1; i  sum; i++)  //要从蛇尾节点向前移动哦,前一个节点作为参照  

 {  

  if(i == 1)   //尾节点设置为空再移动  

   GameMap[ Snake[i].x ][ Snake[i].y ] = '.';  

     

  if(i == sum-1)  //为蛇头后面的蛇身节点,特殊处理  

  {  

   Snake[i].x = x;  

         Snake[i].y = y;  

      Snake[i].now = Snake[0].now;  

  }  

  else   //其他蛇身即走到前一个蛇身位置  

  {  

   Snake[i].x = Snake[i+1].x;  

         Snake[i].y = Snake[i+1].y;  

      Snake[i].now = Snake[i+1].now;  

  }  

      

  GameMap[ Snake[i].x ][ Snake[i].y ] = '#'; //移动后要置为'#'蛇身   

 }  

}  

void Check_Border()  //检查蛇头是否越界  

{  

 if(Snake[0].x  0 || Snake[0].x = H  

 || Snake[0].y  0 || Snake[0].y = L)  

     over = 1;  

}  

void Check_Head(int x, int y)  //检查蛇头移动后的位置情况  

{  

    

 if(GameMap[ Snake[0].x ][ Snake[0].y ] == '.')  //为空  

  GameMap[ Snake[0].x ][ Snake[0].y ] = '@';  

 else 

  if(GameMap[ Snake[0].x ][ Snake[0].y ] == '*')  //为食物  

  {  

   GameMap[ Snake[0].x ][ Snake[0].y ] = '@';    

   Snake[sum].x = x;   //新增加的蛇身为蛇头后面的那个  

      Snake[sum].y = y;  

      Snake[sum].now = Snake[0].now;  

         GameMap[ Snake[sum].x ][ Snake[sum].y ] = '#';   

   sum++;  

   Create_Food();  //食物吃完了马上再产生一个食物  

  }  

  else 

   over = 1;  

}

C语言贪吃蛇代码求注释

void main()

{

int a[30][30]={0};/*先声明一个30*30的数组,用于存储屏幕上的蛇、食物的分布情况*/

int i,j,t,flag=0;

char c='d',c1='d';

struct Food food={10,16,'A'};/*初始化一个食物对象,在10,16位置,它的另一个参数是'A'*/

int gameover=0;/*让游戏状态切换到正常*/

struct Node *head,*p,*rear,*pt;/*head存储蛇的头部,pt用来临时遍历蛇的每一节、rear用来存储蛇的尾部(不过你截的这段代码没有使用到尾部信息的值、p是增删结点时采用的一个临时变量)*/

head=(struct Node *)malloc(sizeof(struct Node));/*给蛇分配内存空间*/

head-x=10;/*蛇头的x值为10*/

head-y=16;/*同理*/

head-pre=NULL;/*蛇头前面没有结点*/

head-next=NULL;/*蛇头后面也没有结点(空空荡荡的一个大头)*/

rear=head;/*所以~蛇的屁股就是它的脑袋……*/

srand((unsigned)time(NULL));/*初始化随机数发生器,让程序每一次执行时产生的随机数序列都不一样*/

while(1)

{

if(food.x==head-x food.y==head-y)/*如果蛇头碰到了食物*/

{

p=(struct Node *)malloc(sizeof(struct Node));/*创建一个新的结点,并分配空间*/

pt=head;/*pt指向蛇头,准备遍历*/

while(pt-next!=NULL)/*只要pt指向的结点后面还有结点,即没有遍历到蛇尾*/

pt=pt-next ;/*pt指向下一个结点*/

p-pre= pt;/*新增结点的上一个结点是尾部(此时pt已经指向了蛇尾)*/

pt-next = p;/*蛇尾的下一个结点变为新增结点,链表被链接在一起了*/

p-next=NULL;/*新增结点的下一个结点设为没有,即下一次遍历时,它默认为尾部*/

rear=p;/*蛇尾变成新增结点*/

food.x=rand()%15;/*初始化下一个食物位置(0-14,0-14)范围内*/

food.y=rand()%15;

food.c=65+rand()%26;/*食物的另一个参数随机分配为某一个英文字母*/

flag=1;/*让旗标变为1,旗标的作用在这段被截断的代码中未知,下同*/

t=0;

c语言 贪吃蛇 程序

基本思路:

蛇每吃一个食物蛇身子就增加一格,用UP, DOWN, LEFT, RIGHT控制蛇头的运动,而蛇身子跟着蛇头走,每后一格蛇身子下一步走到上一格蛇身子的位置,以此类推。

#include stdio.h

#include conio.h

#include windows.h

#define BEG_X 2

#define BEG_Y 1

#define WID 20

#define HEI 20

HANDLE hout;

typedef enum {UP, DOWN, LEFT, RIGHT} DIR;

typedef struct Snake_body

{

COORD pos;//蛇身的位置

struct Snake_body *next;//下一个蛇身

struct Snake_body *prev;//前一个蛇身

}SNAKE, *PSNAKE;

PSNAKE head = NULL;//蛇头

PSNAKE tail = NULL;//蛇尾

//画游戏边框的函数

void DrawBorder()

{

int i, j;

COORD pos = {BEG_X, BEG_Y};

for(i = 0; i HEI; ++i)

{

SetConsoleCursorPosition(hout, pos);

for(j = 0; j WID; ++j)

{

if(i == 0)//第一行

{

if(j == 0)

printf("┏");

else if(j == WID - 1)

printf("┓");

else

printf("━");

}

else if(i == HEI - 1)//最后一行

{

if(j == 0)

printf("┗");

else if(j == WID - 1)

printf("┛");

else

printf("━");

}

else if(j == 0 || j == WID - 1)//第一列或最后一列

printf("┃");

else

printf("  ");

}

++pos.Y;

}

}

//添加蛇身的函数

void AddBody(COORD pos)

{

PSNAKE pnew = (PSNAKE)calloc(1, sizeof(SNAKE));

pnew-pos = pos;

if(!head)

{

head = tail = pnew;

}

else

{

pnew-next = head;//新创建蛇身的next指向原先的蛇头

head-prev = pnew;//原先的蛇头的prev指向新创建的蛇身

head = pnew;//把新创建的蛇身作为新的蛇头

}

SetConsoleCursorPosition(hout, head-pos);

printf("◎");

}

//蛇身移动的函数

void MoveBody(DIR dir)

{

PSNAKE ptmp;

COORD pos = head-pos;

switch(dir)

{

case UP:

if(head-pos.Y BEG_Y + 1)

--pos.Y;

else

return;

break;

case DOWN:

if(head-pos.Y BEG_Y + HEI - 2)

++pos.Y;

else

return;

break;

case LEFT:

if(head-pos.X BEG_X + 2)

pos.X -= 2;

else

return;

break;

case RIGHT:

if(head-pos.X BEG_X + (WID - 2) * 2)

pos.X += 2;

else

return;

break;

}

AddBody(pos);//添加了一个新的蛇头

ptmp = tail;//保存当前的蛇尾

tail = tail-prev;

if(tail)

tail-next = NULL;

SetConsoleCursorPosition(hout, ptmp-pos);

printf("  ");

free(ptmp);

}

int main()

{

int ctrl;

DIR dir = RIGHT;//初始蛇的方向是向右的

COORD pos = {BEG_X + 2, BEG_Y + HEI / 2};

system("color 0E");

system("mode con cols=90 lines=30");

hout = GetStdHandle(STD_OUTPUT_HANDLE);

printf("    ------------贪吃蛇的移动------------");

DrawBorder();

//自定义几个蛇的身体

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

pos.X += 2;

AddBody(pos);

//控制蛇的移动

while(ctrl = getch())

{

switch(ctrl)

{

case 'w':

if(dir == DOWN)

continue;

dir = UP;

break;

case 's':

if(dir == UP)

continue;

dir = DOWN;

break;

case 'a':

if(dir == RIGHT)

continue;

dir = LEFT;

break;

case 'd':

if(dir == LEFT)

continue;

dir = RIGHT;

break;

case 'q':

return 0;

}

MoveBody(dir);

}

return 0;

}

扩展资料:

实现逻辑

1,可以设置光标,就能实现制定位置打印制定符号。

2,涉及一个结构体,包含两个元素坐标元素和一个结构体指针。

3,结构体串联形成链表,遍历获取成员坐标,打印符号得到蛇身。

4,不断的加头,去尾,重新遍历坐标,再打印形成蛇的移动。

5,食物产生的位置判定,不能越界,也不能与蛇身体重合。

6,蛇的转向判定,一条规则,不允许倒退。

7,转向的实现,跟行进方向决定新的关节坐标(当前头的上下左右)

8,死亡检测,是否头节点坐标是否与墙壁重合,是否与身体其他关节重合。

9,加速减速,设置刷新休眠时间实现。

参考资料来源:百度百科-C语言

求贪吃蛇C语言代码

// 2.cpp : Defines the entry point for the application.

//

#include "stdafx.h"

#includestdio.h

#includeconio.h

#includetime.h

#includewindows.h

#includestdlib.h

int length=1;//蛇的当前长度,初始值为1

int line[100][2];//蛇的走的路线

int head[2]={40,12};//蛇头

int food[2];//食物的位置

char direction;//蛇运动方向

int x_min=1,x_max=77, y_min=2, y_max=23;//设置蛇的运动区域

int tail_before[2]={40,12};//上一个状态的蛇尾

char direction_before='s';//上一个状态蛇的运动方向

int live_death=1;//死活状态,0死,1活

int eat_flag=0;//吃食物与否的状态。0没吃 1吃了

int max=0;

int delay;//移动延迟时间

void gotoxy(int x, int y)//x为列坐标,y为行坐标

{

COORD pos = {x,y};

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleCursorPosition(hOut, pos);

}

void hidden()//隐藏光标

{

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);

CONSOLE_CURSOR_INFO cci;

GetConsoleCursorInfo(hOut,cci);

cci.bVisible=0;//赋1为显示,赋0为隐藏

SetConsoleCursorInfo(hOut,cci);

}

void update_score()

{

gotoxy(2,1);

printf("我的分数:%d",length);

gotoxy(42,1);

printf("最高记录:%d",max);

}

void create_window()

{

gotoxy(0,0);

printf("╔══════════════════╦═══════════════════╗");

printf("║ ║ ║");

printf("╠══════════════════╩═══════════════════╣");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("║ ║");

printf("╚══════════════════════════════════════╝");

}

void update_line()

{

int i;

if(eat_flag==0)//吃了食物就不用记住上一个状态的蛇尾,否则会被消掉

{

tail_before[0]=line[0][0];//记住上一个状态的蛇尾

tail_before[1]=line[0][1];

for(i=0;ilength-1;i++)//更新蛇头以后部分

{

line[i][0]=line[i+1][0];

line[i][1]=line[i+1][1];

}

line[length-1][0]=head[0];//更新蛇头

line[length-1][1]=head[1];

}

}

void initial()

{

FILE *fp;

gotoxy(head[0],head[1]);

printf("蛇");

line[0][0]=head[0];//把蛇头装入路线

line[0][1]=head[1];

if((fp=fopen("highest","r"))==NULL)

{

fp=fopen("highest","w");

fprintf(fp,"%d",0);

max=0;

fclose(fp);

}//第一次使用时,初始化奖最高分为0

else

{

fp=fopen("highest","r");

fscanf(fp,"%d",max);

}

update_score();

}

void createfood()

{

int flag,i;

srand((unsigned)time(NULL));

for(;;)

{

for(;;)

{

food[0]=rand()%(x_max+1);

if(food[0]%2==0 food[0]x_min)

break;

}//产生一个偶数横坐标

for(;;)

{

food[1]=rand()%(y_max);

if(food[1]y_min)

break;

}

for(i=0,flag=0;ilength;i++)//判断产生的食物是否在蛇身上,在flag=1,否则为0

if(food[0]==line[i][0] food[1]==line[i][1])

{ flag=1; break; }

if(flag==0)// 食物不在蛇身上 结束循环

break;

}

gotoxy(food[0],food[1]);

printf("蛇");

}

void show_snake()

{

gotoxy(head[0],head[1]);

printf("蛇");

if(eat_flag==0)//没吃食物时消去蛇尾

{

gotoxy(tail_before[0],tail_before[1]);

printf(" ");//消除蛇尾

}

else

eat_flag=0;//吃了食物就回到没吃状态

}

char different_direction(char dir)

{

switch(dir)

{

case 'a': return 'd';

case 'd': return 'a';

case 'w': return 's';

case 's': return 'w';

}

return 0;

}

void get_direction()

{

direction_before=direction;//记住蛇上一个状态的运动方向

while(kbhit()!=0) //调试

direction=getch();

if( direction_before == different_direction(direction) || (direction!='a' direction!='s' direction!='d' direction!='w') ) //新方向和原方向相反,或获得的方向不是wasd时,保持原方向

direction=direction_before;

switch(direction)

{

case 'a': head[0]-=2; break;

case 'd': head[0]+=2; break;

case 'w': head[1]--; break;

case 's': head[1]++; break;

}

}

void live_state()//判断蛇的生存状态

{

FILE *fp;

int i,flag;

for(i=0,flag=0;ilength-1;i++)//判断是否自己咬到自己

if( head[0]==line[i][0] head[1]==line[i][1])

{

flag=1;

break;

}

if(head[0]=x_min || head[0]=x_max || head[1]=y_min || head[1]=y_max || flag==1)

{

system("cls");

create_window();

update_score();

gotoxy(35,12);

printf("游戏结束!\n");

Sleep(500);

live_death=0;

fp=fopen("highest","w");

fprintf(fp,"%d",max);//保存最高分

}

}

void eat()

{

if(head[0]==food[0]head[1]==food[1])

{

length++;

line[length-1][0]=head[0];//更新蛇头

line[length-1][1]=head[1];

eat_flag=1;

createfood();

if(lengthmax)

max=length;

update_score();

if(delay100)

delay-=30;//加速

}

}

void main()

{

int x=0,y=0;

// int i;

hidden();//隐藏光标

create_window();

initial();

createfood();

for(direction='s',delay=600;;)

{

get_direction();

eat();

update_line();

live_state();//判断生死状态

if(live_death==1)

{

show_snake();

}

else

break;

Sleep(delay);

}

}

贪吃蛇c语言代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于贪吃蛇C语言程序、贪吃蛇c语言代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/32144.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载