c语言初学者试写贪吃蛇

翻出来之前用c语言写的贪吃蛇,语法都比较简单,希望可以交流一下并给一点建议。

源码:

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

void Welcome();             //欢迎界面
void Finish();              //结束界面
void Over();                //通关界面
void Start();               //游戏界面
void Display(int x, int y);  //打印蛇
void DisplayFood(int x, int y);//打印食物
int GameOver();             //失败判定
void Up();                  //往上走
void Down();                //往下走
void Left();                //往左走
void Right();               //往右走
void Produce();             //产生食物
void Eat();                 //吃球后变长
void HideCursor();          //隐藏光标

typedef struct Snakes
{
	int x;
	int y;
}snake;

char direction;             //蛇的移动方向
snake s[362];               //蛇
int foodx, foody;           //食物的坐标
int len;                    //蛇的长度
int difficult;              //定义难度

int main() {
	system("color F1");
	HideCursor();
	Welcome();

	return 0;
}

void Display(int x, int y)
{
	COORD t;
	HANDLE hOutput;
	t.X = x;
	t.Y = y;
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOutput, t);
	printf("■");
}

void DisplayFood(int x, int y)
{
	COORD t;
	HANDLE hOutput;
	t.X = x;
	t.Y = y;
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOutput, t);
	printf("○");
}

void Welcome()
{
	system("mode con cols=53 lines=20");
	difficult = 1000;
	for (int i = 5; i > 0; i--) {
		system("cls");
		printf("*****************************************************\n\n\n\n\n\n\n\n");
		printf("*                  游戏将于%ds后开始                 *\n", i);
		printf("*           可以按数字1—3获得你想要的难度          *\n");
		printf("*                    使用wasd控制                   *\n\n\n\n\n\n\n\n");
		printf("*****************************************************\n");
		Sleep(1000);
		while (_kbhit()) {
			int ch = _getch();
			if (ch == 49)
				difficult = 1000;
			else if (ch == 50)
				difficult = 750;
			else if (ch == 51)
				difficult = 500;
			else
			{
				system("cls");
				printf("输入有误,重新开始");
				Sleep(2000);
				Welcome();
			}
		}
	}
	Start();
}

void Start()
{
	system("mode con cols=44 lines=23");
	//初始化蛇
	s[0].x = 5;
	s[0].y = 3;
	direction = 'd';
	len = 1;
	Produce();

	while (GameOver() && len < 361)
	{
		system("cls");

		printf("您的成绩为%d", len);

		//生成边框
		for (int i = 1; i <= 39; i += 2)
			Display(i, 1);
		for (int i = 1; i <= 39; i += 2)
			Display(i, 21);
		for (int i = 1; i <= 21; i++)
			Display(1, i);
		for (int i = 1; i <= 21; i++)
			Display(39, i);

		Eat();

		//生成蛇
		for (int i = 0; i < len; i++) {
			Display(s[i].x, s[i].y);
		}

		//重新生成食物
		DisplayFood(foodx, foody);

		Sleep(difficult);

		//捕获键盘输入
		while (_kbhit())
		{
			int	ch;
			ch = _getch();

			if (ch == 119 && direction != 's')
				direction = 'w';
			if (ch == 97 && direction != 'd')
				direction = 'a';
			if (ch == 115 && direction != 'w')
				direction = 's';
			if (ch == 100 && direction != 'a')
				direction = 'd';
		}

		if (direction == 'w')
			Up();
		if (direction == 'a')
			Left();
		if (direction == 's')
			Down();
		if (direction == 'd')
			Right();
	}
	if (len < 361)
		Finish();
	else
		Over();
}

void Up()
{
	s[361] = s[len - 1];
	for (int i = len; i >1; i--) {
		s[i - 1] = s[i - 2];
	}
	s[0].y = s[0].y - 1;
}

void Down()
{
	s[361] = s[len - 1];
	for (int i = len; i > 1; i--) {
		s[i - 1] = s[i - 2];
	}
	s[0].y = s[0].y + 1;
}

void Left()
{
	s[361] = s[len - 1];
	for (int i = len; i > 1; i--) {
		s[i - 1] = s[i - 2];
	}
	s[0].x = s[0].x - 2;
}

void Right()
{
	s[361] = s[len - 1];
	for (int i = len; i > 1; i--) {
		s[i - 1] = s[i - 2];
	}
	s[0].x = s[0].x + 2;
}

int GameOver()
{
	if (len < 5) {
		if (s[0].x == 1 || s[0].x == 39 || s[0].y == 1 || s[0].y == 21)
			return 0;
		else
			return 1;
	}
	else {
		for (int i = 4; i <= len; i++) {
			if ((s[0].x == s[i].x) && (s[0].y == s[i].y) || s[0].x == 1 || s[0].x == 39 || s[0].y == 1 || s[0].y == 21)
				return 0;
			else
				return 1;
		}
	}
}

