C语言贪吃蛇课程设计实验报告(包含贪吃蛇项目源码)

文末有贪吃蛇代码全览,代码有十分细致的注释!!!
文末有贪吃蛇代码全览,代码有十分细致的注释!!!
文末有贪吃蛇代码全览,代码有十分细致的注释!!!

码文不易,给个免费的小星星和免费的赞吧,关注也行呀(⑅•͈ᴗ•͈).:*♡ 

不要白嫖哇(⁍̥̥̥᷄д⁍̥̥̥᷅ ू )伤心

目录

1 课题分析 

1.1研究背景与现状

1.2研究意义与研究步骤

2 设计概述

2.1 项目具体内容

2.2 系统框图

2.2.1程序结构图

2.2.2游戏流程图

2.2.3查看规则界面流程图

2. 系统模块划分

3 详细设计说明

3.1 主菜单界面设计说明

3.1.1 设计说明

3.1.2 功能展示

3.2 查看规则界面设计说明

3.2.1 设计说明

3.2.2 功能展示

3.3 开始游戏界面设计说明

3.3.1 设计说明

3.3.2 功能展示

4 结论


设计题目: 贪吃蛇大作战

设计内容与要求:

设计内容:

使用C语言编程,设计出贪吃蛇游戏功能。其中该项目主要分为三个界面,分别是菜单界面,规则界面和游戏主体界面。

创新点: 将蛇身单一颜色变为随游戏进程变化的彩虹色,修改速度机制和分数奖励机制,新增鼠标交互式菜单,增强游戏体验。

设计要求:

通过游戏设计巩固C语言知识,合理规范书写函数并正确调用。运用easyx增加拓展性内容,理解所使用函数的方法。

设计中遇到报错及时调试分析,查阅资料,对同一功能进行多方法比较使用,确保代码正确,正常运行。

指导教师:

1 课题分析 


1.1研究背景与现状

随着计算机行业迅速发展,也涌现了多种热门编程语言,作为使用十分广泛的高级程序设计语言,C语言程序开发学习尤为重要,其绘图能力强,可移植性,具有强大数据处理能力的特点,适于编写系统软件、图形和动画。

当今游戏成为时下比较流行的一种消遣方式,贪吃蛇这款游戏正好符合大众心理,适应人群广泛,具有很强的娱乐性和交互性,可以丰富人们娱乐时间。

贪吃蛇作为一款小游戏,运行简单,易上手,游戏机制的刺激性强,能引人入胜,爱不释手,且相较于大型游戏的长时间消耗,贪吃蛇对碎片化娱乐时间更具有合理性,可以做到简单易行,满足人们需求。

本文主要目的为研究并设计C语言贪吃蛇游戏,利用EasyX Graphics Library免费绘图库实现游戏画面,函数设计与调用,制定游戏规则与运行机制,并在Windows控制台主机输出画面,实现游戏运行。

1.2研究意义与研究步骤

研究意义:

在快节奏社会中,人们时间更加紧凑,娱乐休闲时间也显得十分紧促,在大型游戏受众范围广的情况下,轻游戏和快游戏更紧贴胃口,在碎片化时间里让用户得到更满足的快节奏娱乐体验。

通过贪吃蛇小游戏,人们不仅可以在休闲时间娱乐,还可以在游戏中记录自己的分数记录,在一次次挑战中提升自我,游戏的用意也是告诉人们不断向前,突破自我,向着目标前行才能取得成功。同时,研究C语言课程设计,编写贪吃蛇游戏,可以锻炼思维,熟悉代码运用,有利于为未来项目开发积累经验,全面发展。

研究步骤:

(1)设计: 游戏最重要的是界面显示设计,要考虑游戏窗体大小,文字内容提示,让用户在打开游戏过程中有良好的运行体验,明确每个功能的作用与游戏操作。其次是设计流畅良好的键鼠操作,让玩家有更良好的交互反馈。

