C语言贪吃蛇完整代码

来看看C语言贪吃蛇完整代码吧.

小提示:Win7可以完全运行,Win10和Win11有点BUG。

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>//windows±à³ÌÍ·Îļþ
#include <time.h>
#include <conio.h>//¿ØÖÆ̨ÊäÈëÊä³öÍ·Îļþ
#ifndef __cplusplus
typedef char bool;
#define false 0
#define true  1
#endif
//½«¹â±êÒƶ¯µ½¿ØÖÆ̨µÄ(x,y)×ø±êµã´¦
void gotoxy(int x, int y)
{
	COORD coord;
	coord.X = x;
	coord.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
#define SNAKESIZE 100//ÉßµÄÉíÌå×î´ó½ÚÊý
#define MAPWIDTH 78//¿í¶È
#define MAPHEIGHT 24//¸ß¶È
//ʳÎïµÄ×ø±ê
struct {
	int x;
	int y;
}food;
//ÉßµÄÏà¹ØÊôÐÔ
struct {
	int speed;//ÉßÒƶ¯µÄËÙ¶È
	int len;//Éߵij¤¶È
	int x[SNAKESIZE];//×é³ÉÉßÉíµÄÿһ¸öС·½¿éÖÐxµÄ×ø±ê
	int y[SNAKESIZE];//×é³ÉÉßÉíµÄÿһ¸öС·½¿éÖÐyµÄ×ø±ê
}snake;
//»æÖÆÓÎÏ·±ß¿ò
void drawMap();
//Ëæ»úÉú³ÉʳÎï
void createFood();
//°´¼ü²Ù×÷
void keyDown();
//ÉßµÄ״̬
bool snakeStatus();
//´Ó¿ØÖÆ̨Òƶ¯¹â±ê
void gotoxy(int x, int y);
int key = 72;//±íʾÉßÒƶ¯µÄ·½Ïò£¬72Ϊ°´Ï¡°¡ü¡±Ëù´ú±íµÄÊý×Ö
//ÓÃÀ´ÅжÏÉßÊÇ·ñ³ÔµôÁËʳÎÕâÒ»²½ºÜÖØÒª£¬Éæ¼°µ½ÊÇ·ñ»áÓÐÉßÉíÒƶ¯µÄЧ¹ûÒÔ¼°ÉßÉíÔö³¤µÄЧ¹û
int changeFlag = 0;
int sorce = 0;//¼Ç¼Íæ¼ÒµÄµÃ·Ö
int i;
void drawMap()
{
	//´òÓ¡ÉÏϱ߿ò
	for (i = 0; i <= MAPWIDTH; i += 2)//i+=2ÊÇÒòΪºáÏòÕ¼ÓõÄÊÇÁ½¸öλÖÃ
	{
		//½«¹â±êÒƶ¯ÒÀ´Îµ½(i,0)´¦´òÓ¡Éϱ߿ò
		gotoxy(i, 0);
		printf("¡ö");
		//½«¹â±êÒƶ¯ÒÀ´Îµ½(i,MAPHEIGHT)´¦´òӡϱ߿ò
		gotoxy(i, MAPHEIGHT);
		printf("¡ö");
	}
 
	//´òÓ¡×óÓұ߿ò
	for (i = 1; i < MAPHEIGHT; i++)
	{
		//½«¹â±êÒƶ¯ÒÀ´Îµ½(0,i)´¦´òÓ¡×ó±ß¿ò
		gotoxy(0, i);
		printf(" ¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£¡£");
		//½«¹â±êÒƶ¯ÒÀ´Îµ½(MAPWIDTH, i)´¦´òÓ¡×ó±ß¿ò
		gotoxy(MAPWIDTH, i);
		printf("¡ö");
	}
 
	//Ëæ»úÉú³É³õÊÔʳÎï
	while (1)
	{
		srand((unsigned int)time(NULL));
		food.x = rand() % (MAPWIDTH - 4) + 2;
		food.y = rand() % (MAPHEIGHT - 2) + 1;
		//Éú³ÉµÄʳÎïºá×ø±êµÄÆæż±ØÐëºÍ³õÊÔʱÉßÍ·ËùÔÚ×ø±êµÄÆæżһÖ£¬ÒòΪһ¸ö×Ö·ûÕ¼Á½¸ö×Ö½ÚλÖã¬Èô²»Ò»ÖÂ
		//»áµ¼Ö³ÔʳÎïµÄʱºòÖ»³Ôµ½Ò»°ë
		if (food.x % 2 == 0)
			break;
	}
	//½«¹â±êÒƵ½Ê³ÎïµÄ×ø±ê´¦´òӡʳÎï
	gotoxy(food.x, food.y);
	printf("*");
	//³õʼ»¯ÉßµÄÊôÐÔ
	snake.len = 3;
	snake.speed = 200;
	//ÔÚÆÁÄ»ÖмäÉú³ÉÉßÍ·
	snake.x[0] = MAPWIDTH / 2 + 1;//x×ø±êΪżÊý
	snake.y[0] = MAPHEIGHT / 2;
	//´òÓ¡ÉßÍ·
	gotoxy(snake.x[0], snake.y[0]);
	//printf("¡ö-------------------------------------------------");
	//Éú³É³õÊÔµÄÉßÉí
	for (i = 1; i < snake.len; i++)
	{
		//ÉßÉíµÄ´òÓ¡£¬×Ý×ø±ê²»±ä£¬ºá×ø±êΪÉÏÒ»½ÚÉßÉíµÄ×ø±êÖµ+2
		snake.x[i] = snake.x[i - 1] + 2;
		snake.y[i] = snake.y[i - 1];
		gotoxy(snake.x[i], snake.y[i]);
		printf("#");
	}
	//´òÓ¡ÍêÉßÉíºó½«¹â±êÒƵ½ÆÁÄ»×îÉÏ·½£¬±ÜÃâ¹â±êÔÚÉßÉí´¦Ò»Ö±ÉÁ˸
	gotoxy(MAPWIDTH - 2, 0);
	return;
}

void keyDown()
{
	int pre_key = key;//¼Ç¼ǰһ¸ö°´¼üµÄ·½Ïò
	if (_kbhit())//Èç¹ûÓû§°´ÏÂÁ˼üÅÌÖеÄij¸ö¼ü
	{
		fflush(stdin);//Çå¿Õ»º³åÇøµÄ×Ö·û
 
		//getch()¶ÁÈ¡·½Ïò¼üµÄʱºò£¬»á·µ»ØÁ½´Î£¬µÚÒ»´Îµ÷Ó÷µ»Ø0»òÕß224£¬µÚ¶þ´Îµ÷Ó÷µ»ØµÄ²ÅÊÇʵ¼ÊÖµ
		key = _getch();//µÚÒ»´Îµ÷Ó÷µ»ØµÄ²»ÊÇʵ¼ÊÖµ
		key = _getch();//µÚ¶þ´Îµ÷Ó÷µ»Øʵ¼ÊÖµ
	}
	/*
	*ÉßÒƶ¯Ê±ºòÏȲÁÈ¥ÉßβµÄÒ»½Ú
	*changeFlagΪ0±íÃ÷´ËʱûÓгԵ½Ê³ÎÒò´Ëÿ×ßÒ»²½¾ÍÒª²Á³ýµôÉß⣬ÒÔ´ËÓªÔìÒ»¸öÒƶ¯µÄЧ¹û
	*Ϊ1±íÃ÷³Ôµ½ÁËʳÎ¾Í²»ÐèÒª²Á³ýÉß⣬ÒÔ´ËÓªÔìÒ»¸öÉßÉíÔö³¤µÄЧ¹û
	*/
	if (changeFlag == 0)
	{
		gotoxy(snake.x[snake.len - 1], snake.y[snake.len - 1]);
		printf("  ");//ÔÚÉßβ´¦Êä³ö¿Õ¸ñ¼´²ÁÈ¥Éßβ
	}
	//½«ÉßµÄÿһ½ÚÒÀ´ÎÏòÇ°Òƶ¯Ò»½Ú£¨ÉßÍ·³ýÍ⣩
	for (i = snake.len - 1; i > 0; i--)
	{
		snake.x[i] = snake.x[i - 1];
		snake.y[i] = snake.y[i - 1];
	}
	//Éßµ±Ç°Òƶ¯µÄ·½Ïò²»ÄܺÍÇ°Ò»´ÎµÄ·½ÏòÏà·´£¬±ÈÈçÉßÍù×ó×ßµÄʱºò²»ÄÜÖ±½Ó°´ÓÒ¼üÍùÓÒ×ß
	//Èç¹ûµ±Ç°Òƶ¯·½ÏòºÍÇ°Ò»´Î·½ÏòÏà·´µÄ»°£¬°Ñµ±Ç°Òƶ¯µÄ·½Ïò¸ÄΪǰһ´ÎµÄ·½Ïò
	if (pre_key == 72 && key == 80)
		key = 72;
	if (pre_key == 80 && key == 72)
		key = 80;
	if (pre_key == 75 && key == 77)
		key = 75;
	if (pre_key == 77 && key == 75)
		key = 77;
	/**
	*¿ØÖÆ̨°´¼üËù´ú±íµÄÊý×Ö
	*¡°¡ü¡±£º72
	*¡°¡ý¡±£º80
	*¡°¡û¡±£º75
	*¡°¡ú¡±£º77
	*/
	//ÅжÏÉßÍ·Ó¦¸ÃÍùÄĸö·½ÏòÒƶ¯
	switch (key)
	{
	case 75:
		snake.x[0] -= 2;
		break;
	case 77:
		snake.x[0] += 2;
		break;
	case 72:
		snake.y[0]--;
		break;
	case 80:
		snake.y[0]++;
		break;
	}
	gotoxy(snake.x[0], snake.y[0]);
	printf("O");
	gotoxy(MAPWIDTH - 2, 0);
	
	changeFlag = 0;
	return;
}
void createFood()
{ 
	if (snake.x[0] == food.x && snake.y[0] == food.y)
	{
		while (1)
		{
			int flag = 1;
			srand((unsigned int)time(NULL));
			food.x = rand() % (MAPWIDTH - 4) + 2;
			food.y = rand() % (MAPHEIGHT - 2) + 1;
			for (i = 0; i < snake.len; i++)
			{
				if (snake.x[i] == food.x && snake.y[i] == food.y)
				{
					flag = 0;
					break;
				}
			}
			if (flag && food.x % 2 == 0)
				break;
		}
		gotoxy(food.x, food.y);
		printf("*");
		snake.len++;
		sorce += 10;
		snake.speed -= 5;
		changeFlag = 1;
	}
	return;
}
bool snakeStatus()
{
	if (snake.y[0] == 0 || snake.y[0] == MAPHEIGHT)
		return false;
	if (snake.x[0] == 0 || snake.x[0] == MAPWIDTH)
		return false;
	for (i = 1; i < snake.len; i++)
	{
		if (snake.x[i] == snake.x[0] && snake.y[i] == snake.y[0])
			return false;
	}
	return true;
}

int main()
{
    drawMap();
	while (1)
	{
		keyDown();
		if (!snakeStatus())
			break;
		createFood();
		Sleep(snake.speed);
	}
 
	gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2);
	printf("Game Over!\n");
	gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 1);
	printf("±¾´ÎÓÎÏ·µÃ·ÖΪ£º%d\n", sorce);
	if(sorce>=100&&sorce<200)
	{
		printf("\n");
		gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 2);
		printf("Good,Mission accomplished.");
	}else if(sorce>=200)
	{
		printf("\n");
		gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 2);
		printf("You is NB boy.");
	}else if(sorce<50&&sorce>=1)
	{
		printf("\n");
		gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 2);
		printf("Mission out.");
	}else if(sorce==0)
	{
		printf("\n");
		gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 2);
		printf("Are you ok?");
	}else if(sorce>=50&&sorce<100)
	{
		printf("\n");
		gotoxy(MAPWIDTH / 2, MAPHEIGHT / 2 + 2);
		printf("just so so.");
	}
	Sleep(5000);
	
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是完整的 C 语言贪吃蛇游戏代码: ```c #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <time.h> #include <windows.h> #define BOARD_WIDTH 20 #define BOARD_HEIGHT 20 typedef struct { int x; int y; } SnakePart; typedef struct { SnakePart parts[100]; int length; } Snake; int board[BOARD_WIDTH][BOARD_HEIGHT]; void init_board() { for (int i = 0; i < BOARD_WIDTH; i++) { for (int j = 0; j < BOARD_HEIGHT; j++) { board[i][j] = 0; } } } void draw_snake(Snake* snake) { for (int i = 0; i < snake->length; i++) { board[snake->parts[i].x][snake->parts[i].y] = 1; } } void move_snake(Snake* snake, int direction) { SnakePart new_part = { snake->parts[0].x, snake->parts[0].y }; switch (direction) { case 0: new_part.y--; break; // 上 case 1: new_part.x++; break; // 右 case 2: new_part.y++; break; // 下 case 3: new_part.x--; break; // 左 } snake->length++; for (int i = snake->length - 1; i > 0; i--) { snake->parts[i] = snake->parts[i - 1]; } snake->parts[0] = new_part; board[snake->parts[snake->length - 1].x][snake->parts[snake->length - 1].y] = 0; snake->length--; } int check_food(Snake* snake, SnakePart food) { if (snake->parts[0].x == food.x && snake->parts[0].y == food.y) { snake->length++; snake->parts[snake->length - 1] = food; return 1; } return 0; } int main() { init_board(); Snake snake = { { {10, 10}, {10, 9}, {10, 8} }, 3 }; draw_snake(&snake); SnakePart food = { 5, 5 }; board[food.x][food.y] = 2; int direction = 0; while (1) { if (kbhit()) { switch (getch()) { case 'w': direction = 0; break; case 'd': direction = 1; break; case 's': direction = 2; break; case 'a': direction = 3; break; } } move_snake(&snake, direction); if (check_food(&snake, food)) { srand(time(NULL)); food.x = rand() % BOARD_WIDTH; food.y = rand() % BOARD_HEIGHT; board[food.x][food.y] = 2; } system("cls"); for (int i = 0; i < BOARD_WIDTH; i++) { for (int j = 0; j < BOARD_HEIGHT; j++) { if (board[i][j] == 0) { printf(" "); } else if (board[i][j] == 1) { printf("O"); } else if (board[i][j] == 2) { printf("*"); } } printf("\n"); } Sleep(100); } return 0; } ``` 在这个代码中,我们使用了 Windows.h 库中的 Sleep 函数来控制游戏循环的速度,以保证游戏运行的流畅性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值