c语言贪吃蛇小游戏

First 1 c语言贪吃蛇小游戏

欢迎交流 如有侵权还请联系

大家好! 每个人都想第一次尝试做出一个自己的程序。我想做这个贪吃蛇想了很久,但拖拉了不少时间才做出来,教训就是想到就要去做,拖延是可耻的。借鉴了很多人的代码,如果有侵权还请联系我会删除。

程序开发步骤

1.加载头文件
2.写出宏定义
3.系统结构
4.功能模块
5.代码运行调试
6.总结

1.加载头文件

#include<stdio.h> 标准输入输出
#include<string.h> 使用字符数组 strlen strcmp strcpy
#include<windows.h>
包含 WINDEF.H基础数据类型定义,WINNTH.H支持Umicode类型定义,WINBASE.H内核函数,WINUSER.H用户界面函数,WINGDI.H 图形设备接口函数
#include<time.h> 日期和时间头文件
#include<conio.h> 控制台输入输出,UNIX和Linux平台不包含此文件

2.宏定义

#define MAOWIDTH 60
#define MAPHEIGHT 30
#define SNAKESIZE 40

3.系统结构

typedef struct Food
{
int x;
int y;
};
Food food;
typedef struct Snake
{
int x[SNAKESIZE];
int y[SNAKESIZE];

int len;
int speed;

};
Snake snake;

4.功能模块

void Furish(); //游戏结束后
void creatMap(); //画出地图
void creatFood(); //食物更替
void keydown(); //按键处理
int statuesnake(); //判断结束
void gotoxy(int x,int y); //光标移动

5.代码运行调试

#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<time.h>
#include<conio.h>

//辅助宏定义
#define MAPHEIGHT 30
#define MAPWIDTH 60
#define SNAKESIZE 100

//数据设计
typedef struct Food
{
int x;
int y;
};
Food food;
typedef struct Snake
{
int x[SNAKESIZE];
int y[SNAKESIZE];

int len;
int speed;

};
Snake snake;

int changeflag=0; //蛇有没有吃食物
int click=‘w’;

void Furish();
void creatMap();
void creatFood();
void keydown();
int statuesnake();
void gotoxy(int x,int y);

int main()
{
creatMap();
while(1)
{
creatFood();
Sleep(snake.speed);
keydown();
if(!statuesnake())
{
Furish();
break;
}
}
return 0;
}
/
void gotoxy(int x,int y)
{
HANDLE handle= GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
coord.X=x;
coord.Y=y;
//同步控制台
SetConsoleCursorPosition(handle,coord);
}

int statuesnake()
{
if(snake.x[0]==0||snake.x[0]==MAPWIDTH||snake.y[0]==0||snake.y[0]==MAPHEIGHT)
return 0;
for(int k=1;k<snake.len;k++)
{
if(snake.x[k]==snake.x[0]&&snake.y[k]==snake.y[0])
return 0;
}

return 1;

}
///
void creatMap()
{
srand((unsigned int)time(NULL));

for(int i=0; i<=MAPHEIGHT;i++)
{
gotoxy(0,i);
printf("█");
gotoxy(MAPWIDTH,i);
printf("█");
}

for(int i=0;i<=MAPWIDTH;i+=2)
{gotoxy(i,0);
printf("█");
gotoxy(i,MAPHEIGHT);
 printf("█");
 }

///

  
  	//蛇头 
snake.x[0]=MAPWIDTH /2;
snake.y[0]=MAPHEIGHT /2;
gotoxy(snake.x[0],snake.y[0]);
  printf("█");
 snake.len=3;
 snake.speed=300;
 
for(int k=1;k<snake.len;k++)
{  
   snake.x[k]=snake.x[k-1]+2;
   snake.y[k]=snake.y[k-1];
   gotoxy(snake.x[k],snake.y[k]);
   printf("█");
}  
/
	 //画食物 
  food.x=rand() % (MAPWIDTH-4)+2; 
 food.y=rand() % (MAPHEIGHT-2)+1;
  gotoxy(food.x,food.y);
  printf("⊙");

}

void creatFood()
{
if(snake.x[0]==food.x&&snake.y[0]food.y)
{
srand((int)time(NULL));//随机函数种子,食物出现位置
int flag =1;
while(flag
1)
{

		food.x=rand()%(MAPWIDTH-4)+2;
		food.y=rand()%(MAPHEIGHT-2)+1;//边框内
		
		for(int k=0;k<snake.len;k++)
		{
		    if(snake.x[k]==food.x&&snake.y[k]==food.y) 
            {
			  flag=0;
			  break;
			}
        } 
		  if(flag!=0&&food.x%2==0)
		  {
			break;
		  }
		  
		
	}
	gotoxy(food.x,food.y);
	printf("⊙");
	snake.len++;
	changeflag=1;       //食物被吃了
	gotoxy(MAPWIDTH+2,MAPHEIGHT+2);	
	printf("%d",snake.len);
}

}
/

void keydown()
{
if(_kbhit()) //有无接收到按键
{
fflush(stdin);
click=_getch();
}

	//擦除最后一个的轨迹
   if(!changeflag)
  {
	 gotoxy(snake.x[snake.len-1],snake.y[snake.len-1]);
     printf("  ");	    
    }   
/后面的蛇身 
  for(int i=snake.len-1;i>0;i--)
   {
	   snake.x[i]=snake.x[i-1];
    	snake.y[i]=snake.y[i-1];
   }
 	
    switch(click)
  {
     	case 'w':
		snake.y[0]--;
		break;
     	case 's':
		snake.y[0]++;		
		break;
    	case 'a':
		snake.x[0] -= 2; 
	break;
    	case 'd':
		snake.x[0] += 2;
		break;
	   
     }       
      gotoxy(snake.x[0],snake.y[0]);
       printf("█");
       changeflag=0;
       gotoxy(MAPHEIGHT+2,0);//移动不能一直看着光标 

}

void Furish()
{
system(“cls”);
gotoxy(MAPWIDTH/2,MAPHEIGHT/2);
printf("/");
gotoxy(MAPWIDTH/2,MAPHEIGHT/2+4);
printf(“come over”);
gotoxy(MAPWIDTH/2,MAPHEIGHT/2+8);
printf("/");
system(“pause”);
}

6.总结

kbhit()检查键盘中是否有输入;
ffiush(stdin)清空缓冲区;
system(""cls)清屏函数;
while(1)死循环,除非为假一直执行;
注意标点符号,格式内容是否正确,函数调用是否合理,条件位置是否正确;
还有许多不足,欢迎大家指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值