(2)游戏程序测试是关键步骤。每增加一个游戏功能函数,就要对其进行实例测试,确保代码无报错、贪吃蛇运行过程无误、游戏界面无不良输出。并在键鼠交互保证其流畅性和稳定性,为用户提供良好的游戏体验。

2 设计概述


2.1 项目具体内容

该项目通过C程序语言以及EasyX Graphics Library绘图库设计出贪吃蛇游戏程序。其中该项目主要分为三个界面,分别是主菜单界面,规则界面和开始游戏界面。

通过主菜单界面我们可以进入开始游戏界面,通过鼠标交互点击按钮,即可开始游戏,游戏可实时计分。在查看规则界面可以看到贪吃蛇游戏规则设定,并查看游戏历史最高分。如果想退出游戏,便可在主菜单选择退出按钮结束程序运行。

2.2 系统框图

2.2.1程序结构图

贪吃蛇游戏程序主要由主菜单界面,游戏界面,规则界面和退出游戏界面构成如图2-1所示。

图2-1 程序结构图

2.2.2游戏流程图

游戏的主体由几个函数构成,分别为游戏初始化函数,画面显示函数,分数读写函数,交互函数,下面是游戏运行的流程图,如图2-2所示:

图2-2 游戏流程图 

2.2.3查看规则界面流程图

查看规则界面由读取最高分、界面文字输出和鼠标按钮交互实现,定义结构体鼠标,判断其行为,如果不点击按钮,则处于规则界面不进行任何操作,如图2-3所示:

图2-3 规则界面流程图

2. 系统模块划分

课程项目设计中,贪吃蛇游戏主要分为三个界面,分别是菜单界面,规则界面和游戏主体界面。模块划分为主菜单模块、游戏初始化、画面显示、蛇移动模块、与键盘输入有关的更新(即键盘控制蛇的移动方向)、与输入无关的更新(移动速度控制),奖励机制、分数模块

在主菜单界面设计当中,我们通过easyx图形库来设计出按钮的选项,并对界面着色,通过监控鼠标左键的行为及鼠标点击位置来判断用户所选择的按钮选项,以此实现交互,完成界面跳转

当选择“开始游戏”选项,则进入游戏开始函数,进行游戏的初始化和最高分读取,对蛇及画面进行初始化,而后进入循环,当不满足游戏的失败条件,界面就会一直更新绘图,确保游戏的持续进行

其中在贪吃蛇游戏的速度机制和奖励机制分别做了改良,速度可以同时满足长按方向键加速前进,并且吃的食物越多,速度越快;分数奖励机制则满足一定的阈值限定,每当吃的食物达到一定程度,分数会以倍数增加,提高奖励分。

在游戏失败结算界面中,我们添加了分数显示,更直观地看到此局游戏中用户所得分数,而在分数模块,会进行txt文件读写操作,如果玩家分数大于最高分,则此局分数覆盖最高分。

3 详细设计说明


3.1 主菜单界面设计说明

3.1.1 设计说明

主菜单界面运用图形库的绘画功能,绘画出按钮矩形,并在按钮输出提示文字,让玩家理解其功能作用,并通过while函数时刻监控鼠标消息,当鼠标左键单击时,再进行if判断语句,当符合其中一个按钮的点击位置时,就进入该if语句中的函数,实现跳转功能

3.1.2 功能展示

主菜单界面如图3-1所示。

图3-1 主菜单界面

3.2 查看规则界面设计说明

3.2.1 设计说明

查看规则界面功能:在查看规则界面中,玩家可以了解规则事项以及游戏涉及到的按键操作,同时在此界面显示最高分,让玩家有一个游戏目标,在了解相关规则后,玩家可以点击按钮返回主菜单,选择开始游戏或退出游戏。 

具体实现:实现的界面展示与主菜单一致,读取最高分则利用到编写的分数读写函数,把txt文件中的分数读取并显示于界面上

