C++小游戏贪吃蛇源码

news2024/12/24 20:32:01

graphics.h是针对DOS下的一个C语言图形库 (c++也可以)

目前支持下载此头文件的常用的有两种:

    1. EGE (Easy Graphics Engine)

    2. EasyX Graphics Library

EGE, 全名Easy Graphics Engine, 是windows下的简易绘图库,是一个类似BGI(graphics.h)的面向C/C++语言新手的图形库

EasyX, 全名EasyX Graphics Library, 是针对 Visual C++ 的免费绘图库,支持 VC6.0 ~ VC2022,简单易用,学习成本极低,应用领域广泛。目前已有许多大学将 EasyX 应用在教学当中

我建议Visual Studio用EasyX, Dev-C++可以用EGE

解决的方法:去 EasyX官网 下载EasyX的exe程序,点击后直接对自己使用的VC版本进行安装就行了,很简单。.

在这里插入图片描述

Graphics.h常用用法:

    1.initgraph(width, height)和closegraph()
            
            initgraph可以创建一个宽度为width, 高度为height的图形界面窗口
            
             运行结束后可以通过closegraph来关闭窗口 

            注, closegraph之前记得用getch()函数来接收用户输入, 防止程序刚绘画玩就关闭窗口了

    2.line(x1,y1,x2,y2)
            从x1,y1坐标画一条直线到x2,y2坐标

    3.setcolor和RGB
            setcolor()可以把line画出来的直线变成另外一种颜色

            RGB可以返回setcolor的自定义参数

            RGB(r,g,b)可以修改不同浓度的红, 绿, 蓝

            EX:

                    setcolor(RGB(200,0,0))可以将line画出来的直线变成红色

    4.circle(x,y,radius)
            在x,y坐标点画一个半径为radius的圆

            EX:

                    circle(200, 200, 100);

    5.setfillcolor, bar(x1,y1,x2,y2)
            bar函数可以画出一个矩形

            范围为:x坐标从50-300,y坐标从100-200

            setfillcolor()可以改变Bar的填充颜色值,参数也是RGB()函数的自定义颜色

    6.fillellipse(x,y,xr,yr);
            画一个在x, y坐标点的实心椭圆

            x轴上的半径为xr

            y轴上的半径为yr

            注:setfillcolor也可以改变其填充颜色值

    7.setfontbkcolor(), setfont(12, 0, "宋体")
            setfontcolor可以修改创建的文字的背景颜色值

            setfont(12,0,"宋体")的第一个参数是字体的高度

            第二个参数是字体的宽度, 如果填0, 那就会使用默认比例值

            第三个参数是设置文字的字体样式

    8.outtextxy(x, y, 字符串);
            这个函数可以在坐标x,y坐标点输出字符串

            注:字符串也可以是中文

            EX:

                    outtextxy(100, 150, "中文也是支持的");

小游戏运行效果图:

在这里插入图片描述

贪吃蛇游戏源代码:

// 贪吃蛇小游戏.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <graphics.h>
#include <Windows.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#include "io.h"

#define S_LEN	400	//蛇的最大节数 
#define S_SPEED 200	//蛇的速度
#define S_SIZE	20	//蛇的大小

//全局变量
int score = 0;

typedef enum Direction
{
	up = 72,
	down = 80,
	left = 75,
	right = 77
};					//蛇的方向

					//坐标结构体
struct Coordinate
{
	int x;
	int y;
};

//蛇的结构体 
struct Snake
{
	Coordinate sCo[S_LEN];	//每一节蛇的坐标
	int num;				//蛇的节数
	Direction direction;	//蛇的方向
}snake;

//食物的结构体
struct Food
{
	Coordinate fCo;
	int flag;				//食物是否被吃
}food;

