C语言实现贪吃蛇项目(2)

先来看看效果:

20240420_212115


文章目录:

  • 3.项目实现
  • 3.0宽字符的打印
    • 3.01本地化操作
      • setlocale函数
      • 宽字符的打印
  • 3.1贪吃蛇结构的创建和维护
    • 3.11贪吃蛇结构的创建
    • 3.12贪吃蛇的维护
  • 3.2初始化游戏
    • 3.21.打印欢迎界面、隐藏光标和设置窗口大小
    • 3.22.绘制地图
    • 3.23.创建蛇
    • 3.24.创建食物
  • 3.3 游戏运行逻辑
    • 3.31打印游戏旁的提示
    • 3.32按键检测
    • 3.33蛇的移动
    • 3.34检测是否撞墙或自己
  • 3.4 游戏结束(善后工作)
  • 4.项目代码

3.项目实现

3.0宽字符的打印

3.01本地化操作

先要进行本地化,然后才能进行宽字符的打印
<locale.h>提供的函数⽤于控制C标准库中对于不同的地区会产⽣不⼀样⾏为的部分。
在标准中,依赖地区的部分有以下⼏项:
• 数字量的格式
• 货币量的格式
• 字符集
• ⽇期和时间的表⽰形式
在这里插入图片描述
每个类项的详细说明,请参考:https://learn.microsoft.com/zh-cn/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=msvc-170

setlocale函数

在这里插入图片描述

setlocale 函数⽤于修改当前地区,可以针对⼀个类项修改,也可以针对所有类项
C标准给第⼆个参数仅定义了2种可能取值:“C”(正常模式)和""(本地模式)
我们来看看示例:
在这里插入图片描述
上面是C语言默认的环境,下面就是我们适配本地的环境了

宽字符的打印

宽字符的字⾯量必须加上前缀“L”,否则C语⾔会把字⾯量当作窄字符类型处理。前缀“L”在单引号前⾯,表⽰宽字符,对应wprintf() 的占位符为 %lc ;在双引号前⾯,表⽰宽字符串,对应wprintf() 的占位符为%ls
在这里插入图片描述
所以在进行坐标判断是要注意是否为2的倍数

3.1贪吃蛇结构的创建和维护

3.11贪吃蛇结构的创建

我们的贪吃蛇使用链表进行维护我们先进行声明
在这里插入图片描述这里将结构体指针重命名为pSnakeNode方便后续书写

3.12贪吃蛇的维护

我们创建一个结构体来方便维护我们的程序(这里有枚举的方法)在这里插入图片描述

然后我们创建贪吃蛇
在这里插入图片描述

3.2初始化游戏

在这里插入图片描述
初始化游戏我们要做什么:
1.打印欢迎界面、隐藏光标和设置窗口大小
2.绘制地图
3.创建蛇
4.创建食物

3.21.打印欢迎界面、隐藏光标和设置窗口大小

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0a07334e9292
这些上一篇文章已经写过了就不多赘述了在这里插入图片描述
光标定位也是前一篇写过的,直接拿过来使用即可
在这里插入图片描述
这里就是定位光标位置然后打印信息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后就是清屏然后在打印
在这里插入图片描述

3.22.绘制地图

在这里插入图片描述

这里创建一个27行58列的地图,也可以根据自己的情况来
在这里插入图片描述
这里要注意光标的定位,通过循环就可以将地图绘制出来了
在这里插入图片描述

3.23.创建蛇

在这里插入图片描述
循环申请空间然后进行初始化,这里是从尾巴向头部申请空间的(蛇初始向右移动)
在这里插入图片描述
然后用头插法将其串起来
在这里插入图片描述
在这里插入图片描述
写成代码就是上面的方式
接着就是将蛇的身体打印出来,用循环遍历就行
在这里插入图片描述
在这里插入图片描述

并且将蛇的属性进行初始的设置
在这里插入图片描述

3.24.创建食物

由于食物要放到指针中,所以要传参数
在这里插入图片描述
要注意:
x坐标必须是2的倍数
⻝物的坐标不能和蛇⾝每个节点的坐标重复
在这里插入图片描述
在这里插入图片描述
接下来判断是否为2的倍数
在这里插入图片描述
判断x和y不能和蛇的身体冲突
在这里插入图片描述
申请食物的空间,并将其打印出来在这里插入图片描述

在这里插入图片描述

3.3 游戏运行逻辑

在这里插入图片描述

3.31打印游戏旁的提示

在这里插入图片描述
在这里插入图片描述