3.2.2 功能展示

查看规则界面如图3-2所示。

图3-2查看规则界面

3.3 开始游戏界面设计说明

3.3.1 设计说明

开始游戏界面功能:实现游戏的主体,绘画蛇、食物与游戏界面,键盘操作贪吃蛇移动吃食物,界面展示最高分,并随着进程进行,实时记录分数,当游戏结束时,弹出结算画面字样

具体实现:通过设置画布大小确定界面,并画横竖线把画布分为小方格,计算固定的像素值,把每个矩形方格都一一对应方格数组。在游戏初始化时遍历该数组来绘画蛇以及食物,此后每一次画面更新,都会遍历数组刷新蛇的长度和食物位置。

实时记录分数则通过定义一个int变量,根据分数机制增加对应数值,然后转化成char类型存入字符数组,再将其输出至画面。

游戏结算界面则通过判断蛇头所处位置,让全局变量改变数值,跳出游戏的循环,并输出相应文字。

3.3.2 功能展示

游戏界面如图3-3图3-4所示。

图3-3 游戏界面

 图3-4 游戏结算界面

4 结论


通过一个学期的C语言课程的学习,我与我的组员对c语言有了更深一步的了解。从一开始的什么都不会,自己一点点慢慢的摸索。发现书本上学到的东西还是很不够的,还有好多东西需要课外的学习。对于贪吃蛇,知道了它的实现原理,学会了对程序的模块设计、数据结构设计的简单分析。并通过源码分析讲述了各个模块的实现方法。在几个模块的实现过程中渗透了部分图形功能函数。通过本文的编写过程 ,掌握了以下几点知识点:

1.图形系统的初始化和关闭

2.各种画图函数的使用

3.结构体的定义

5.函数嵌套及调用

6.键盘操作

总的来说,编程还是一个很需要耐心的工作,特别是有bug找不出来的时候,特别需要我静下心来好好研究。很多时候都没有耐心改下去了。这次学习对我们组的耐心是一个极大的磨砺,收获还是蛮多的,在这次课程设计中我们巩固了C语言知识,学会了合理规范书写函数并正确调用,并且能够运用easyx增加拓展性内容,最重要的是发现了自己的不足之处。

我们接下来会再接再厉,不断实践,不断突破自己,争取做出更好的作品。

附录:

贪吃蛇程序如下:

#include <graphics.h>
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <cstdio>

#define	Width 40		//宽40格
#define Height 30		//高30格
#define Size 20			//格子大小:20

int blocks[Width][Height] = {0};		//用以表示所有方格
char moveDir;			//表示运动方向
char oldmove;			//旧的移动方向
int fx, fy;				//food食物坐标
int addspeed = 15;		//控制初始速度
int failure = 0;		//用以判断游戏是否失败,失败赋值为 1
int score = 0;			//记录分数
int max = 0;			//记录最高分
int k = 1;				//奖励机制初始值
char num[20];			//输出分数数组
char best[20];			//最高分数组	

void initGame();
void show();			//图像绘制更新显示函数
void WithInput();		//与输入有关的更新
void WithoutInput();	//与输入无关的更新
void movesnake();		//蛇的移动函数
void readscore();		//读取分数
void writescore();		//写入分数
void ShowWord();		//界面文字
void drawmenu();		//主菜单
void gamestart();		//开始游戏
void seerule();			//查看规则
void back();			//退出游戏

int main() {				
	drawmenu();
	return 0;
}	  

