乐趣c语言——贪吃蛇

本文介绍了使用C语言实现贪吃蛇游戏的思路和过程,包括游戏区域的设定、围墙和食物的生成、蛇的结构体定义、蛇的移动逻辑以及游戏结束条件的判断。通过键盘控制蛇的移动,当蛇碰到墙或者自己的身体时游戏结束,吃到食物则蛇的长度增加。文章详细讲解了每一部分的实现细节,并给出了完整的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.游戏介绍与思路

1.1介绍:

1.2游戏区思路

1.2.1围墙

1.2.2游戏区域

1.2.3蛇头与蛇身

1.3游戏逻辑思路

2.正式实现贪吃蛇

2.1在开始前我们先包头文件和宏定义

2.2创建游戏区并且初始化

2.3初始化蛇头与蛇身

2.4打印与覆盖蛇

2.5实现蛇的移动

 2.6蛇移动

2.7食物的随机生成

2.8判断游戏是否结束

3.整体游戏逻辑

4.完整代码


1.游戏介绍与思路

1.1介绍:

小键盘上下左右来控制方向,开始蛇的长度为3,吃到食物蛇身+1,碰到墙游戏结束

1.2游戏区思路

1.2.1围墙

围墙很简单,我们只要确定长和宽即可

#define ROW 22
#define COL 42

1.2.2游戏区域

利用一个二维数组face来存放游戏区内各方块的内容

如果(x,y)处是空的,我们就把数组的face[x][y]=BLANK;

如果(x,y)处是墙,我们就把数组的face[x][y]=WALL;

如果(x,y)处是食物,我们就把数组的face[x][y]=FOOD;

为了代码的可读性,我们使用宏定义

#define BlANK 0
#define WALL 1
#define FOOD 2
#define HEAD 3
#define BODY 4

1.2.3蛇头与蛇身

我们利用结构体来构造蛇头与蛇身

(1)蛇头的结构体

需要存放蛇头的横纵坐标,以及蛇的总长度

struct snakehead
{
	int x;//蛇头横坐标
	int y;//蛇头纵坐标
	int len;//蛇的总长度
}snake;

(2)蛇身结构体

存放每个蛇身的横纵坐标,需要开辟多个

struct snakebody
{
	int x;//蛇身横坐标
	int y;//蛇身纵坐标
}body[ROW*COL];

1.3游戏逻辑思路

接收键盘字符来判断需要进行的操作

#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
#define SPACE 32
#define ESC 27

整体:初始化棋盘——初始化蛇头与蛇身——打印蛇——进行游戏

游戏:蛇移动(通过接收键盘)——打印蛇——判断触碰的内容(墙=游戏结束,食物=长度加                   一,空=继续游戏)

2.正式实现贪吃蛇

2.1在开始前我们先包头文件和宏定义

#pragma once

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

#define ROW 22
#define COL 42

#define BlANK 0
#define WALL 1
#define FOOD 2
#define HEAD 3
#define BODY 4

#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
#define SPACE 32
#define ESC 27

接下来我们先实现这次的重点——实现光标跳转函数

光标跳转可以让我们实现在任意位置的打印,这个非常有用

void CursorJump(int x, int y)//传入需要跳转的位置
{
	COORD pos;//存放横纵坐标的一个结构体
	pos.X = x;//赋值
	pos.Y = y;//赋值
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//接收屏幕句柄
	SetConsoleCursorPosition(handle, pos);//将光标放置到pos处
}

这里的COORD不需要你自己定义,直接使用就可以了。这个结构体内部包含一个横坐标,一个纵坐标

调用函数,光标跳转到指定地点,我们就可以实现任意位置的打印。

为了游戏的美观我们需要隐藏光标

void HideCursor()
{
	CONSOLE_CURSOR_INFO curInfo;
	curInfo.dwSize = 1;
	curInfo.bVisible = FALSE;
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorInfo(handle, &curInfo);
}

2.2创建游戏区并且初始化

int face[ROW][COL];

先创建一个长*宽大小的二维数组,用来存放游戏区每个格子的情况

初始化游戏区