3.32按键检测

这里暂停为循环睡眠,然后在输入空格跳出循环
加减速要注意有判断,不能一直减速
在这里插入图片描述

3.33蛇的移动

要不断检测按键来移动蛇的位置
由于要改变游戏的状态所以也要传指针
在这里插入图片描述
我们的移动采用的方法是:将未接点释放,头节点进行头插
在这里插入图片描述
先创建节点,然后将移动的下一个坐标写出来,要注意x一次加2

检测下一个坐标是否是食物
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
然后是这两个函数的处理:
在这里插入图片描述
在这里插入图片描述
用头插法将食物节点插入,释放下一个位置的节点,打印蛇,最后创建食物
在这里插入图片描述
将下一个节点头插到蛇头,然后将尾接点用空格覆盖掉,最后将尾接点释放掉
在这里插入图片描述

3.34检测是否撞墙或自己

在这里插入图片描述
在这里插入图片描述
检测头的横纵坐标是否为墙
在这里插入图片描述
检测头的坐标是否为身体

3.4 游戏结束(善后工作)

打印结束信息:
在这里插入图片描述
在这里插入图片描述
然后释放节点
在这里插入图片描述
接下来就可以将游戏循环起来
在这里插入图片描述

这里要注意输入y后按回车getchar会读取\n,如果想将\n清理掉,就要在调用getchar
在更改一下:
在这里插入图片描述

4.项目代码

snake.h

#pragma once
#include <locale.h>
#include <stdio.h>
#include <Windows.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
//wchar_t ch1 = L'●';
//wchar_t ch2 = L'★';

void SetPos(short x, short y);
//类型的声明
//蛇身的节点类型
typedef struct SnakeNode
{
	int x;
	int y;
	struct SnakeNode* next;
}SnakeNode;
typedef struct SnakeNode* pSnakeNode;

enum DIRECTION //记录方向(枚举)
{
	UP = 1,
	DOWN,
	LEFT,
	RIGHT
};
//蛇的状态(正常,撞墙,撞到自己,正常退出)
enum GAME_STATUS
{
	OK, //正常
	KILL_BY_WALL, //撞墙
	KILL_BY_SELF, //撞到自己
	END_NORMAL  //正常退出
};
typedef struct Snake
{
	pSnakeNode _pSnake;//指向蛇头变量
	pSnakeNode _pFood;//指向食物的指针
	enum DIRECTION _dir;//记录方向(枚举)
	enum GAME_STATUS _status;//游戏的状态
	int _food_weight; //食物的分数
	int _score;//总成绩
	int _sleep_time;//休息时间(时间越短,速度越快)
}Snake;
typedef Snake* pSnake;

void GameStart(pSnake ps);//初始化游戏

void WelcomeToGame();//欢迎界面

void GreateMap();//绘制地图

void InitSnake(pSnake ps);//创建蛇

void CreateFood(pSnake ps); //创建食物

void GameRun(pSnake ps);//游戏运行逻辑

void SnackMove(pSnake ps);//蛇的移动

int NextIsFood(pSnakeNode pn, pSnake ps);//检测下一个坐标是否是食物

void EatFood(pSnakeNode pn, pSnake ps);
void NoFood(pSnakeNode pn, pSnake ps);

//检测是否撞墙或自己
void KillByWall(pSnake ps);
void KillBySelf(pSnake ps);

void GameEend(pSnake ps);

snake.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "snake.h"

void SetPos(short x, short y)
{
	HANDLE houtput = NULL;
	houtput = GetStdHandle(STD_OUTPUT_HANDLE);

	COORD pos = { x,y };
	SetConsoleCursorPosition(houtput, pos);
}

void WelcomeToGame()
{
	SetPos(40, 13);
	printf("欢迎来到贪吃蛇小游戏\n");
	SetPos(42, 20);
	system("pause");
	system("cls");
	SetPos(27, 13);
	wprintf(L"用↑.↓.←.→分别控制蛇的移动,F3为加速,F4为减速\n");
	SetPos(27, 14);
	printf("加速能获得更高的分数\n");
	SetPos(40, 20);
	system("pause");
	system("cls");
}

#define WALL L'□'
#define BODY L'●'
void GreateMap()
{
	//上
	for (int i = 0; i < 29; i++)
	{
		wprintf(L"%lc", WALL);
	}
	//下
	SetPos(0, 26);
	for (int i = 0; i < 29; i++)
	{
		wprintf(L"%lc", WALL);
	}
	//左
	for (int i = 1; i < 26; i++)
	{
		SetPos(0, i);
		wprintf(L"%lc", WALL);
	}
	//右
	for (int i = 1; i < 26; i++)
	{
		SetPos(56, i);
		wprintf(L"%lc", WALL);
	}
	
}