void initGame() {		
	int i;
	initgraph(1000, 600);		//①初始化绘图窗口,格子个数乘格子大小即为长度
	setbkcolor(CYAN);		//设置背景颜色
	BeginBatchDraw();		//easyx中实现批绘图功能的函数,可以消除图像闪烁
	cleardevice();			//使用当前背景色清空绘图设备
	setlinecolor(WHITE);	//划线颜色为白色

	for (i = Size; i < Width * Size+1; i += Size) {		//用for循环绘制多条线
		line(i, 0, i, Height * Size);				//竖线坐标从x1(i,0)-> y1(i,Height * Size)
	}
	for (i = Size; i < Height * Size; i += Size) {
		line(0, i, Width * Size, i);				//横线坐标从x2(0,i) -> y2(Width * Size, i)
	}

	moveDir = oldmove = 'd';			//初始化默认蛇行进方向朝右

	blocks[Width / 2][Height / 2] = 1;				/*正中间画蛇头,蛇为赋值的方格
													0则为空白区域*/
	for (i = 1; i < 4; i++) {
		blocks[Width / 2 - i][Height / 2] = i + 1;	//y坐标不变,更改x坐标,在蛇头后方画蛇身
	}

	srand(time(0));									//srand函数产生一个时间种子,从而达到真正的随机效果
	fx = rand() % (Width - 1) + 1;					//随机数除39取余并+1,则为食物所生成的格子x坐标
	fy = rand() % (Height - 1) + 1;					//随机数除取余并+1,则为食物所生成的格子y坐标
}	   

void show() {			
	cleardevice();
	for (int i = 0; i < Width; i++) {				//遍历所有方格,更新蛇的颜色
		for (int j = 1; j < Height; j++) {
			if (blocks[i][j] != 0) {
				setfillcolor(HSVtoRGB(blocks[i][j] * 10, 0.9, 1));	//HSV转RGB颜色,色调H 0°->360°,此处设置每长一个蛇身,提升10°色调,饱和度0.9,明度1
			}else{
				setfillcolor(CYAN);					//否则更新为正常背景颜色
			}
			fillrectangle(i * Size, j * Size, (i + 1) * Size, (j + 1) * Size);		//填充,(参数为左上角和右下角坐标)
		}
	}
	setfillcolor(LIGHTGREEN);						//食物颜色
	fillrectangle(fx * Size, fy * Size, (fx + 1) * Size, (fy + 1) * Size);

	ShowWord();

	FlushBatchDraw();				/*BeginBatchDraw执行后,任何绘图操作都将暂时不输出到绘图窗口上
								直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出。*/
}

void ShowWord() {
	if (failure) {
		settextcolor(LIGHTRED);						//设置字体颜色
		settextstyle(80, 0, _T("宋体"));				//设置字体样式
		setbkmode(TRANSPARENT);
		outtextxy(240, 220, "游戏失败");
		settextstyle(40, 0, _T("宋体"));
		sprintf(num, "%d", score);						//将int转换为char并存入num中
		outtextxy(260, 360, "分数:");					//显示的字体及坐标
		outtextxy(380, 360, num);
	}
	else {												//②
		settextcolor(BLACK);							//设置分数颜色
		settextstyle(25, 0, _T("隶书"));				//设置字体样式
		setbkmode(TRANSPARENT);							//设置当前设备图案填充和文字输出时的背景模式,THANSPARENT为透明背景
		sprintf(num, "%d", score);						//将int转换为char并存入num中
		outtextxy(860, 40, "分数:");					//显示的字体及坐标
		outtextxy(940, 42, num);
		outtextxy(845, 73, "最高分:");
		sprintf(best, "%d", max);
		outtextxy(940, 75, best);
	}
}
void readscore() {										//③
	FILE* fpread = fopen("score.txt", "r");				//以只读的方式打开文件
	if (fpread == NULL) {
		return;
	}
	fscanf(fpread, "%d", &max);
	fclose(fpread);
}

void writescore() {
	FILE* fpWrite = fopen("score.txt", "w");			//"w"打开并写入文本文件.(若不存在则新建,反之,则从头写,覆盖原内容)
	if (fpWrite == NULL) {
		return ;
	}
	fprintf(fpWrite, "%d", score);
	fclose(fpWrite);				
}