void InitInterface()
{
	
	for (int i = 0; i < ROW; i++)//需要打印ROW行
	{
		for (int j = 0; j < COL; j++)
		{
			if (j == 0 || j == COL - 1)//第一列或者最后一列
			{
				face[i][j] = WALL; //标记该位置为墙
				CursorJump(2 * j, i);//光标跳转
				printf("■");
			}
			else if (i == 0 || i == ROW - 1)//第一行和最后一行
			{
				face[i][j] = WALL; //标记该位置为墙
				printf("■");
			}
			else
			{
				face[i][j] = BlANK; //标记该位置为空
			}
		}
	}
}

初始化后我们就得到了游戏区,并且将游戏区的内容存放到数组中

2.3初始化蛇头与蛇身

void Initsnake()
{
	snake.len = 2;//蛇的初始长度为2
	snake.x = COL / 2;//蛇头初始位置
	snake.y = ROW / 2;//蛇头初始位置
    //第一个蛇身
	body[0].x = COL / 2-1;
	body[0].y = ROW / 2;
    //第二个蛇身
	body[1].x = COL / 2-2;
	body[1].y = ROW / 2;

	face[snake.y][snake.x] = HEAD;//标记该位置为头
	face[body[0].y][body[0].x] = BODY;//标记该位置为身子
	face[body[1].y][body[1].x] = BODY;//标记该位置为身子
}

2.4打印与覆盖蛇

这里实现蛇移动的方法是利用空格覆盖来实现蛇的移动

void DrawSnake(int flag)//利用flag来决定是打印还是覆盖
{
	if (flag == 1)//打印蛇
	{
		CursorJump(2 * snake.x, snake.y);//光标跳转到蛇头位置
		printf("■");//打印蛇头
		for (int i = 0; i < snake.len; i++)//利用循环打印蛇身
		{
			CursorJump(2 * body[i].x, body[i].y);//光标跳转到蛇身的位置
			printf("□");//打印蛇身
		}
	}
	else//覆盖蛇
	{
		if (body[snake.len - 1].x != 0)//蛇身不为空
		{
			CursorJump(2 * body[snake.len-1 ].x, body[snake.len-1 ].y);
			printf("  ");//空格覆盖
		}
	}
}

2.5实现蛇的移动

思路:将原来的蛇覆盖后打印新蛇

void MoveSneke(int x, int y)
{
	DrawSnake(0);//先覆盖之前的蛇
	face[body[snake.len - 1].y][body[snake.len - 1].x] = BlANK;//将覆盖后的标记为空
	for (int i = snake.len - 1; i > 0; i--)
	{
		body[i].x = body[i - 1].x;//将后一个身子的坐标放到前一个身子
		body[i].y = body[i - 1].y;

	}
	body[0].x = snake.x;
	body[0].y = snake.y;

	snake.x = snake.x + x;
	snake.y = snake.y + y;
	DrawSnake(1);//打印蛇
}

画图更容易理解

 

 

 

 

 2.6蛇移动

void run(int x, int y)
{
	int t = 0;
	while (1)
	{
		if (t == 0)
		{
			t = 6000;//蛇移动的速度
		}
		while (--t)
		{
			if (kbhit() != 0)//检测是否有键盘输入,有就返回非0
				break;
		}
		if (t == 0)
		{
			judgeFunc(x, y);//判断游戏是否结束
			MoveSneke(x, y);//移动蛇
		}
		else
		{
			break;
		}
	}
}

2.7食物的随机生成

void RandFood()
{
	int i, j;
	do
	{
		i = rand() % ROW;//随机生成坐标
		j = rand() % COL;

	} while (face[i][j] != BlANK);//判断此坐标是否为空,不为空就重新生成
	face[i][j] = FOOD;//在为空的地方标记食物
	CursorJump(2 * j, i);//跳转打印食物
	printf("●");
}

2.8判断游戏是否结束

void judgeFunc(int x, int y)
{
	if (face[snake.y + y][snake.x + x] == FOOD)//如果这个地方是食物
	{
		snake.len++;//蛇身长度+1
		RandFood();//重新随机生成食物

	}
	else if (face[snake.y + y][snake.x + x] == WALL)//如果位置是墙
	{
		Sleep(1000);//给玩家反应时间
		system("cls");//清屏
		CursorJump(2 * (COL / 3), ROW / 2 + 3);
		printf("game over,agin?  y/n");
		char n;
		scanf("%c", &n);
		if (n == 'y')
		{
			system("cls");
			main();
		}
		else
		{
			exit(0);
		}
	}
}