#define POS_X 24
#define POS_Y 5
void InitSnake(pSnake ps)
{
	pSnakeNode cur = NULL;
	for (int i = 0; i < 5; i++)
	{
		cur = (pSnakeNode)malloc(sizeof(SnakeNode));
		if (cur == NULL)
		{
			perror("malloc");
			exit(1);
		}
		cur->next = NULL;
		cur->x = POS_X + i * 2;
		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;//毫秒
	ps->_status = OK;
}

#define FOOD L'★'
void CreateFood(pSnake ps)
{
	int x = 0;
	int y = 0;
again:
	do
	{
		x = rand() % 53 + 2;
		y = rand() % 24 + 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)
	{
		perror ("pFood::malloc");
		exit(1);
	}
	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 = NULL;
	houtput = GetStdHandle(STD_OUTPUT_HANDLE);

	//创建光标信息结构体
	CONSOLE_CURSOR_INFO cursor_info = { 0 };

	//获取光标的信息,放在cursor_info中
	GetConsoleCursorInfo(houtput, &cursor_info);

	//修改光标占比
	//cursor_info.dwSize = 100;
	cursor_info.bVisible = false;

	//设置光标信息
	SetConsoleCursorInfo(houtput, &cursor_info);

	//1.打印欢迎界面
	WelcomeToGame();
	//2.绘制地图
	GreateMap();
	//3.创建蛇
	InitSnake(ps);
	//4.创建食物
	CreateFood(ps);
}


void PrintHelpInfo()
{
	SetPos(64, 15);
	wprintf(L"%ls\n", L"不能穿墙,不能咬到自己");
	SetPos(64, 16);
	wprintf(L"%ls\n", L"用↑.↓.←.→分别控制蛇的移动.");
	SetPos(64, 17);
	wprintf(L"%ls\n", L"F3 为加速,F4为减速");
	SetPos(64, 18);
	wprintf(L"%ls\n", L"ESC :退出游戏.空格:暂停游戏.");
}

#define KEY_PRESS(vk) ((GetAsyncKeyState(vk)&1)?1:0)

void Pause()
{
	while (1)
	{
		Sleep(200);
		if (KEY_PRESS(VK_SPACE))
		{
			break;
		}
	}
}

int NextIsFood(pSnakeNode pn, pSnake ps)
{
	assert(ps->_pFood);
	return (pn->x == ps->_pFood->x && pn->y == ps->_pFood->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);
	cur->next = NULL;
}

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 SnackMove(pSnake ps)
{
	//创建一个节点来表示蛇即将到的下一个节点
	pSnakeNode pNextNode = (pSnakeNode)malloc(sizeof(SnakeNode));
	if (pNextNode == NULL)
	{
		perror("SnackMove()::malloc()");
		exit(1);
	}
	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);
	}

	//检测蛇是否撞到墙或自己
	KillByWall(ps);
	KillBySelf(ps);
}


void GameRun(pSnake ps)
{
	//打印帮助信息
	PrintHelpInfo();
	do
	{
		SetPos(64, 10);
		printf("总分数:%d", ps->_score);
		SetPos(64, 11);
		printf("当前食物分数:%2d", 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_RIGHT) && ps->_dir != LEFT)
		{
			ps->_dir = RIGHT;
		}
		else if (KEY_PRESS(VK_LEFT) && ps->_dir != RIGHT)
		{
			ps->_dir = LEFT;
		}
		else if (KEY_PRESS(VK_SPACE))
		{
			//暂停
			Pause();
		}
		else if (KEY_PRESS(VK_ESCAPE))
		{
			//正常退出
			ps->_status = END_NORMAL;
		}
		else if (KEY_PRESS(VK_F4))
		{
			//加速
			if (ps->_sleep_time > 80)
			{
				ps->_sleep_time -= 30;
				ps->_food_weight += 2;
			}
		}
		else if (KEY_PRESS(VK_F3))
		{
			//减速
			if (ps->_food_weight > 2)
			{
				ps->_sleep_time += 30;
				ps->_food_weight -= 2;
			}
		}
		SnackMove(ps);//蛇的移动
		Sleep(ps->_sleep_time);
	} while (ps->_status == OK);

}