void WithInput() {
	if (_kbhit() && failure == 0) {
		//键盘输入控制蛇的方向
		char input = _getch();

		if (input == 'a' || input == 's' || input == 'd' || input == 'w') {
			moveDir = input;
			//设定规则:当向某一方向行动时,按下反向键不起作用(防止误触导致判断为咬到蛇身游戏失败),强制将按下的反向键变为当前运动方向
			if (moveDir == 'a' && oldmove == 'd') {
				moveDir = 'd';
			}
			else if (moveDir == 's' && oldmove == 'w') {
				moveDir = 'w';
			}
			else if (moveDir == 'd' && oldmove == 'a') {
				moveDir = 'a';
			}
			else if (moveDir == 'w' && oldmove == 's') {
				moveDir = 's';
			}
			else {
				oldmove = input;
			}
			movesnake();
		}
	}
}

void WithoutInput() {
	
	if (failure) {				//先判断是否失败,失败则返回
		return;
	}
	//Sleep(100);				//更新速度控制蛇的移动速度,但使用sleep会产生键盘控制与画面的延迟,所以不使用
	//movesnake();
	static int speed = 1;		//设置一个静态变量speed,利用循环特定次数来触发movesnake函数
	speed++;
	if (speed == addspeed) {	//每15帧移动一次,同时实现长按方向键加快蛇的移动速度
		movesnake();
		speed = 1;
	}
}

void movesnake() {
	int i, j;
	//对蛇进行更新,蛇每个格数值都+1,以便后面预备一个数值为1的新蛇头,当吃到食物时,新蛇头改变颜色加入蛇身中
	for (i = 0; i < Width; i++) {
		for (j = 0; j < Height; j++) {
			if (blocks[i][j] != 0) {
				blocks[i][j]++;
			}
		}
	}

	int oldhx, oldhy, oldtx, oldty;			//旧蛇头和旧蛇尾的坐标
	int tailblock = 0;
	for (i = 0; i < Width; i++) {
		for (j = 0; j < Height; j++) {
			if (tailblock < blocks[i][j]) {
				tailblock = blocks[i][j];	//遍历找出最大值即为蛇尾
				oldtx = i;
				oldty = j;
			}
			if (blocks[i][j]==2) {			//寻找旧蛇头
				oldhx = i;
				oldhy = j;
			}
		}
	}
	//根据蛇的运动方向来赋值新蛇头的xy坐标
	int newhx = oldhx, newhy = oldhy;		//定义新蛇头
	switch (moveDir) {
	case'a':
		newhx -= 1;
		break;
	case's':
		newhy += 1;
		break;
	case'd':
		newhx += 1;
		break;
	case'w':
		newhy -= 1;
		break;
	}
	//判断游戏是否失败
	if (newhx >= Width || newhx < 0 || newhy >= Height || newhy < 0 || blocks[newhx][newhy] != 0) {
		failure = 1;
		return;
	}
	//令蛇头方格值为1
	blocks[newhx][newhy] = 1;
	//对吃到食物以及蛇尾的处理				⑤
	if (newhx == fx && newhy == fy) {		//吃到食物,重新随机数生成新食物坐标
		score = score + k;					//吃到食物分数+k
		if (score % 2 == 0) {				//通过判断吃食物的数量来叠加奖励分
			k = k + 1;
		}

		if (score > max) {					//与最高分判断,条件成立才能覆盖最高分
			writescore();					//写入最高分
		}
											//④
		if (score) {						//“加速”判断,通过判断分数增大的取值,加快蛇的运动速度,score不为0时进入该判断语句
			if (score % 2 == 0) {			//便于测试结果明显,设置每吃2个食物,蛇速度加快1帧
				addspeed--;
			}
		}
		fx = rand() % (Width - 1) + 1;		
		fy = rand() % (Height - 1) + 1;
	}else{									//未吃到食物
		blocks[oldtx][oldty] = 0;
	}


}