3.整体游戏逻辑

void game2()
{
	int n = RIGHT;//默认向右移动
	int tmp = 0;
	goto first;
	while (1)
	{
		n = getch();//接收玩家键盘输入
		switch (n)
		{
		case UP:
		case DOWN:
			if (tmp != LEFT && tmp != RIGHT)//玩家按上下,但是上一次不是左右
			{
				n = tmp;//方向改为上或下
			}
			break;
		case LEFT:
		case RIGHT:
			if (tmp != UP && tmp != DOWN)
			{
				n = tmp;
			}
		case SPACE:
		case ESC:
		case 'r':
		case 'R':
			break;
		default:
			n = tmp;
			break;
		}
	first:
		switch (n)
		{
		case UP:
			run(0, -1);
			tmp = UP;
			break;
		case DOWN:
			run(0, 1);
			tmp = DOWN;
			break;
		case LEFT:
			run(-1, 0);
			tmp = LEFT;
			break;
		case RIGHT:
			run(1, 0);
			tmp = RIGHT;
			break;
		case SPACE:
			system("pause>nul");
			break;
		case ESC:
			system("cls");
			CursorJump(COL - 8, ROW / 2);
			printf("game over");
			CursorJump(COL - 8, ROW / 2);
			exit(0);
		case 'r':
		case 'R':
			system("cls");
			main();
		}
	}
}

4.完整代码

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

#define ROW 22
#define COL 42

#define BlANK 0
#define WALL 1
#define FOOD 2
#define HEAD 3
#define BODY 4

#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
#define SPACE 32
#define ESC 27


int max, grade;
struct snakehead
{
	int x;
	int y;
	int len;
}snake;

struct snakebody
{
	int x;
	int y;
}body[ROW*COL];

int face[ROW][COL];

void HideCursor();//隐藏光标
void CursorJump(int x, int y);
void InitInterface();
void Initsnake();
void DrawSnake(int flag);
void MoveSneke(int x, int y);
void run(int x, int y);
void judgeFunc(int x, int y);
void RandFood();

void HideCursor()
{
	CONSOLE_CURSOR_INFO curInfo;
	curInfo.dwSize = 1;
	curInfo.bVisible = FALSE;
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorInfo(handle, &curInfo);
}
void CursorJump(int x, int y)
{
	COORD pos;
	pos.X = x;
	pos.Y = y;
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(handle, pos);
}
void InitInterface()
{
	//color(6);
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			if (j == 0 || j == COL - 1)
			{
				face[i][j] = WALL; //标记该位置为墙
				CursorJump(2 * j, i);
				printf("■");
			}
			else if (i == 0 || i == ROW - 1)
			{
				face[i][j] = WALL; //标记该位置为墙
				printf("■");
			}
			else
			{
				face[i][j] = BlANK; //标记该位置为空
			}
		}
	}
}

void Initsnake()
{
	snake.len = 2;
	snake.x = COL / 2;
	snake.y = ROW / 2;

	body[0].x = COL / 2-1;
	body[0].y = ROW / 2;
	body[1].x = COL / 2-2;
	body[1].y = ROW / 2;

	face[snake.y][snake.x] = HEAD;
	face[body[0].y][body[0].x] = BODY;
	face[body[1].y][body[1].x] = BODY;
}

void DrawSnake(int flag)
{
	//system("cls");
	//InitInterface();
	if (flag == 1)
	{
		CursorJump(2 * snake.x, snake.y);
		printf("■");
		for (int i = 0; i < snake.len; i++)
		{
			CursorJump(2 * body[i].x, body[i].y);
			printf("□");
		}
	}
	else
	{
		if (body[snake.len - 1].x != 0)
		{
			CursorJump(2 * body[snake.len-1 ].x, body[snake.len-1 ].y);
			printf("  ");

		}
	}
}

void MoveSneke(int x, int y)
{
	DrawSnake(0);
	face[body[snake.len - 1].y][body[snake.len - 1].x] = BlANK;
	for (int i = snake.len - 1; i > 0; i--)
	{
		body[i].x = body[i - 1].x;
		body[i].y = body[i - 1].y;

	}
	body[0].x = snake.x;
	body[0].y = snake.y;

	snake.x = snake.x + x;
	snake.y = snake.y + y;
	DrawSnake(1);
}

