项目实践---贪吃蛇小游戏(下)

这篇具有很好参考价值的文章主要介绍了项目实践---贪吃蛇小游戏(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目实践---贪吃蛇小游戏(下),数据结构,算法,函数,java,服务器,前端

  • 对于贪吃蛇小游戏,最主要的还是主函数部分,这里就和大家一一列举出来,
  • 上一章已经写过头文件了,这里就不多介绍了。
  • 首先就是打印桌面,也就是背景,则对应的代码为:
void SetPos(short x, short y)
{
	//获取标准输出设备的句柄
	HANDLE houtput = NULL;
	houtput = GetStdHandle(STD_OUTPUT_HANDLE);


	//定位光标的位置
	COORD pos = { x,y };
	SetConsoleCursorPosition(houtput, pos);
}


void WelcomeToGame()
{
	system("cls");
	SetPos(40, 14);
	wprintf(L"欢迎来到贪吃蛇小游戏\n");
	SetPos(42, 20);
	system("pause");
	system("cls");
	SetPos(35, 14);
	wprintf(L"用 w.s.a.d来控制蛇的移动,按q加速,e减速\n");
	SetPos(35, 15);
	wprintf(L"加速能够得到更高的分数\n");

	SetPos(42, 20);
	system("pause");
	system("cls");

}
  • 然后就是打印墙体,在打印墙体之前,要先声明一下类型,用#define,来定义。则对应的代码为:
void CreateMap()
{
	//上
	int i = 0;
	SetPos(0, 0);
	for (i = 0; i < 58; i ++)
	{
		wprintf(L"%lc", WALL);
	}

	//下
	SetPos(0, 26);
	for (i = 0; i < 58; i++) 
	{
		wprintf(L"%lc", WALL);
	}

	//左
	for (i = 1; i <= 26; i++)
	{
		SetPos(0, i);
		wprintf(L"%lc", WALL);
	}

	//右
	for (i = 1; i <= 26; i++)
	{
		SetPos(56, i);
		wprintf(L"%lc",WALL);

	}
}
  • 然后就是创建蛇身(用链表来实现)和食物,则代码为:
    void InitSnake(pSnake ps)
    {
    	int i = 0;
    	pSnakeNode cur = NULL;
    
    	for (i = 0; i < 6; i++)
    	{
    		cur = (pSnakeNode)malloc(sizeof(SnakeNode));
    		if (cur == NULL)
    		{
    			perror("InitSnake()::malloc");
    			return;
    		}
    		cur->next = NULL;
    		cur->x = POS_X + 2 * i;
    		cur->y = POS_Y;
    
    		//头插法插入链表
    
    		if (ps->_pSnake == NULL)  //空链表
    		{
    			ps->_pSnake = cur;
    		}
    		else  //非空
    		{
    			cur->next = ps->_pSnake;
    			ps->_pSnake = cur;
    		}
    	}
    
    	cur = ps->_pSnake;
    	while (cur)
    	{
    		SetPos(cur->x, cur->y);
    		wprintf(L"%lc", BODY);
    		cur = cur->next;
    	}
    
    
    	//设置贪吃蛇得属性
    	ps->_dir = RIGHT; //默认向右
    	ps->_score = 0;
    	ps->_food_weight = 10;
    	ps->_sleep_time = 200;   //单位是ms
    	ps->_status = OK;
    }
    
    
    void CreateFood(pSnake ps)
    {
    	int x = 0;
    	int y = 0;
    
    
    	//生成2的倍数
    	//x:2~53
    	//y:1~25
    
    again:
    	do
    	{
    		x = rand() % 53 + 2;
    		y = rand() % 25 + 1;
    	} while (x % 2 != 0);
    
    
    	//x和y的坐标不能和蛇的身体坐标冲突
    
    
    	pSnakeNode cur = ps->_pSnake;
    	while(cur)
    	{
    		if (x == cur->x && y == cur->y)
    		{
    			goto again;
    		}
    
    		cur = cur->next;
    	}
    
    	//创建食物的节点
    
    	pSnakeNode pFood = (pSnakeNode)malloc(sizeof(SnakeNode));
    	if (pFood == NULL)
    	{
    		return;
    	}
    	pFood->x = x;
    	pFood->y = y;
    	pFood->next = NULL;
    
    	SetPos(x, y);//定义位置
    
    	wprintf(L"%lc", FOOD);
    	ps->_pFood = pFood;
    }

    有点小多,请耐心看完哦。

  • 蛇的移步和游戏的初始化,则代码为:
    void GameStart(pSnake ps)
    {
    	//1.先设置窗口得大小,再光标隐藏
    	system("mode con cols = 100 lines = 30");
    	system("title 贪吃蛇");
    	HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE);
    
    	//隐藏光标操作
    	CONSOLE_CURSOR_INFO CursorInfo;
    	GetConsoleCursorInfo(houtput, &CursorInfo);//获取控制台光标信息
    	CursorInfo.bVisible = false; //隐藏控制台光标
    	SetConsoleCursorInfo(houtput, &CursorInfo);  //设置控制台光标状态
    
    	//2.打印环境界面和功能介绍
    	WelcomeToGame();
    
    	//3.绘制地图
    	CreateMap();
    
    	//4.创建蛇
    	InitSnake(ps);
    
    	//5.创建食物
    	CreateFood(ps);
    }
    
    void SnakeMove(pSnake ps)
    {
    	//创建一个节点,表示蛇即将到的下一个节点
    	pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode));
    	if (pNextNode == NULL)
    	{
    		perror("SnakeMove()::malloc()");
    		return;
    	}
    	switch (ps->_dir)
    	{
    	case UP:
    		pNextNode->x = ps->_pSnake->x;
    		pNextNode->y = ps->_pSnake->y - 1;
    		break;
    
    	case DOWN:
    		pNextNode->x = ps->_pSnake->x;
    		pNextNode->y = ps->_pSnake->y + 1;
    		break;
    
    	case LEFT:
    		pNextNode->x = ps->_pSnake->x-2;
    		pNextNode->y = ps->_pSnake->y;
    		break;
    
    	case RIGHT:
    		pNextNode->x = ps->_pSnake->x+2;
    		pNextNode->y = ps->_pSnake->y;
    		break;
    	}
    
    	//检测下一个坐标处是否是食物
    	if (NextIsFood(pNextNode, ps))
    	{
    		EatFood(pNextNode, ps);
    	}
    	else
    	{
    		NoFood(pNextNode, ps);
    	}
    }
  • 判断下一个坐标是否是食物和下一个位置是食物和下一个位置不是食物,就吃掉食物:则代码为:

    int NextIsFood(pSnakeNode pn, pSnake ps)
    {
    	return (ps->_pFood->x == pn->x && ps->_pFood->y == pn->y);
    }
    
    void EatFood(pSnakeNode pn, pSnake ps)
    {
    	//头插法
    	ps->_pFood->next = ps->_pSnake;
    	ps->_pSnake = ps->_pFood;
    
    	//释放下一个位置的节点
    	free(pn);
    	pn = NULL;
    
    
    	pSnakeNode cur = ps->_pSnake;
    
    	//打印蛇
    	while (cur)
    	{
    		SetPos(cur->x, cur->y);
    		wprintf(L"%lc", BODY);
    		cur = cur->next;
    	}
    	ps->_score += ps->_food_weight;
    
    	//重新创建食物
    	CreateFood(ps);
    }
    
    void NoFood(pSnakeNode pn, pSnake ps)
    {
    	//头插法
    	pn->next = ps->_pSnake;
    	ps->_pSnake = pn;
    
    	pSnakeNode cur = ps->_pSnake;
    	while (cur->next->next != NULL)
    	{
    		SetPos(cur->x, cur->y);
    		wprintf(L"%lc", BODY);
    		cur = cur->next;
    	}
    
    	//把最后一个节点打印成空格
    	SetPos(cur->next->x, cur->next->y);
    	printf(" ");
    
    	//释放最后一个节点
    	free(cur->next);
    
    	//把倒数第二个节点的地址置为NULL
    	cur->next = NULL;
    }

    确实多,请耐心看完。

  • 游戏运行的逻辑,则代码为:
    void GameRun(pSnake ps)
    {
    	//打印帮助信息
    	PrintHelpInfo();
    
    
    	do
    	{
    		//打印总分数和食物的分值
    		SetPos(64, 10);
    		printf("总分数:%d\n", ps->_score);
    		SetPos(64, 11);
    		printf("当前食物的分数:%d\n", ps->_food_weight);
    
    		if (KEY_PRESS(VK_UP) && ps->_dir != DOWN)
    		{
    			ps->_dir = UP;
    		}
    		else if (KEY_PRESS(VK_DOWN) && ps->_dir != UP)
    		{
    			ps->_dir = DOWN;
    		}
    		else if (KEY_PRESS(VK_LEFT) && ps->_dir != RIGHT)
    		{
    			ps->_dir = LEFT;
    		}
    		else if (KEY_PRESS(VK_RIGHT) && ps->_dir != LEFT)
    		{
    			ps->_dir = RIGHT;
    		}
    		else if (KEY_PRESS(VK_SPACE))
    		{
    			pause();
    		}
    		else if (KEY_PRESS(VK_ESCAPE))
    		{
    			//正常退出游戏
    			ps->_status = END_NORMAL;
    
    		}
    		else if (KEY_PRESS(VK_F3))
    		{
    			//加速
    			if (ps->_sleep_time > 80)
    			{
    				ps->_sleep_time -= 30;
    				ps->_food_weight += 2;
    			}
    		}
    		else if (KEY_PRESS(VK_F4))
    		{
    			//减速
    			if (ps->_food_weight > 2)
    			{
    				ps->_sleep_time += 30;
    				ps->_food_weight -= 2;
    			}
    		}
    
    		SnakeMove(ps); //蛇走一步的过程
    
    		Sleep(ps->_sleep_time);
    
    	} while (ps->_status == OK);
    }
  • 暂停响应,检测蛇是否撞墙,检测是否撞到自己和结束游戏 - 善后工作,则代码为:
    void pause()
    {
    	while (1)
    	{
    		Sleep(200);
    		if(KEY_PRESS(VK_SPACE))
    		{
    			break;
    		}
    	}
    }
    
    void KillByWall(pSnake ps)
    {
    	if (ps->_pSnake->x == 0 || ps->_pSnake->x == 56 || ps->_pSnake->y == 0 || ps->_pSnake->y == 26)
    	{
    		ps->_status = KILL_BY_WALL;
    	}
    }
    
    void KillBySelf(pSnake ps)
    {
    	pSnakeNode cur = ps->_pSnake->next;
    	while (cur)
    	{
    		if (cur->x == ps->_pSnake->x && cur->y == ps->_pSnake->y)
    		{
    			ps->_status = KILL_BY_SELF;
    			break;
    		}
    		cur = cur->next;
    	}
    }
    
    void GameEnd(pSnake ps)
    {
    	SetPos(24, 12);
    	switch (ps->_status)
    	{
    	case END_NORMAL:
    		wprintf(L"你主动退出\n");
    		break;
    	case KILL_BY_WALL:
    		wprintf(L"您撞上自己了 ,游戏结束!\n");
    		break;
    	case KILL_BY_SELF:
    		wprintf(L"您撞墙了,游戏结束!\n");
    		break;
    	}
    
    
    	//释放蛇身的链表
    
    	pSnakeNode cur = ps->_pSnake;
    	while (cur)
    	{
    		pSnakeNode del = cur;
    		cur = cur->next;
    		free(del);
    	}
    }
    
    
  • 这贪吃蛇的主函数代码确实多,但也是最重要一部分。请大家耐心看完哦。文章来源地址https://www.toymoban.com/news/detail-860496.html