//函数声明
void InitSnake();			//初始化蛇
void Snake_Food();			//食物坐标
void Snake_Food_Paint();	//画食物
void Snake_Paint();			//画蛇
void Snake_Move();			//蛇移动
void Snake_Change();		//方向性移动
void Snake_Eat();			//食物是否被吃 
void Snake_Break();			//判断是否撞自己
void Game_Over();			//结束游戏

int main(int argc, char *argv[])
{
	InitSnake();
	while (true)
	{
		while (!_kbhit())
		{
			settextcolor(RED);
			score = (snake.num - 2) * 100;
			char s[5];
			sprintf(s, "%d", score);
			outtextxy(500, 60, s);
			if (food.flag == 0)
			{
				Snake_Food();
			}
			Snake_Food_Paint();
			Snake_Break();
			Snake_Eat();
			Snake_Move();
			Sleep(S_SPEED);
		}
		Snake_Change();
	}
	return 0;
}

//初始化蛇
void InitSnake()
{
	//初始化图形界面
	initgraph(640, 480);
	setbkcolor(RGB(168, 168, 168));
	cleardevice();

	settextcolor(RED);
	settextstyle(32, 0, "黑体");
	outtextxy(510, 20, "贪吃蛇");

	settextcolor(BLACK);
	settextstyle(16, 0, "宋体");
	outtextxy(495, 100, "分数:");

	outtextxy(500, 400, "By:逃逸的卡路里");

	setcolor(RGB(46, 85, 6));
	setfillcolor(RGB(46, 85, 6));
	fillrectangle(0, 0, 480, 480);

	setcolor(RGB(199, 177, 163));
	setfillcolor(RGB(199, 177, 163));
	fillrectangle(40, 40, 440, 440);

	setcolor(RGB(102, 86, 0));
	for (int i = 0; i < 5; i++)
	{
		rectangle(39 - i, 39 - i, 441 + i, 441 + i);
	}
	setcolor(RGB(168, 147, 130));
	for (int i = 60; i < 440; i += 20)
	{
		line(i, 40, i, 440);
		line(40, i, 440, i);
	}
	setorigin(40, 40);
	setcolor(RGB(56, 89, 0));
	setfillcolor(RGB(91, 193, 45));
	fillcircle(10, 10, 9);		//第一节蛇
	setfillcolor(WHITE);
	fillcircle(8, 5, 2);
	fillcircle(8, 15, 2);
	food.flag = 0;			//食物被吃

							//蛇坐标初始化
	snake.sCo[0].x = 0 + S_SIZE;
	snake.sCo[0].y = 0;
	snake.sCo[1].x = 0;
	snake.sCo[0].y = 0;
	snake.num = 2;
	snake.direction = right;
}

//食物坐标			
void Snake_Food()
{
	int i;
	srand((unsigned)time(NULL));
	while (true)
	{
		int num = 0;
		food.fCo.x = rand() % (400 / S_SIZE)*S_SIZE;
		food.fCo.y = rand() % (400 / S_SIZE)*S_SIZE;
		for (i = 0; i < snake.num; i++)
		{
			if (snake.sCo[i].x == food.fCo.x&&snake.sCo[i].y == food.fCo.y)
			{
				num++;
			}
		}
		if (num == 0)
		{
			break;
		}
	}
	food.flag = 1;
}

//画食物
void Snake_Food_Paint()
{
	setcolor(RED);
	setfillcolor(RED);
	fillcircle(food.fCo.x + 10, food.fCo.y + 10, 8);
}