void run(int x, int y)
{
	int t = 0;
	while (1)
	{
		if (t == 0)
		{
			t = 6000;
		}
		while (--t)
		{
			if (kbhit() != 0)
				break;
		}
		if (t == 0)
		{
			judgeFunc(x, y);
			MoveSneke(x, y);
		}
		else
		{
			break;
		}
	}
}
void judgeFunc(int x, int y)
{
	if (face[snake.y + y][snake.x + x] == FOOD)
	{
		snake.len++;
		grade += 10;
		RandFood();

	}
	else if (face[snake.y + y][snake.x + x] == WALL)
	{
		Sleep(1000);
		system("cls");
		CursorJump(2 * (COL / 3), ROW / 2 + 3);
		printf("game over,agin?  y/n");
		char n;
		scanf("%c", &n);
		if (n == 'y')
		{
			system("cls");
			main();
		}
		else
		{
			exit(0);
		}
	}
}
void RandFood()
{
	int i, j;
	do
	{
		i = rand() % ROW;
		j = rand() % COL;

	} while (face[i][j] != BlANK);
	face[i][j] = FOOD;
	CursorJump(2 * j, i);
	printf("●");
}

void game()
{
	//printf("贪吃蛇\n");
	//创建游戏区域
    HideCursor();
	InitInterface();
	Initsnake();
	DrawSnake(1);
	RandFood();
	game2();

}

int main()
{


    game();
    return 0;
}
void game2()
{
	int n = RIGHT;
	int tmp = 0;
	goto first;
	while (1)
	{
		n = getch();
		switch (n)
		{
		case UP:
		case DOWN:
			if (tmp != LEFT && tmp != RIGHT)
			{
				n = tmp;
			}
			break;
		case LEFT:
		case RIGHT:
			if (tmp != UP && tmp != DOWN)
			{
				n = tmp;
			}
		case SPACE:
		case ESC:
		case 'r':
		case 'R':
			break;
		default:
			n = tmp;
			break;
		}
	first:
		switch (n)
		{
		case UP:
			run(0, -1);
			tmp = UP;
			break;
		case DOWN:
			run(0, 1);
			tmp = DOWN;
			break;
		case LEFT:
			run(-1, 0);
			tmp = LEFT;
			break;
		case RIGHT:
			run(1, 0);
			tmp = RIGHT;
			break;
		case SPACE:
			system("pause>nul");
			break;
		case ESC:
			system("cls");
			CursorJump(COL - 8, ROW / 2);
			printf("game over");
			CursorJump(COL - 8, ROW / 2);
			exit(0);
		case 'r':
		case 'R':
			system("cls");
			main();
		}
	}
}