到了这里,关于项目实践---贪吃蛇小游戏(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何用MetaGPT帮你写一个贪吃蛇的小游戏项目

    MetaGPT是基于大型语言模型(LLMs)的多智能体写作框架,目前在Github开源,其Start数量也是比较高的,是一款非常不错的开源框架。 下面将带你进入MetaGPT的大门,开启MetaGPT的体验之旅。首先是入门教程,如何安装及使用MetaGPT。 一、环境安装 python 环境安装,MetaGPT所需的Python环

    2024年01月19日
    浏览(31)
  • 10分钟教你用Python写一个贪吃蛇小游戏,适合练手项目

    贪吃蛇,大家应该都玩过。当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎。今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 所有的游戏最主要的内容都是程序的内循环,这才是保证一个游戏能够正常运行的前提。 以下是编写贪吃

    2024年01月17日
    浏览(36)
  • 【贪吃蛇小游戏】宝塔面板快速搭建贪吃蛇小游戏Web网站 - 无需云服务器

    转载自远程内网穿透的文章:Linux使用宝塔面板搭建网站,并内网穿透实现公网访问 宝塔面板作为简单好用的服务器运维管理面板,它支持Linux/Windows系统,我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等,通过Web端轻松管理服务器。 以下教程,我们将演示使用宝塔

    2024年02月05日
    浏览(48)
  • 小游戏实战丨基于PyGame的贪吃蛇小游戏

    本期内容:基于pygame的贪吃蛇小游戏 下载地址:https://download.csdn.net/download/m0_68111267/88700188 实验环境 python3.11及以上 pycharm pygame 安装pygame的命令: pygame是一个开源的Python模块,专门用于编写电子游戏。它使用简单、功能强大,因此非常适合初学者入门。pygame的主要特点包括图

    2024年02月03日
    浏览(37)
  • QT-贪吃小游戏

    https://download.csdn.net/download/u013083044/88758860

    2024年01月19日
    浏览(34)
  • Javase | 贪吃蛇小游戏

    * 1:设计游戏图纸 * 2:设计游戏窗体 * 3:在窗体上添加面板 * 4:在面板上添加画笔方法(paintComponent方法) *5 用super调用父类的paintComponent (来每一次刷新界面) * 6:在面板上添加标题:用ImageIcon导入图片类来导入图片,然后调用有关方法 * 7:在面板上添加黑色游戏区框(

    2024年02月04日
    浏览(32)
  • Python贪吃蛇小游戏

    Python贪吃蛇小游戏 若程序错误,请去终端下载random, turtle, freegames pip install random pip install turtle pip install freegames from random import randrange from turtle import * from freegames import square, vector food = vector(0, 0) snake = [vector(10, 0)] aim = vector(0, -10) def change(x, y):     \\\"\\\"\\\"Change snake direction.\\\"\\\"\\\"    

    2024年02月03日
    浏览(33)
  • 贪吃蛇小游戏(C++)

    首先我们需要下载EasyX(具体的方法在EasyX专栏中有提到) easyX下载和绘制简单基本图形_小梁今天敲代码了吗的博客-CSDN博客 贪吃蛇这个游戏我们一定都玩过,玩家使用方向键操控一条“蛇”,蛇会朝着一个方向不断移动,玩家可以通过上下左右键改变其运动方向。同时屏幕

    2023年04月27日
    浏览(23)
  • Java小游戏—贪吃蛇

    摘 要 近年来,java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了各个国家广泛地认可。本文基于java技术和Eclipse开发环境,设计并实现了一个操作简单、界面美观的“贪吃蛇”游戏。“贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强

    2024年02月03日
    浏览(34)
  • 小游戏:人生中写的第一个小游戏——贪吃蛇(C语言)

            小编开了一个关于游戏的专栏,主要是运用easyx图形库进行的。        第一章:人生中写的第一个小游戏——贪吃蛇(C语言)         这个游戏的代码我在gitee上发布了,大家如果不嫌弃,可以进入这个网址进行查看和复制:https://gitee.com/rising-sun-1。      

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包