void drawmenu() {
	MOUSEMSG m;					//定义结构体鼠标m
	initgraph(600, 600);		//定义画布大小
	setbkcolor(CYAN);			//设置背景颜色
	cleardevice();				//使用当前背景色清空绘图设备,类似system(cls)的刷新
	setfillcolor(WHITE);	//方框颜色

	fillrectangle(140, 50, 460, 170);			//矩形左上角xy坐标和右下角xy坐标
	fillrectangle(120, 220, 480, 350);			//矩形左上角xy坐标和右下角xy坐标
	fillrectangle(100, 400, 500, 540);			//矩形左上角xy坐标和右下角xy坐标

	settextcolor(BLACK);						//设置字体颜色
	settextstyle(50, 0, _T("楷体"));			//设置字体格式
	setbkmode(TRANSPARENT);						//去除文字背景

	outtextxy(200, 85, "开始游戏");				//文字输出位置的xy坐标
	outtextxy(200, 260, "查看规则");
	outtextxy(200, 445, "退出游戏");

	while (1) {
		m = GetMouseMsg();						//获取一个鼠标消息
		if (m.x >= 140 && m.x <= 460 && m.y >= 50 && m.y <= 170) {		//判断鼠标点击的位置
			if (m.uMsg == WM_LBUTTONDOWN) {		//当鼠标按下左键
				gamestart();					//开始游戏
			}
		}
		else if (m.x >= 120 && m.x <= 480 && m.y >= 220 && m.y <= 350) {
			if (m.uMsg == WM_LBUTTONDOWN) {		//当鼠标按下左键
				seerule();					//查看规则
			}
		}
		else if (m.x >= 100 && m.x <= 500 && m.y >= 400 && m.y <= 540) {
			if (m.uMsg == WM_LBUTTONDOWN) {		//当鼠标按下左键
				back();					//关闭菜单退出游戏
			}
		}
	}
}

void gamestart() {
	readscore();		//读取最高分
	initGame();			//游戏初始化
	while (1) {			//循环进行界面实时刷新,直至游戏判定失败
		show();			//界面显示
		WithoutInput();	//先调用与输入无关的更新
		WithInput();	
	}
}

void seerule() {
	MOUSEMSG m;					//定义结构体鼠标m

	readscore();				//读取历史最高分

	initgraph(600, 600);		//定义画布大小
	setbkcolor(CYAN);			//设置背景颜色
	cleardevice();				//使用当前背景色清空绘图设备,类似system(cls)的刷新
	setfillcolor(WHITE);	//方框颜色

	fillrectangle(100, 400, 500, 540);			//矩形左上角xy坐标和右下角xy坐标

	settextcolor(BLACK);						//设置字体颜色
	settextstyle(50, 0, _T("楷体"));			//设置字体格式
	setbkmode(TRANSPARENT);						//去除文字背景
	outtextxy(200, 445, "返回菜单");

	settextcolor(BLACK);						//设置字体颜色
	settextstyle(30, 0, _T("楷体"));			//设置字体格式
	setbkmode(TRANSPARENT);						//去除文字背景
	outtextxy(45, 30, "WASD控制蛇移动,长按方向键可加速移动");
	outtextxy(45, 80, "碰到墙壁游戏失败");
	outtextxy(45, 130, "吃的食物越多,分数奖励越高");
	outtextxy(45, 180, "历史最高分:");
	sprintf(best, "%d", max);
	outtextxy(220, 180, best);



	while (1) {
		m = GetMouseMsg();						//获取一个鼠标消息
		if (m.x >= 100 && m.x <= 500 && m.y >= 400 && m.y <= 540) {
			if (m.uMsg == WM_LBUTTONDOWN) {		//当鼠标按下左键
				drawmenu();					//返回主菜单
			}
		}
	}
}

void back() {
	closegraph();		//关闭画面
	exit(0);			//退出程序
}

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

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