void Produce()
{
	srand(time(0));
	foodx = (rand() % 18) * 2 + 3;
	foody = rand() % 19 + 2;
}

void Eat()
{
	if (s[0].x == foodx && s[0].y == foody)
	{
		len++;
		Produce();
		s[len - 1] = s[361];
	}
}

void Finish()
{
	system("mode con cols=53 lines=21");
	for (int i = 5; i >= 1; i--) {
		system("cls");
		printf("*****************************************************\n\n\n\n\n\n\n\n");
		printf("*                      游戏结束                    *\n");
		printf("*                    您的成绩为%d                   *\n", len);
		printf("*                  游戏将于%ds后退出                *\n", i);
		printf("*                 或者按F键重新开始                *\n\n\n\n\n\n\n\n");
		printf("*****************************************************\n");
		Sleep(1000);
		while (_kbhit()) {
			int ch = _getch();
			if (ch == 102)
				Welcome();
		}
	}
}

void Over()
{
	system("cls");
	printf("*****************************************************\n\n\n\n\n\n\n\n");
	printf("*                       恭喜您                    *\n");
	printf("*                    您已达到最大长度                   *\n\n\n\n\n\n\n\n");
	printf("*****************************************************\n");
	Sleep(5000);
	system("cls");
	printf("*****************************************************\n\n\n\n\n\n\n\n");
	printf("*                   按任意键退出                   *\n\n\n\n\n\n\n\n");
	printf("*****************************************************\n");
	system("exit");
}

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

程序截图:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

有一点忘了,就是生成食物的时候没有比较食物是否在蛇身上,如果在就重新生成食物,加上这一点就可以了。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 可以用 C 语言来编贪吃小游戏。C 语言是一种通用的、结构化的编程语言,具有较高的灵活性和可移植性,可以用来开发各种软件,包括游戏。如果你想学习编贪吃小游戏,可以先了解 C 语言的基础知识,然后学习如何使用 C 语言的图形库来绘制图像并在屏幕上控制移动。还可以学习如何使用 C 语言的键盘输入函数来控制贪吃的移动方向。通过努力学习和实践,你就可以用 C 语言来编贪吃小游戏了。 ### 回答2: 可以用C语言一个贪吃小游戏。C语言是一种功能强大的高级编程语言,可以用于开发各种应用程序,包括游戏。贪吃是一款简单但经典的游戏,非常适合用C语言实现。 在C语言中,可以使用控制台窗口进行字符绘制和用户输入的处理。贪吃游戏的实现主要包括以下几个方面: 1. 绘制游戏界面:使用C语言中的字符输出函数,如printf()函数,根据游戏状态和的位置,绘制、食物和边界等元素。 2. 处理用户输入:通过C语言中的输入函数,如scanf()函数,获取用户的键盘输入,实现的控制。 3. 更新游戏状态:根据的移动和吃食物的情况,更新的位置和长度,同时生成新的食物。 4. 判断游戏结束:当碰到边界或者碰到自己身体时,游戏结束。通过判断游戏状态,提示游戏结果。 通过以上步骤的循环执行,即可实现贪吃小游戏。C语言的灵活性和底层控制能力,使其成为一个很好的选择用于编此类小游戏。编贪吃小游戏可以帮助学习C语言的基本语法和算法思维,同时也能加深对游戏开发原理的理解。 ### 回答3: 可以用C语言一个贪吃小游戏。贪吃是一款非常经典的游戏,它的操作简单、规则清晰,因此非常适合用C语言来实现。 在用C语言贪吃游戏时,首先需要定义贪吃的数据结构。通常使用链表或者数组来表示的身体,用一个变量来表示的长度。接下来需要定义的移动规则,即根据用户的输入改变的位置,并判断与食物的碰撞情况来决定是否增加的长度。还需要考虑与边界的碰撞,如果撞到边界则游戏结束。 在编游戏界面时,可以使用C语言提供的终端输出函数来绘制的身体、食物和边界等元素。可以使用循环和条件语句来不断更新界面,实现游戏的动态效果。 此外,还可以增加一些额外的功能,如计分、速度控制、难度选择等,以增加游戏的趣味和挑战性。 总之,用C语言贪吃小游戏是完全可行的,通过合理的算法和数据结构设计,配合合适的界面绘制方法,可以实现一个简单却有趣的贪吃游戏。这也是很多初学者学习C语言的一个常见的练手项目。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值