贪吃蛇 C语言实现代码

C语言实现贪吃蛇

 
#include<stdio.h>
#include<stdlib.h>    
#include<time.h>    
#include<conio.h>    
#include<Windows.h>    
#define FRAME 3    
#define INFO 50    
#define WIDTH 40    
#define LENGTH 25    
void setColor(int x, int y)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	WORD word = x + y * 0x10;
	SetConsoleTextAttribute(handle, word);
}
void setPosition(int x, int y)
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD coord = { x,y };
	SetConsoleCursorPosition(handle, coord);
}
typedef struct _snake {
	int x[50];
	int y[50];
	int speed;
	int count;
	int length;
}Snake;
typedef struct _food {
	int x;
	int y;
}Food;
Snake snakeArray[2] = {
	{ { FRAME + 4 },{ FRAME + 4 },170,0,3 },
	{ { FRAME + 4 },{ FRAME + 4 },170,0,3 }
};
Food foodArray;
Snake* snake;
Food* food;
int i, j;
int deCoord[2];
int Time = 120;
void start()
{
	char  ch;
	int X = FRAME, Y = FRAME + 4;
	setPosition(FRAME, FRAME);
	printf("方向键移动光标,回车键确定(游戏前请关闭输入法!!!!)");
	setPosition(FRAME * 5, FRAME * 4);
	printf("kawayi90hou     贪吃蛇1.0");
	while (1)
	{
		setPosition(FRAME, FRAME + 4);
		if (X == FRAME&&Y == FRAME + 4)setColor(0, 10);
		printf("开始游戏");
		setColor(10, 0);
		setPosition(FRAME, FRAME + 6);
		if (X == FRAME&&Y == FRAME + 6)setColor(0, 10);
		printf("结束游戏");
		ch = getch();
		if (ch == 80)Y += 2;
		if (ch == 72)Y -= 2;
		if (Y < FRAME + 4)Y = FRAME + 6;
		if (Y > FRAME + 6)Y = FRAME + 4;
		if (ch == '\r')
		{
			switch (Y)
			{
			case FRAME + 4:
				system("cls");//清屏    
				break;
			case FRAME + 6:
				exit(0);
				break;
			}
			return;
		}
	}
}
void InitSnake()
{
	snake = &snakeArray[0];
	food = &foodArray;
	for (i = 1; i < snake->length; i++)
	{
		snake->x[i] = snake->x[i - 1] + 2;
		snake->y[i] = snake->y[i - 1];
	}
}
void printSnake()
{
	for (i = 0; i < snake->length; i++)
	{
		setPosition(snake->x[i], snake->y[i]);
		if (i == 0)printf("◆"); //★●■    
		else if (i == snake->length - 1)printf("■");
		else printf("●");
	}
}
void Map()
{
	for (i = 0; i < WIDTH + 1; i += 2)
	{
		setPosition(FRAME + i, FRAME);
		printf("■");
		setPosition(FRAME + i, FRAME + LENGTH);
		printf("■");
	}
	for (i = 0; i < LENGTH + 1; i++)
	{
		setPosition(FRAME, FRAME + i);
		printf("■");
		setPosition(FRAME + WIDTH, FRAME + i);
		printf("■");
	}
	setColor(13, 0);
	setPosition(INFO - 1, 2);
	printf("游戏说明:");
	setPosition(INFO, 4);
	printf("按方向键控制移动");
	setPosition(INFO, 5);
	printf("长按移动键可以加速");
	setPosition(INFO, 6);
	printf("时间为0时游戏结束");
	setPosition(INFO, 7);
	printf("按空格键暂停");
}
void moveSnake()
{
	setPosition(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 printFood()
{
	srand(time(NULL));
	food->x = 2 * (rand() % (WIDTH - 4) / 2) + FRAME + 2;//必须保证所得的x坐标为偶数    
	food->y = 2 * (rand() % (LENGTH - 2) / 2) + FRAME + 1;
	for (i = 0; i < snake->length; i++)
	{
		if (food->x == snake->x[i] && food->y == snake->y[i])
		{
			printFood();//重新随机产生一个食物    
		}
	}
	if (i == snake->length)
	{
		setPosition(food->x, food->y);
		printf("★");
		return;//原来的食物被移动函数自带的空格符号清除    
	}
}
void eatFood()
{
	if (snake->x[snake->length - 1] == food->x&&snake->y[snake->length - 1] == food->y)
	{
		snake->length++;
		for (i = snake->length - 1; i > 0; i--)//要不包括蛇头    
		{
			snake->x[i] = snake->x[i - 1];
			snake->y[i] = snake->y[i - 1];
		}
		snake->x[0] = deCoord[0];//蛇尾坐标倒退一位    
		snake->y[0] = deCoord[1];
		snake->count++;
		if (snake->count % 3 == 0)snake->speed -= 20;
		printFood();
	}
}
int ifDead()
{
	if (snake->x[snake->length - 1] == FRAME || snake->x[snake->length - 1] == FRAME + WIDTH)return 0;
	if (snake->y[snake->length - 1] == FRAME || snake->y[snake->length - 1] == FRAME + LENGTH)return 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 Info()
{
	//用来获取程序运行的时间    
	setColor(11, 0);
	setPosition(INFO - 1, 15);
	printf("贪吃蛇信息:");
	setPosition(INFO, 17);
	printf("速度:%d", snake->speed);
	setPosition(INFO, 18);
	printf("长度:%d", snake->length);
	setPosition(INFO, 19);
	printf("分数:%d", snake->count);
	setColor(14, 0);
	setPosition(INFO - 1, 21);
	printf("剩余时间:%d", Time);
}
int main()
{
	char key;
	setColor(10, 0);
	start();
	InitSnake();
	//定义的计时变量  
	clock_t start, end;
	start = clock();
	Map();
	Info();
	printSnake();
	printFood();
	key = getch();
	while (1)
	{
		deCoord[0] = snake->x[0];//在吃掉食物前的一个坐标    
		deCoord[1] = snake->y[0];
		j = 0;
		if (kbhit())
		{
			key = getch();
			if (kbhit())
			{
				Sleep(20);
				j = 1;
			}
		}
		switch (key)
		{
		case 72:
			moveSnake();
			snake->y[snake->length - 1]--;
			break;
		case 80:
			moveSnake();
			snake->y[snake->length - 1]++;
			break;
		case 75:
			moveSnake();
			snake->x[snake->length - 1] -= 2;
			break;
		case 77:
			moveSnake();
			snake->x[snake->length - 1] += 2;
			break;
		}
		printSnake();
		eatFood();
		end = clock();//要在程序执行到的那一刻用这个函数  
		Time = 120 - (end - start) / CLOCKS_PER_SEC;
		Info();
		if (j == 1)Sleep(20);
		else Sleep(snake->speed);
		if (ifDead() == 0 || snake->speed == 0)
		{
			setColor(12, 0);
			if (ifDead() == 0)
			{
				setPosition(FRAME + 12, LENGTH / 2);
				printf("G A M E O V E R");
			}
			if (snake->speed == 0)
			{
				setPosition(FRAME + 6, LENGTH / 2);
				printf("GONGRATULATIONS");
			}
			setPosition(FRAME + 8, LENGTH / 2 + 1);
			printf("1:继续  2:重来  3:退出");
			key = getch();
			if (key == '1' || key == '2')
			{
				system("cls");
				setColor(10, 0);
				if (key == '2') snakeArray[0] = snakeArray[1];
				InitSnake();
				Map();
				Info();
				printSnake();
				printFood();
				key = getch();
				continue;
			}
			if (key == '3') break;
		}
	}
	return 0;
}

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个简单的贪吃蛇游戏的 C 语言程序代码: ```c #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> #define MAX_LENGTH 100 int width = 20; // 游戏窗口宽度 int height = 20; // 游戏窗口高度 int x, y; // 蛇头坐标 int food_x, food_y; // 食物坐标 int score; // 得分 int tail_x[MAX_LENGTH], tail_y[MAX_LENGTH]; // 蛇身坐标 int tail_length; // 蛇身长度 enum direction {STOP = 0, LEFT, RIGHT, UP, DOWN}; // 方向控制 enum direction dir; void init() { x = width / 2; y = height / 2; food_x = rand() % width; food_y = rand() % height; score = 0; dir = STOP; } void draw() { system("cls"); for (int i = 0; i < width+2; i++) printf("#"); printf("\n"); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { if (j == 0) printf("#"); if (i == y && j == x) printf("O"); else if (i == food_y && j == food_x) printf("F"); else { int flag = 0; for (int k = 0; k < tail_length; k++) { if (tail_x[k] == j && tail_y[k] == i) { printf("o"); flag = 1; } } if (!flag) printf(" "); } if (j == width - 1) printf("#"); } printf("\n"); } for (int i = 0; i < width+2; i++) printf("#"); printf("\n"); printf("Score: %d\n", score); } void input() { if (kbhit()) { switch (getch()) { case 'a': dir = LEFT; break; case 'd': dir = RIGHT; break; case 'w': dir = UP; break; case 's': dir = DOWN; break; case 'x': dir = STOP; break; case 'q': exit(0); break; } } } void logic() { int prev_x = tail_x[0], prev_y = tail_y[0]; int prev2_x, prev2_y; tail_x[0] = x; tail_y[0] = y; for (int i = 1; i < tail_length; i++) { prev2_x = tail_x[i]; prev2_y = tail_y[i]; tail_x[i] = prev_x; tail_y[i] = prev_y; prev_x = prev2_x; prev_y = prev2_y; } switch (dir) { case LEFT: x--; break; case RIGHT: x++; break; case UP: y--; break; case DOWN: y++; break; } if (x >= width) x = 0; else if (x < 0) x = width - 1; if (y >= height) y = 0; else if (y < 0) y = height - 1; for (int i = 0; i < tail_length; i++) { if (tail_x[i] == x && tail_y[i] == y) { score = 0; tail_length = 0; } } if (x == food_x && y == food_y) { score += 10; food_x = rand() % width; food_y = rand() % height; tail_length++; } } int main() { init(); while (1) { draw(); input(); logic(); Sleep(100); } return 0; } ``` 这个程序使用了 Windows.h 头文件,所以只能在 Windows 系统上运行。如果需要在其他系统上运行,需要将 `system("cls")` 改为相应的清屏命令。 ### 回答2: 贪吃蛇是一款经典的游戏,一般由一个蛇和苹果组成。游戏目标是控制蛇吃苹果,每吃到一个苹果蛇身长度增加一节。如果蛇头撞到蛇身或者撞墙,则游戏结束。 以下是一个简单的贪吃蛇C语言程序代码: ```c #include <stdio.h> #include <conio.h> #include <windows.h> #define WIDTH 20 #define HEIGHT 15 int score; int gameOver; int x, y; // 蛇头的坐标 int fruitX, fruitY; // 苹果的坐标 int tailX[100], tailY[100]; // 蛇身的坐标 int tailLength; enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN }; enum eDirection dir; void Setup() { gameOver = 0; dir = STOP; x = WIDTH / 2; y = HEIGHT / 2; fruitX = rand() % WIDTH; fruitY = rand() % HEIGHT; score = 0; } void Draw() { system("cls"); for (int i = 0; i < WIDTH + 2; i++) printf("#"); printf("\n"); for (int i = 0; i < HEIGHT; i++) { for (int j = 0; j < WIDTH; j++) { if (j == 0) printf("#"); if (i == y && j == x) printf("O"); else if (i == fruitY && j == fruitX) printf("F"); else { int printTail = 0; for (int k = 0; k < tailLength; k++) { if (tailX[k] == j && tailY[k] == i) { printf("o"); printTail = 1; } } if (!printTail) printf(" "); } if (j == WIDTH - 1) printf("#"); } printf("\n"); } for (int i = 0; i < WIDTH + 2; i++) printf("#"); printf("\n"); printf("Score: %d\n", score); } void Input() { if (_kbhit()) { switch (_getch()) { case 'a': dir = LEFT; break; case 'd': dir = RIGHT; break; case 'w': dir = UP; break; case 's': dir = DOWN; break; case 'x': gameOver = 1; break; } } void Logic() { int prevX = tailX[0]; int prevY = tailY[0]; int prev2X, prev2Y; tailX[0] = x; tailY[0] = y; for (int i = 1; i < tailLength; i++) { prev2X = tailX[i]; prev2Y = tailY[i]; tailX[i] = prevX; tailY[i] = prevY; prevX = prev2X; prevY = prev2Y; } switch (dir) { case LEFT: x--; break; case RIGHT: x++; break; case UP: y--; break; case DOWN: y++; break; } if (x >= WIDTH) x = 0; else if (x < 0) x = WIDTH - 1; if (y >= HEIGHT) y = 0; else if (y < 0) y = HEIGHT - 1; for (int i = 0; i < tailLength; i++) { if (tailX[i] == x && tailY[i] == y) { gameOver = 1; break; } } if (x == fruitX && y == fruitY) { score += 10; fruitX = rand() % WIDTH; fruitY = rand() % HEIGHT; tailLength++; } } int main() { Setup(); while (!gameOver) { Draw(); Input(); Logic(); Sleep(10); // 控制帧率 } return 0; } ``` 这个C语言程序通过控制台绘制了一个贪吃蛇游戏界面。可以使用键盘的ADWS键来控制蛇的移动方向,X键用来退出游戏。贪吃蛇移动时,每吃到一个苹果分数增加10分,同时长度也会增加一节。如果蛇头撞到蛇身或者撞墙,则游戏结束。 ### 回答3: 贪吃蛇是一款经典的游戏,在C语言中编写贪吃蛇的程序代码相当有趣。 首先,我们需要定义一些常量,如窗口宽度、高度、蛇身长度等。然后,我们需要定义蛇的结构体,包括蛇头位置、蛇身数组、蛇的长度等成员变量。 接下来,我们需要实现一些基本的功能函数,如初始化蛇头位置、绘制蛇身、处理键盘输入等。在每次游戏循环中,我们需要不断更新蛇的位置,并处理碰撞事件,如蛇头与边界、自身以及食物的碰撞。 当蛇头与食物碰撞时,蛇的长度增加,然后随机生成一个新的食物位置。同时,我们还需要实现一个函数来判断游戏是否结束,即蛇头与边界或自身碰撞。 在游戏主循环中,我们通过不断更新蛇的位置,并根据用户的输入来改变蛇的方向。通过不断刷新屏幕来实现动画效果,让蛇在窗口中移动。 最后,在主函数中调用以上函数,并通过一个循环来控制游戏的进行。当游戏结束时,展示最终得分,并询问玩家是否重新开始游戏。 总之,贪吃蛇C语言程序代码实现起来并不复杂,主要涉及蛇的移动、碰撞检测以及界面的绘制等基本操作。有了上述的框架和思路,我们就可以编写出一个简单而有趣的贪吃蛇游戏了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值