相关文章

解决Vuex刷新页面数据丢失的问题

参考&#xff1a; https://blog.csdn.net/qq_51441159/article/details/128047610 方法一&#xff08;不使用插件&#xff09;&#xff1a; 1、直接在vuex修改数据方法中将数据存储到浏览器本地存储中 import Vue from vue; import Vuex from vuex;Vue.use(Vuex);export defa…

Java——《面试题——MyBatis篇》

前文 java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 目录 前文 1、什么是MyBatis 2、说说MyBatis的优点和缺点 3、#{}和${}的区别是什么&#xff1f; 4、当实体类中的属性名和…

Nginx-Goaccess(实时日志服务)

goaccess的功能 1、使用webscoket协议传输&#xff08;双向传输协议&#xff09;2、基于终端的快速日志分析器3、通过access.log快速分析和查看web服务的统计信息、PV、UV4、安装简单、操作简易、界面炫酷5、按照日志统计访问次数、独立访客数量、累计消耗的带宽6、统计请求次…

Redis知识点

Redis是一个数据库&#xff0c;不过与传统数据库不同的是Redis的数据库是存在内存中&#xff0c;所以读写速度非常快&#xff0c;因此 Redis被广泛应用于缓存方向。 除此之外&#xff0c;Redis也经常用来做分布式锁&#xff0c;Redis提供了多种数据类型来支持不同的业务场景。除…

Ansible剧本(playbook)

一、playbooks 概述以及实例操作 1、playbooks 的组成 playbooks 本身由以下各部分组成 &#xff08;1&#xff09;Tasks&#xff1a;任务&#xff0c;即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 &#xff08;2&#xff09;Variables&#xff1…

Ubuntu 22 服务器端安装图形化界面

文章目录 前言一、什么是图形化界面二、操作步骤1、更新安装工具2、开始安装3、重启 总结 前言 Ubuntu 系统做得是越来越好了&#xff0c;从CentOS 不再提供维护后&#xff0c;越来越多的企业和公司从CentOS转到Ubuntu服务器系统&#xff0c;转了之后才发现&#xff0c;它比Ce…

MySQL数据库日志管理、备份与恢复

目录 一、MySQL 日志管理 二、数据备份的重要性 造成数据丢失的原因 三、数据库备份的分类 1 、从物理与逻辑的角度 &#xff08;1&#xff09;备份划分 &#xff08;2&#xff09; 物理备份方法 2、 从数据库的备份策略角度 四、常见的备份方法 1、物理冷备 2、专用备…

解决安卓12限制32个线程

Android 12及以上用户在使用Termux时&#xff0c;有时会显示[Process completed (signal 9) - press Enter]&#xff0c;这是因为Android 12的PhantomProcesskiller限制了应用的子进程&#xff0c;最大允许应用有32个子进程。 这里以ColorOS 12.1为例&#xff08;其他系统操作略…

前端vue入门(纯代码)14

内容创作不易&#xff0c;各位帅哥美女&#xff0c;求个小小的赞&#xff01;&#xff01;&#xff01; 【15.给todoList案例添加编辑按钮】 本篇内容在TodoList案例的基础上添加个编辑按钮&#xff0c;要求&#xff1a; &#xff08;1&#xff09;点击编辑按钮后&#xff0c…

数据挖掘——宁县(区、市)农村居民人均可支配收入影响因子分析(论文)

《数据挖掘与分析》课程论文 题目&#xff1a;宁县&#xff08;区、市&#xff09;农村居民人均可支配收入影响因子分析 xx学院xx班&#xff1a;xxx 2022年6月 摘要&#xff1a;农村居民人均可支配收入可能被农作物产量、牲畜存栏、农作物播种数量等诸多因素影响。为此&#…

我的内网渗透-代理转发(1)

