贪吃蛇的代码,在文本文档打开就可以

贪吃蛇的代码,在文本文档打开就可以,第1张

#include<iostream.h>

#include<windows.h>

#include<time.h>

#include<stdlib.h>

#include<conio.h>

#define N 21

void gotoxy(int x,int y)//位置函数

{

COORD pos

pos.X=2*x

pos.Y=y

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos)

}

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

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a)

}

void init(int apple[2])//初始化函数(初始化围墙、显示信息、苹果)

{

int i,j//初始化围墙

int wall[N+2][N+2]={{0}}

for(i=1i<=Ni++)

{

for(j=1j<=Nj++)

wall[i][j]=1

}

color(11)

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

{

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

{

if(wall[i][j])

cout<<"■"

else cout<<"□"

}

cout<<endl

}

gotoxy(N+3,1)//显示信息

color(20)

cout<<"按 W S A D 移动方向"<<endl

gotoxy(N+3,2)

color(20)

cout<<"按任意键暂停"<<endl

gotoxy(N+3,3)

color(20)

cout<<"得分:"<<endl

apple[0]=rand()%N+1//苹果

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

gotoxy(apple[0],apple[1])

color(12)

cout<<"●"<<endl

}

int main()

{

int i,j

int** snake=NULL

int apple[2]

int score=0

int tail[2]

int len=3

char ch='p'

srand((unsigned)time(NULL))

init(apple)

snake=(int**)realloc(snake,sizeof(int*)*len)

for(i=0i<leni++)

snake[i]=(int*)malloc(sizeof(int)*2)

for(i=0i<leni++)

{

snake[i][0]=N/2

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

gotoxy(snake[i][0],snake[i][1])

color(14)

cout<<"★"<<endl

}

while(1)//进入消息循环

{

tail[0]=snake[len-1][0]

tail[1]=snake[len-1][1]

gotoxy(tail[0],tail[1])

color(11)

cout<<"■"<<endl

for(i=len-1i>0i--)

{

snake[i][0]=snake[i-1][0]

snake[i][1]=snake[i-1][1]

gotoxy(snake[i][0],snake[i][1])

color(14)

cout<<"★"<<endl

}

if(kbhit())

{

gotoxy(0,N+2)

ch=getche()

}

switch(ch)

{

case 'w':snake[0][1]--break

case 's':snake[0][1]++break

case 'a':snake[0][0]--break

case 'd':snake[0][0]++break

default: break

}

gotoxy(snake[0][0],snake[0][1])

color(14)

cout<<"★"<<endl

Sleep(abs(200-0.5*score))

if(snake[0][0]==apple[0]&&snake[0][1]==apple[1])//吃掉苹果后蛇分数加1,蛇长加1

{

score++

len++

snake=(int**)realloc(snake,sizeof(int*)*len)

snake[len-1]=(int*)malloc(sizeof(int)*2)

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

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

gotoxy(apple[0],apple[1])

color(12)

cout<<"●"<<endl

gotoxy(N+5,3)

color(20)

cout<<score<<endl

}

if(snake[0][1]==0||snake[0][1]==N||snake[0][0]==0||snake[0][0]==N)//撞到围墙后失败

{

gotoxy(N/2,N/2)

color(30)

cout<<"失败!!!"<<endl

for(i=0i<leni++)

free(snake[i])

Sleep(INFINITE)

exit(0)

}

}

return 0

}

 

//******友情提示:如想速度快点,请改小_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  

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8732062.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-20
下一篇2023-04-20

发表评论

登录后才能评论

评论列表(0条)

    保存