#include <stdio.h> #include <windows.h> #include <conio.h> #include <time.h> //游戏窗口 #define FrameX 4 //游戏窗口左上角的X轴坐标 #define FrameY 4 //游戏窗口左上角的Y轴坐标 #define Frame_height 20 //游戏窗口的高度 #define Frame_width 20 //游戏窗口的宽度 //定义全局变量 int i,j; int a[2]; //用于记住蛇尾坐标,其中a[0]、a[1]分别表示横、竖坐标 //声明蛇的结构体 struct Snake { int x[100]; //蛇的横坐标,其中x[0]表示蛇尾的横坐标,x[N-1]表示蛇头的横坐标 int y[100]; //蛇的竖坐标,其中y[0]表示蛇尾的竖坐标,y[N-1]表示蛇头的竖坐标 int count; //蛇吃食物的个数 int length; //蛇的长度 int speed; //蛇的速度 }; //声明食物的结构体 struct Food { int x; //食物的横坐标 int y; //食物的竖坐标 }; /******光标移到指定位置**************************************************************/ void gotoxy(HANDLE hOut, int x, int y) //UNKNOW { COORD pos; pos.X = x; //横坐标 pos.Y = y; //纵坐标 SetConsoleCursorPosition(hOut, pos); } /******设置文本为绿色*****************************************************************/ void Set_TextColor_Green (void) { HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE); //UNKNOW SetConsoleTextAttribute(Handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN); //UNKNOW } /******制作游戏窗口******************************************************************/ void make_frame() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义显示器句柄变量 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13); //打印选择菜单 printf("Esc 退出游戏"); gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15); printf("长按方向键:加速"); gotoxy(hOut,FrameX,FrameY); //打印框角 printf("╔"); gotoxy(hOut,FrameX+2*Frame_width-2,FrameY); printf("╗"); gotoxy(hOut,FrameX,FrameY+Frame_height); printf("╚"); gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height); printf("╝"); for(i=2;i<2*Frame_width-2;i+=2) { gotoxy(hOut,FrameX+i,FrameY); printf("═"); //打印上横框 } for(i=2;i<2*Frame_width-2;i+=2) { gotoxy(hOut,FrameX+i,FrameY+Frame_height); printf("═"); //打印下横框 } for(i=1;i<Frame_height;i++) { gotoxy(hOut,FrameX,FrameY+i); printf("║"); //打印左竖框 } for(i=1;i<Frame_height;i++) { gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i); printf("║"); //打印右竖框 } gotoxy(hOut,FrameX+Frame_width-5,FrameY-2); //打印游戏名称 Set_TextColor_Green (); //设置蛇为绿色 printf("贪吃蛇游戏"); } /******结束菜单*******************************************************************/ void over_game() { system("cls"); printf("\n\n\n\n\n\n\n\n\t\t\t\t游戏结束\n\n\n"); Sleep(2000); getch(); } /******菜单信息***************************************************************/ void print_information(HANDLE hOut,struct Snake *snake,struct Food *food) { gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1); printf("level : %d",snake->count/5+1); //打印游戏等级 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3); printf("score : %d",10*snake->count); //打印游戏得分 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5); printf("eat food : %d",snake->count); //打印产生食物个数 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7); printf("speed : %dms",snake->speed); //打印游戏速度 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+9); printf("foodX : %d",food->x); //打印食物的横坐标 gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+11); printf("foodY : %d",food->y); //打印食物的竖坐标 } /******初始化蛇**********************************************************************/ void init_snake(struct Snake *snake) { snake->x[0]=FrameX+2; //初始化蛇的横坐标 snake->y[0]=FrameY+Frame_height/2; //初始化蛇的竖坐标 snake->speed=300; //初始化蛇的速度为300ms snake->length=3; //初始化蛇的长度为3节 snake->count=0; //初始化蛇吃的个数为0 for(i=1;i<snake->length;i++) {/* 依次得到蛇身、蛇头的坐标 */ snake->x[i]=snake->x[i-1]+2; snake->y[i]=snake->y[i-1]; } } /******移动蛇*************************************************************************/ void move_snake(HANDLE hOut,struct Snake *snake) { gotoxy(hOut,snake->x[0],snake->y[0]); printf(" "); /* 清除蛇尾*/ for(i=1;i<snake->length;i++) {/* 后一节的坐标依次取代前一节的坐标 */ snake->x[i-1]=snake->x[i]; snake->y[i-1]=snake->y[i]; } } /******打印蛇*************************************************************************/ void print_snake(HANDLE hOut,struct Snake *snake) { for(i=0;i<snake->length;i++) { gotoxy(hOut,snake->x[i],snake->y[i]); if(i==0) { printf("○"); //打印蛇尾 } else if(i==snake->length-1) { printf("¤"); //打印蛇头 } else { printf("⊙"); //打印蛇身 } } } /******随机产生食物*******************************************************************/ void get_food(HANDLE hOut,struct Snake *snake,struct Food *food) { srand((unsigned)time(NULL)); //初始化随机数 while(1) {/* 产生食物的条件:1.在游戏窗口内 2.不在蛇的身上 */ food->x = rand() % (Frame_width-1); food->y = rand() % Frame_height; if( food->x==0 || food->y==0 ) { continue; } food->x = 2*food->x + FrameX; //得到食物的横坐标 food->y+=FrameY; //得到食物的竖坐标 for(i=0;i<snake->length;i++) {/* 判断食物是否在蛇的身上,如果在蛇身上,则重新产生;否则,打印蛇身 */ if( food->x==snake->x[i] && food->y==snake->y[i] ) { break; } } if(i==snake->length) { gotoxy(hOut,food->x,food->y); printf("⊙"); break; } } } /******吃食物***************************************************************************/ void eat_food(HANDLE hOut,struct Snake *snake,struct Food *food) { if( snake->x[snake->length-1]==food->x && snake->y[snake->length-1]==food->y ) {/* 如果蛇头位置与食物位置相同,吃食物 */ snake->length++; //吃一个食物,蛇身增长一节 for(i=snake->length-1;i>=1;i--) {/* 蛇后节坐标依次赋值给蛇前一节的坐标,依次得到蛇身及蛇头的坐标 */ snake->x[i]=snake->x[i-1]; snake->y[i]=snake->y[i-1]; } snake->x[0]=a[0]; //得到蛇尾移动前的横坐标 snake->y[0]=a[1]; //得到蛇尾移动前的竖坐标 get_food(hOut,snake,food); //重新产生食物 snake->count++; //食物的个数增1 if( snake->count%5==0 ) {/* 当蛇吃Up_level个食物时,速度加快Up_speed毫秒并且升一级 */ snake->speed-=50; } } } /******穿墙**********************************************************************************/ void through_wall(HANDLE hOut,struct Snake *snake,char ch) { if( ch==72 && snake->y[snake->length-1]==FrameY) { snake->y[snake->length-1] = FrameY+Frame_height-1; //如果蛇在上框且向上移动,穿墙 } if( ch==80 && snake->y[snake->length-1]==FrameY+Frame_height ) { snake->y[snake->length-1] = FrameY+1; //如果蛇在下框且向下移动,穿墙 } if( ch==75 && snake->x[snake->length-1]==FrameX ) { snake->x[snake->length-1] = FrameX+2*Frame_width-4; //如果蛇在左框且向左移动,穿墙 } if( ch==77 && snake->x[snake->length-1]==FrameX+2*Frame_width-2 ) { snake->x[snake->length-1] = FrameX+2; //如果蛇在右框且向右移动,穿墙 } } /******判断蛇是否死**************************************************************************/ int if_die(struct Snake *snake) {/* 当蛇头碰到自身时,蛇死 ,返回值为0 */ for(i=0;i<snake->length-1;i++) { if( snake->x[snake->length-1]==snake->x[i] && snake->y[snake->length-1]==snake->y[i] ) { return 0; } } return 1; } /******开始游戏*******************************************************************************/ void start_game() { unsigned char ch=77; //定义用于接收键盘输入的字符变量 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义显示器句柄变量 struct Snake s,*snake=&s; //定义蛇的结构体指针并指向蛇的结构体 struct Food f,*food=&f; //定义食物的结构体指针并指向食物的结构体 make_frame(); //制作游戏窗口 init_snake(snake); //初始化蛇 get_food(hOut,snake,food); //随机产生食物 while(1) { print_information(hOut,snake,food); //打印菜单信息 a[0]=snake->x[0]; //记住蛇尾的横坐标 a[1]=snake->y[0]; //记住蛇尾的竖坐标 j=0; if(kbhit()) //unknow {/* 判断是否按下键盘,如果按下,ch接收键盘输入 */ ch=getch(); if(kbhit()) {/* 如果长按键盘,则加速 */ Sleep(20); //unknow j=1; } } switch(ch) { case 72: {/* 向上移动 */ move_snake(hOut,snake); //移动蛇 snake->y[snake->length-1]-=1; //蛇头的竖坐标向上移,即减1 break; } case 80: {/* 向下移动 */ move_snake(hOut,snake); //移动蛇 snake->y[snake->length-1]+=1; //蛇头的竖坐标向下移,即加1 break; } case 75: {/* 向左移动 */ move_snake(hOut,snake); //移动蛇 snake->x[snake->length-1]-=2; //蛇头的横坐标向左移,即减2 break; } case 77: {/* 向右移动 */ move_snake(hOut,snake); //移动蛇 snake->x[snake->length-1]+=2; //蛇头的横坐标向右移,即加2 break; } } through_wall(hOut,snake,ch); //穿墙 eat_food(hOut,snake,food); //吃食物 print_snake(hOut,snake); //打印蛇 if( if_die(snake)==0 || ch==27 || snake->speed==50 ) {/* 游戏结束条件:1.蛇碰到自身 2.按Esc键 3.速度为50ms */ gotoxy(hOut,FrameX+Frame_width-2,FrameY+Frame_height/2-1); printf("Game Over"); Sleep(2000); break; } if(j==0) { Sleep(snake->speed); //延迟时间 } else { Sleep(10); } } } int main() { system("color 0D"); //设置文本为粉红色 start_game(); //开始游戏 over_game(); //结束游戏 }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值