概念 网关 必须经过 用来进行路由转发的设备&#xff0c;网关的作用是让不同网段之间能够通信 代理 委托访问 无论代理后面挂了几台设备&#xff0c;都认为是从代理进行访问&#xff0c;对外只表现为代理一台。外部认为是与代理进行…

css小兔鲜项目搭建

目录 精灵图 精灵图的使用步骤 背景图片大小 background连写 文字阴影 盒子阴影 过渡 骨架标签 SEO三大标签 版心的介绍 css书写顺序 项目结构搭建 精灵图 场景&#xff1a;项目中将多张小图片&#xff0c;合并成一张大图片&#xff0c;这张大图片称之为精灵图 优点…

机器人项目创新课题汇总提示

创新课题推荐自己思考并给出&#xff0c;如下案例仅供参考&#xff1a; 不想看&#xff0c;不愿意做&#xff0c;就遵循自己内心想法&#xff0c;做自己喜欢的事情吧。 题目和描述&#xff1a; 自动导航机器人&#xff1a;设计一种能够自主导航的机器人&#xff0c;可以在不需…

pgsql序列的使用

大家都知道pgsql和mysql不同&#xff0c;mysql字段有有自增属性&#xff0c;pgsql并没有&#xff0c;但是pgsql和oracle一样有序列&#xff0c;很多人刚接触pgsql的时候&#xff0c;并不知道序列是什么&#xff0c;怎么用&#xff0c;下面这篇文章就介绍序列&#xff0c;并且怎…

idea如何集成Tomcat

&#xff08;1&#xff09;、这里应该找Add Configuration点击这里&#xff1a;如果没有标志&#xff0c;点击Exit (2)、这里可以配置一个配置项&#xff1a; &#xff08;3&#xff09;、loacl是本地&#xff0c;那个是远程&#xff1a;这里我选择本地 &#xff08;4&#xff…

DJ4-4 NAT、ICMP、IPv6

目录 一、NAT&#xff1a;网络地址转换 1、工作原理 2、NAT 的限制 二、ICMP 1、ICMP 协议 2、ICMP 类型和代码 3、Traceroute 命令 三、IPv6 地址 1、IPv6 的引入 2、IPv6 的表示 一、NAT&#xff1a;网络地址转换 动机&#xff1a;对外部网络来讲&#xff0c;本地…

11-高性能JSON库——fastjson2

目录 1.具体使用 1.1.添加fastjson2依赖 1.2.常用类和方法 1.3.将JSON字符串转换成对象 1.3.1.JSON字符串转换成对象 1.3.2.JSON字符串转换成数组 1.4.将对象转换成JSON字符串 1.4.1.将对象转换成JSON字符串 1.4.2.将数组转换成 JSON 字符串 2.性能测试报告 3.总结 …

Prompt Engineering 面面观

作者&#xff1a;紫气东来 项目地址&#xff1a;https://zhuanlan.zhihu.com/p/632369186 一、概述 提示工程&#xff08;Prompt Engineering&#xff09;&#xff0c;也称为 In-Context Prompting&#xff0c;是指在不更新模型权重的情况下如何与 LLM 交互以引导其行为以获得…

总结905

今日已做&#xff1a; 1.核聚课程 2.进步本回顾&#xff0c;重做8道题&#xff0c;有两道还没掌握&#xff0c;记录3页。 3.线性代数第5讲 4.三大计算&#xff0c;刷题15道&#xff0c;纠错。 5.每日长难句。 6.考研常识课 明日必做 1.熟练背诵《the king’s speech》并默写 2…

字符设备驱动内部实现原理解析

字符设备驱动内部实现原理解析 一. 字符设备驱动对象内部实现原理解析二. 字符设备驱动的注册流程三. 代码示例 一. 字符设备驱动对象内部实现原理解析 用户层&#xff1a; ​ 当用户打开&#xff08;open&#xff09;一个文件时,会生成一个文件描述符表 内核层&#xff1a; 内…