//画蛇
void Snake_Paint()
{
	for (int i = snake.num - 1; i >= 0; i--)
	{
		setcolor(RGB(56, 89, 0));
		setfillcolor(RGB(91, 193, 45));
		fillcircle(snake.sCo[i].x + 10, snake.sCo[i].y + 10, 9);

		if (i == 0)
		{
			setfillcolor(WHITE);
			switch (snake.direction)
			{
			case up:
				fillcircle(snake.sCo[i].x + 5, snake.sCo[i].y + 12, 2);
				fillcircle(snake.sCo[i].x + 15, snake.sCo[i].y + 12, 2);
				break;
			case down:
				fillcircle(snake.sCo[i].x + 5, snake.sCo[i].y + 8, 2);
				fillcircle(snake.sCo[i].x + 15, snake.sCo[i].y + 8, 2);
				break;
			case left:
				fillcircle(snake.sCo[i].x + 12, snake.sCo[i].y + 5, 2);
				fillcircle(snake.sCo[i].x + 12, snake.sCo[i].y + 15, 2);
				break;
			case right:
				fillcircle(snake.sCo[i].x + 8, snake.sCo[i].y + 5, 2);
				fillcircle(snake.sCo[i].x + 8, snake.sCo[i].y + 15, 2);
				break;
			}
		}
	}
	setcolor(RGB(199, 177, 163));
	setfillcolor(RGB(199, 177, 163));
	fillcircle(snake.sCo[snake.num].x + 10, snake.sCo[snake.num].y + 10, 9);
}

//蛇移动
void Snake_Move()
{
	for (int i = snake.num; i > 0; i--)
	{
		snake.sCo[i].x = snake.sCo[i - 1].x;
		snake.sCo[i].y = snake.sCo[i - 1].y;
	}
	switch (snake.direction)
	{
	case up:
		if (snake.sCo[0].y == 0)
		{
			snake.sCo[0].y = 400 - S_SIZE;
		}
		else
		{
			snake.sCo[0].y -= S_SIZE;
		}
		break;
	case down:
		if (snake.sCo[0].y == 400 - S_SIZE)
		{
			snake.sCo[0].y = 0;
		}
		else
		{
			snake.sCo[0].y += S_SIZE;
		}
		break;
	case left:
		if (snake.sCo[0].x == 0)
		{
			snake.sCo[0].x = 400 - S_SIZE;
		}
		else
		{
			snake.sCo[0].x -= S_SIZE;
		}
		break;
	case right:
		if (snake.sCo[0].x == 400 - S_SIZE)
		{
			snake.sCo[0].x = 0;
		}
		else
		{
			snake.sCo[0].x += S_SIZE;
		}
		break;
	}
	Snake_Paint();
}

//方向性移动
void Snake_Change()
{
	int ch;
	ch = getch();
	switch (ch)
	{
	case 'w':
	case 'W':
	case up:
		if (snake.direction != down)
		{
			snake.direction = up;
		}
		break;
	case 's':
	case 'S':
	case down:
		if (snake.direction != up)
		{
			snake.direction = down;
		}
		break;
	case 'a':
	case 'A':
	case left:
		if (snake.direction != right)
		{
			snake.direction = left;
		}
		break;
	case 'd':
	case 'D':
	case right:
		if (snake.direction != left)
		{
			snake.direction = right;
		}
		break;
	}
}

//食物是否被吃
void Snake_Eat()
{
	if (snake.sCo[0].x == food.fCo.x&&snake.sCo[0].y == food.fCo.y)
	{
		snake.num++;
		food.flag = 0;
	}
}

//判断是否撞自己
void Snake_Break()
{
	for (int i = snake.num - 1; i > 3; i--)
	{
		if (snake.sCo[0].x == snake.sCo[i].x&&snake.sCo[0].y == snake.sCo[i].y)
		{
			Game_Over();
		}
	}
}

//结束游戏
void Game_Over()
{
	cleardevice();
	setcolor(WHITE);
	outtextxy(200, 160, "GAME OVER!!!");
	Sleep(10000);
	closegraph();
}

最后

希望对看到的小伙伴有帮助,有需要改进的地方,欢迎一起讨论学习哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/861561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win10+Vmware+ubuntu18 mosquitto调试记录

