贪吃蛇——C实现

今天把C语言浅学完了!!!也顺便完成这个项目案例!

代码实现:

#include<stdio.h>
#include<time.h> 
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
#define WIDE 60
#define HIGH 20
void InitWall();
struct BODY{
	int x;
	int y;
}; 
struct Snake{
	int size;
	struct BODY body[WIDE*HIGH];
}snake;
int food[2]={0};
int dx=0;//偏移坐标 
int dy=0; 
//蛇末尾坐标 
int lx=0;
int ly=0;
int score=0;
void InitFood(){
	food[0]=rand()%WIDE;
	food[1]=rand()%HIGH;
}
void InitSnake(){
	snake.size=2;
	snake.body[0].x=WIDE/2;
	snake.body[0].y=HIGH/2;
	
	snake.body[1].x=WIDE/2-1;
	snake.body[1].y=HIGH/2;
}
void showUI(){
	COORD coord;
	coord.X=lx;
	coord.Y=ly;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
	putchar(' ');
	
	for(int i=0;i<snake.size;i++){
		coord.X=snake.body[i].x;
		coord.Y=snake.body[i].y;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);//调整控制台光标的位置 
		if(i==0){
			putchar('@');	
		}else{
			putchar('*');
		}
	}
	
	coord.X=food[0];
	coord.Y=food[1];
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
	putchar('#');
}
void playGame(){
	char key='D';
	while(snake.body[0].x>=0&&snake.body[0].x<WIDE&&snake.body[0].y>=0&&snake.body[0].y<HIGH){
		showUI();
		
		while(_kbhit()){
			key=_getch();
		}
		switch(key){
			case 'D': case 'd':dx=1;dy=0;break;
			case 'A': case 'a':dx=-1;dy=0;break;
			case 'W': case 'w':dx=0;dy=-1;break;
			case 'S': case 's':dx=0;dy=1;break;
		}
		//是否与身体碰撞 
		for(int i=1;i<snake.size;i++){
			if(snake.body[0].x==snake.body[i].x&&snake.body[0].y==snake.body[i].y){
				COORD coord;
	            coord.X=WIDE/2*3;
	            coord.Y=HIGH;
	
	            SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord); 
	            printf("分数:%d\n",score);
				return;
			}
		}
		if(snake.body[0].x==food[0]&&snake.body[0].y==food[1]){
			InitFood();
			snake.size++;
			score+=10;
		}
		lx=snake.body[snake.size-1].x;
		ly=snake.body[snake.size-1].y;
		//更新蛇身 
		for(int i=snake.size-1;i>0;i--){
			snake.body[i].x=snake.body[i-1].x;
			snake.body[i].y=snake.body[i-1].y;
		}
		//更新蛇头 
		snake.body[0].x+=dx;
		snake.body[0].y+=dy;
		if(score<=50){
			Sleep(300);
		}else if(score<=100){
			Sleep(200);
		}else if(score<=150){
			Sleep(100);
		}else{
			Sleep(50);
		}
//		system("cls");
	}
	COORD coord;
	coord.X=WIDE/2*3;
	coord.Y=HIGH;
	
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord); 
	printf("分数:%d\n",score);
}
void InitWall(){
	for(int i=0;i<=HIGH;i++){
		for(int j=0;j<=WIDE;j++){
			if(i==HIGH){
				putchar('=');
			}else if(j==WIDE){
				 putchar('=');
			}else putchar(' ');
		}
		putchar('\n');
	}
} 
int main(){
	srand((size_t)time(NULL));
	//去除光标 
	CONSOLE_CURSOR_INFO cci;
	cci.dwSize=sizeof(cci);
	cci.bVisible=FALSE;
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cci);
	InitWall();
	InitFood();
	InitSnake();
	playGame();


	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Luck&Strive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值