C++小游戏贪吃蛇源码

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.mfbz.cn/a/71802.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

P11-Transformer学习1.1-《Attention Is All You Need》

Transformer目录:《Transformer Paper》1.0 CV Transformer必读论文5篇_汉卿HanQ的博客-CSDN博客 前文参考:Transformer1.0-预热_汉卿HanQ的博客-CSDN博客 全文1w3字左右&#xff0c;按照论文翻译个人理解精读&#xff0c;如果对你有所帮助&#xff0c;欢迎点个赞哦&#xff…

springboot基础

springboot基础 一、springboot课程介绍 Spring Boot 提供一种快速使用spring的方式&#xff0c;基于约定大于配置的思想&#xff0c;可以让开发者不必在配置与逻辑业务中来回进行思维切换&#xff0c;全身心的投入到业务的代码编写中&#xff0c;从而大大提高了开发效率。20…

2022年12月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;加一 输入一个整数x&#xff0c;输出这个整数加1后的值&#xff0c;即x1的值。 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入 一个整数x(0 ≤ x ≤ 1000)。 输出 按题目要求输出一个整数。 样例输入 9 样例输出 10 以下是使用C语言编写的解决方案…

Shell编程之正则表达式(非常详细)

正则表达式 1.通配符和正则表达式的区别2.基本正则表达式2.1 元字符 &#xff08;字符匹配)2.2 表示匹配次数2.4 位置锚定2.5 分组 和 或者 3.扩展正则表达式4.部分文本处理工具4.1 tr 命令4.2 cut命令4.3 sort命令4.4 uniq命令 1.通配符和正则表达式的区别 通配符一般用于文件…

Linux系统下安装Git软件

环境说明 Linux系统&#xff1a;CentOS 7.9 安装GCC等 JDK版本&#xff1a;jdk-8u202-linux-x64.tar.gz Maven版本&#xff1a;apache-maven-3.8.8-bin.tar.gz 在以上环境下安装Git&#xff08;git-2.41.0.tar.gz&#xff09;软件。 查看是否安装Git软件 查看Git版本&#…

【Linux】以太网协议——数据链路层

链路层解决的问题 IP拥有将数据跨网络从一台主机送到另一台主机的能力&#xff0c;但IP并不能保证每次都能够将数据可靠的送到对端主机&#xff0c;因此IP需要上层TCP为其提供可靠性保证&#xff0c;比如数据丢包后TCP可以让IP重新发送数据&#xff0c;最终在TCP提供的可靠性机…

标记垃圾,有三种色彩:四千长文带你深入了解三色标记算法

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

ArcGIS Maps SDK for JavaScript系列之一:在Vue3中加载ArcGIS地图

目录 ArcGIS Maps SDK for JavaScript简介ArcGIS Maps SDK for JavaScript 4.x 的主要特点和功能AMD modules 和 ES modules两种方式比较Vue3中使用ArcGIS Maps SDK for JavaScript的步骤创建 Vue 3 项目安装 ArcGIS Maps SDK for JavaScript创建地图组件 ArcGIS Maps SDK for …

Java多线程知识点,看这一篇就够了!(超详细)

目录 一、认识线程&#xff08;Thread&#xff09; 1、概念 2、第一个多线程程序 &#xff08;1&#xff09;观察线程 3、创建线程 二、Thread 类及常见方法 1、Thread 的常见构造方法 2、Thread 的几个常见属性 3、启动一个线程&#xff1a;start 4、终止一个线程 &…

注意:阿里云服务器随机分配可用区说明

阿里云服务器如有ICP备案需求请勿选择随机可用区&#xff0c;因为当前地域下的可用区可能不支持备案&#xff0c;阿里云百科分享提醒大家&#xff0c;如果你的购买的云服务器搭建网站应用&#xff0c;网站域名需要使用这台云服务器备案的话&#xff0c;不要随机分配可用区&…

什么是响应式设计?列举几种实现响应式设计的方法。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是响应式设计&#xff1f;⭐ 实现响应式设计的方法⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏…

Android OkHttp源码分析--分发器

OkHttp是当下Android使用最频繁的网络请求框架&#xff0c;由Square公司开源。Google在Android4.4以后开始将源码中 的HttpURLConnection底层实现替换为OKHttp&#xff0c;同时现在流行的Retrofit框架底层同样是使用OKHttp的。 OKHttp优点: 1、支持Http1、Http2、Quic以及Web…

使用shift关键字,写一个带二级命令的脚本(如:docker run -a -b -c中的run)

省流&#xff1a;shift关键字 探索思路 最近有一个小小的需求&#xff0c;写一个类似于docker run -a -b -c这样的脚本&#xff0c;这个脚本名为doline&#xff0c;它本身可以执行&#xff08;doline -a -b -c&#xff09;&#xff0c;同时又带有几个如run、init、start这样的…

【VSCode】查看二进制文件

1.安装插件Hex Editor 2.打开二进制文件 3.执行Hex Editor命令

基于.Net开发的ChatGPT客户端,兼容Windows、IOS、安卓、MacOS、Linux

2023年目前要说最热的点&#xff0c;肯定是ChatGPT了。 ChatGPT官方提供的网页版本&#xff0c;还有需要科*上网&#xff0c;很多人都会基于此进行封装。 现在是移动互联网时代&#xff0c;基于手机APP的需求还是很大的。 所以&#xff0c;今天给大家推荐一个ChatGPT客户端开…

YOLOv5入门实践(2)— 手把手教你使用make sense标注数据集(附工具地址+使用教程)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。鉴于labelimg图像标注软件安装起来比较麻烦&#xff0c;本节课再给大家介绍另外一款数据集标注工具。这是一款在线标注数据集的工具&#xff0c;用起来非常的方便。&#x1f308; 前期回顾&#xff1a; YOLOv5入门实践&…

【深度学习MOT】SMILEtrack SiMIlarity LEarning for Multiple Object Tracking,论文

论文&#xff1a;https://arxiv.org/abs/2211.08824 文章目录 AbstractIntroduction2. 相关工作2.1 基于检测的跟踪2.1.1 检测方法2.1.2 数据关联方法 2.2 基于注意力的跟踪 3. 方法3.1 架构概述3.2 用于重新识别的相似性学习模块&#xff08;SLM&#xff09; Experimental Res…

Mysql数据库第十三课-----------sql语句的拔高3--------直冲云霄

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

【MySQL--->数据库基础】

文章目录 [TOC](文章目录) 一、基本概念二、实际应用中的数据库三、mysql的架构四、mysql语句分类五、存储引擎查看 一、基本概念 mysql本质是一个CS模式的网络服务,mysql是客户端,mysqld是服务端,提供高效的数据存取方案.数据库系统简单来说是一个数据集合加上管理这个数据集…

Git介绍及常用命令详解

一、Git的概述 Git是一个分布式版本控制工具&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。 Git 会跟踪我们对文件所做的更改&#xff0c;因此我们可以记录已完成的工作&#xff0c;并且可以在需要时恢复到特定或以前的版本。Git 还使多人协作变得更加容易&…