记录一下在建立mqtt调试环境上遇到的问题及对策。 我的PC环境为&#xff0c;win10为办公环境&#xff0c;Vmware虚拟机安装ubuntu18&#xff0c;虚拟机主要用来进行代码编译&#xff0c;建立mosquitto server测试环境。 1. ubuntu 安装mosquitto 安装mosquitto网上很多教程&…

CDN(内容分发网络)

CDN的全称是 Content Delivery Network, 即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户就近获取所需内容&#xff0c;降低网络拥塞&a…

音乐播放器应用——Android开发组件化实例分析

组件化技术在Android开发中扮演着重要的角色&#xff0c;它能够将一个庞大的应用拆分成多个独立的组件&#xff0c;每个组件都可以独立开发、测试和维护。本文将深入探讨组件化技术的认知、优势以及搭建过程&#xff0c;并通过代码示例解析组件化实例分析。最后&#xff0c;我们…

C++:类与对象(下)- this指针、(拷贝)构造函数、析构函数、复制运算符重载

目录 一、 this指针 1.1 引入 1.2 问题 1.3 特性 二、 构造函数 2.1 概念 2.2 特性 2.3 语法 2.4 注意点 三、 析构函数 3.1 概念 3.2 特性 3.3 示例 四、拷贝构造函数 4.1 概念 4.2 特性 4.3 示例 4.4 深浅拷贝 五、 赋值运算符重载 5.1 概念 5.2 语法 5…

10-数据结构-队列(C语言)

队列 目录 目录 队列 一、队列基础知识 二、队列的基本操作 1.顺序存储 ​编辑 &#xff08;1&#xff09;顺序存储 &#xff08;2&#xff09;初始化及队空队满 &#xff08;3&#xff09;入队 &#xff08;4&#xff09;出队 &#xff08;5&#xff09;打印队列 &…

编写一个指令(v-focus2end)使输入框文本在聚焦时焦点在文本最后一个位置

项目反馈输入框内容比较多时候&#xff0c;让鼠标光标在最后一个位置&#xff0c;心想什么奇葩需求&#xff0c;后面试了一下&#xff0c;是有点影响体验&#xff0c;于是就有了下面的效果&#xff0c;我目前的项目都是若依的架子&#xff0c;用的是vue2版本。vue3的朋友想要使…

什么是POP3协议?

POP3&#xff08;Post Office Protocol Version 3&#xff09;是一个用于从电子邮件服务器获取邮件的应用层协议。以下是关于POP3的详细解释&#xff1a; 基本操作&#xff1a;使用POP3&#xff0c;电子邮件客户端可以从邮件服务器上下载电子邮件&#xff0c;并将其保存在本地。…

Unity制作护盾——3、蜂窝晶体护盾

Unity制作晶格护盾 大家好&#xff0c;我是阿赵。 继续来做护盾&#xff0c;这一期做一个蜂窝晶体护盾的效果。 一、效果展示 这个晶体护盾的特点是&#xff0c;整个护盾是由很多五边形和六边形的晶体构成&#xff0c;每一块晶体的颜色都在不停的变化&#xff0c;然后每一块晶…

使用 Spring Boot 发送电子邮件(SMTP 集成)

本文探讨了 Spring Boot 与 SMTP 的集成以及如何从您自己的 Spring Boot 应用程序发送电子邮件。 本文探讨如何从您自己的Spring Boot应用程序发送电子邮件。 是的&#xff0c;您可以拥有专用的 REST API&#xff0c;它接受电子邮件发送者和接收者的电子邮件地址、主题…

【雕爷学编程】Arduino动手做(05)---热敏电阻模块之的基本参数、模块特色、电原理与使用说明

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

SpringBoot 整合Druid

集成Druid Druid简介 Java程序很大一部分要操作数据库&#xff0c;为了提高性能操作数据库的时候&#xff0c;又不得不使用数据库连接池。 Druid 是阿里巴巴开源平台上一个数据库连接池实现&#xff0c;结合了 C3P0、DBCP 等 DB 池的优点&#xff0c;同时加入了日志监控。 D…