void GameEend(pSnake ps)
{
	SetPos(24, 12);
	switch (ps->_status)
	{
	case END_NORMAL:
		printf("您主动结束游戏\n");
		break;
	case KILL_BY_WALL:
		printf("您撞到了墙上,游戏结束\n");
		break;
	case KILL_BY_SELF:
		printf("您撞到了自己,游戏结束\n");
		break;
	}
	
	//释放节点
	pSnakeNode cur = ps->_pSnake;
	pSnakeNode del = ps->_pSnake;
	while (cur)
	{
		del = cur;
		cur = cur->next;
		free(del);
	}
	SetPos(0,27);
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "snake.h"

void Test()
{
	int ch = 0;
	do
	{
		system("cls");
		//创建贪吃蛇
		Snake snake = { 0 };
		//初始化游戏
		GameStart(&snake);

		运行游戏
		GameRun(&snake);
		结束游戏(善后工作)
		GameEend(&snake);
		SetPos(20, 15);
		printf("再来一局吗?(y/n):");
		ch = getchar();
		while (getchar() != '\n');
	} while (ch == 'Y' || ch == 'y');
	SetPos(0, 27);
}

int main()
{
	setlocale(LC_ALL, "");//适配本地化
	srand((unsigned int)time(NULL));
	Test();//游戏的测试逻辑
	return 0;
}


好了本篇文章就结束了,希望大家可以动手自己去写一下,还是会有一些收获的

到这里C语言的语法部分就差不多了,后续我会继续写C语言数据结构的文章了,C语言语法部分看看可能会补充一部分,还是看看时间吧,大家加油!!!

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

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

相关文章

记录好用的python包

记录好用的python包 PipxCentos 安装pipx确保 Pip 被安装更新 Pip安装 Pipx添加 Pipx 到 PATH临时添加到 PATH:永久添加到 PATH: 验证 Pipx 安装 Hatch安装特性 Poetry安装准备工作创建虚拟环境激活虚拟环境安装包追踪 & 更新包常用配置pycharm 远程连接poetry创建的虚拟环…

pycharm创建的项目

pycharm生成django templates删出 settings.py

数据分析_商品维度占比及变化可视化分析(Pandas和Matplotlib)

数据分析_商品维度占比及变化可视化分析(Pandas和Matplotlib) 分析维度包括: 各商品年度销量占比 各商品月度销量变化 构建测试数据 这里你可以了解到: 如何生成时间相关的数据。 如何从列表&#xff08;可迭代对象&#xff09;中生成随机数据。 Pandas 的 DataFrame 自…

IOS 32位调试环境搭建

一、背景 调试IOS程序经常使用gdb&#xff0c;目前gdb只支持32位程序调试&#xff0c;暂不支持IOS 64位程序调试。IOS 32位程序使用GDB调试之前&#xff0c;必须确保手机已越狱&#xff0c;否则无法安装和使用GDB调试软件。下面详细介绍GDB调试IOS 32位程序的环境搭建。 二、I…

数字时代的智慧演奏

数字化时代&#xff0c;工业不再是孤独的机器运转&#xff0c;而是演绎着一场智能与数据的华丽交响。无数智能节点的联动&#xff0c;数据的涌动&#xff0c;成为工业的新活力&#xff0c;同时也是创新的源泉。 工业互联网将每个机器、设备连接在一起&#xff0c;打破了原本独立…

从预训练损失的角度,理解语言模型的涌现能力

原文&#xff1a;Understanding Emergent Abilities of Language Models from the Loss Perspective 摘要 本文从预训练损失的角度重新审视语言模型的涌现能力&#xff0c;挑战了以往以模型大小或训练计算量为标准的观念。通过实验&#xff0c;作者发现预训练损失是预测下游任…

SRIO系列-时钟逻辑与复位逻辑

一、前言 上一篇讲述了SRIO协议的基本概念&#xff0c;传输的HELLO帧格式、事务类型等&#xff0c;本篇说一下SRIO IP核的时钟关系。 基本的IP设置可以参考此篇文章&#xff1a;【高速接口-RapidIO】Xilinx SRIO IP 核详解-CSDN博客 二、时钟关系 PHY可以在两个时钟域上运行…

C#语法知识之运算符

3、运算符 目录 3、运算符1、算数运算符思考 秒转化时间 2、字符串拼接3、条件运算符4、逻辑运算符5、位运算符6、三目运算符思考 闰年 1、算数运算符 1、赋值符号 //把右侧的值赋给左侧的变量2、算数运算符 _ * / float f 1 / 2f; %3、算数运算符的优先级 //乘除余优先级高…

【数据结构3-栈和队列】

数据结构3-栈和队列 1 栈-特殊的线性表-先进后出1.1 栈的三个案例 2 队列-与栈相反-先进先出2.1 队列的案例 3 用C实现栈的代码&#xff1a;4 用C实现队列的代码 1 栈-特殊的线性表-先进后出 1.1 栈的三个案例 2 队列-与栈相反-先进先出 2.1 队列的案例 3 用C实现栈的代码&…

<计算机网络自顶向下> TCP拥塞

目录 TCP拥塞控制机制 TCP拥塞感知 TCP速率控制方法 TCP拥塞控制和流量控制的联合动作 TCP拥塞控制策略 TCP吞吐量 TCP公平性 TCP拥塞控制机制 端到端的拥塞控制机制 路由器不向主机提供有关拥塞的反馈信息 路由器负担较轻 符合网络核心简单的TCP/IP架构原则 端系统根据自…

【机器学习】农田智能监控系统的实践探索

机器学习赋能现代农业&#xff1a;农田智能监控系统的实践探索 一、机器学习在现代农业中的重要作用二、机器学习在农田智能监控系统中的应用三、农田智能监控系统的实践意义 在科技飞速发展的今天&#xff0c;机器学习技术正以其强大的数据处理和模式识别能力&#xff0c;逐步…

Windows下Git的使用

目录 一、克隆远程仓库到本地二、git的三板斧2.1 add-将代码添加到本地仓库2.2 commit-提交代码到本地仓库2.3 push-推送本次添加操作到远程仓库2.4 gitee只有三板斧吗&#xff1f; 三、推送后没有出现绿点四、push到远程时报错五、git图形化界面下载链接 一、克隆远程仓库到本…

nodejs大文件上传

安装依赖 1.express 帮我们启动服务&#xff0c;并且提供接口 2.multer 读取文件&#xff0c;存储 3.cors 解决跨域 项目的目录结构&#xff1a; 前端代码&#xff1a; <input type"file" /><script>const file document.queryselector(input)// 分隔…

【漏洞复现】WordPress_Wholesale_Market admin-ajax.php 任意文件读取漏洞

0x01 产品简介 WordPress Wholesale Market是一个WordPress主题,专门设计用于创建批发市场和在线商城网站。该主题提供了许多功能和设计元素,使您能够轻松地构建一个功能强大的批发市场平台,以满足批发商和零售商的需求。 0x02 漏洞概述 WordPress Wholesale Market存在任…

(2022级)成都工业学院数据库原理及应用实验八: 数据库恢复技术

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求&#xff0c;请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 1、使用mysqldump实现数据库备份。 2、使用mysqldump实…

【声呐仿真】学习记录1-配置dave、uuv_simulator

【声呐仿真】学习记录1-配置dave、uuv_simulator 1.介绍2.配置3.一些场景 1.介绍 家|DAVE项目 — Home | Project DAVE 2.配置 参考官方教程安装|DAVE项目 — Installation | Project DAVE mkdir -p ~/uuv_ws/src cd ~/uuv_ws/src git clone https://github.com/Field-Robot…

基于SpringBoot的“体质测试数据分析及可视化”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“体质测试数据分析及可视化”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 体质测试数据分析及可视化设计结构图…

python多线程技术(Threading)

文章目录 前言一、多线程(Threading)是什么?二、threading库1.初识多线程2.增加新线程2.1 多线程的基本使用2.2 对多线程是同时进行的进行一个直观上的演示(非重点--理解是实时就行)2.3 thread.join()功能2.4 使用queue(队列)功能获取多线程的返回值(重要,这就是前面那…

永恒之蓝上线CS

该文介绍了在内网环境下&#xff0c;利用永恒之蓝漏洞&#xff08;EternalBlue&#xff09;将攻击者控制台&#xff08;CS&#xff09;上线的方法。前提条件是目标机器可上网、无防火墙和杀毒软件&#xff0c;并且存在永恒之蓝漏洞。使用Erebus插件的eterblue功能&#xff0c;通…

【Java框架】Spring框架(三)——Spring整合Mybatis及Spring声明式事务

目录 回顾Mybatis和新对象思路整理 Spring和MyBatis的整合步骤1. 创建Web工程&#xff0c;导入Spring和MyBatis的相关依赖2. 建立开发目录结构&#xff0c;创建实体类3. 创建数据访问接口和SQL映射语句文件4. 使用Spring配置文件配置数据源4.1 database.properties4.2spring配置…