Chrome DevTools 与 WebSocket 数据查看失焦的问题

Chrome DevTools 在与 WebSocket 连接交互时可能会出现失焦的问题&#xff0c;这似乎是一个已知的 bug。当 DevTools 选中 WebSocket 消息时&#xff0c;如果有新的消息到达&#xff0c;DevTools 将会自动失焦&#xff0c;导致无法查看完整的消息内容。 虽然这个问题很令人困扰…

C++友元函数和友元类的使用

1.友元介绍 在C中&#xff0c;友元&#xff08;friend&#xff09;是一种机制&#xff0c;允许某个类或函数访问其他类的私有成员。通过友元&#xff0c;可以授予其他类或函数对该类的私有成员的访问权限。友元关系在一些特定的情况下很有用&#xff0c;例如在类之间共享数据或…

高斯模糊与图像处理(Gaussian Blur)

高斯模糊在图像处理中的用途及其广泛&#xff0c;除了常规的模糊效果外&#xff0c;还可用于图像金字塔分解、反走样、高低频分解、噪声压制、发光效果等等等等。正因为高斯模糊太基础&#xff0c;应用太广泛&#xff0c;所以需要尽可能深入认识这个能力&#xff0c;避免在实际…

【css】css中使用变量var

CSS 变量可以有全局或局部作用域。 全局变量可以在整个文档中进行访问/使用&#xff0c;而局部变量只能在声明它的选择器内部使用。 如需创建具有全局作用域的变量&#xff0c;请在 :root 选择器中声明它。 :root 选择器匹配文档的根元素。 如需创建具有局部作用域的变量&am…

无脑——010 复现yolov8 训练自己的数据集 基于yolov8框架 使用rt detr

背景&#xff1a; 2023.08.09导师让调研transformer的相关论文&#xff0c;做CV的都知道transformer多么难跑&#xff0c;需要用8张GPU跑100多个小时&#xff0c;我这个小小实验室放不下这尊大佛&#xff0c;所以就找点小模型跑一跑&#xff0c;调研论文发现最新的是CO-DETR&am…

【BMC】OpenBMC开发基础3:引入新的开源配方

引入新的开源配方 前面介绍了如何在OpenBMC中通过新建配方引入自己的程序&#xff0c;也介绍了如何修改原有的程序&#xff0c;下面要介绍的是如何引入开源的新程序&#xff0c;这在OE系统上是很方便的&#xff0c;重点就在于引入新的配方。 OE为了方便开发者使用&#xff0c…

到 2030 年API 攻击预计将激增近 1000%

导读云原生应用程序编程接口管理公司 Kong 联合外部经济学家的最新研究预计&#xff0c;截至 2030 年 API 攻击将激增 996%&#xff0c;意味着与 API 相关的网络威胁的频率和强度都显着升级。 这项研究由 Kong 分析师和布朗大学副教授 Christopher Whaley 博士合作进行&#x…

Maven进阶2 -- 私服(Nexus)、私服仓库分类、资源上传和下载

目录 私服是一台独立的服务器&#xff0c;用于解决团队内部的资源共享与资源同步问题。 1.Nexus Nexus是sonatype公司的一款maven私服产品。 下载地址 启动 nexus.exe /run nexus 访问 & 登录 2.私服仓库分类 3.资源上传和下载 本地仓库上传和访问资源需要进行配置。…

stm32项目(8)——基于stm32的智能家居设计

目录 一.功能设计 二.演示视频 三.硬件选择 1.单片机 2.红外遥控 3.红外探测模块 4.光敏电阻模块 5.温湿度检测模块 6.风扇模块 7.舵机 8.WIFI模块 9.LED和蜂鸣器 10.火焰传感器 11.气体传感器 四.程序设计 1.连线方式 2.注意事项 3.主程序代码 五.课题意义…