当前位置: 首页 > news >正文

c语言项目-贪吃蛇项目2-游戏的设计与分析

文章目录

  • 前言
  • 游戏的设计与分析
    • 地图:
      • 这里简述一下c语言的国际化特性相关的知识
        • <locale.h> 本地化头文件
        • 类项
        • setlocale函数
      • 上面我们讲到需要打印★,●,□三个宽字符
        • 找到这三个字符
        • 打印的方式有两种:
      • 控制台屏幕的长宽特性:
    • 游戏代码实现:
      • 项目结构:
    • 总结:


前言

前面我们已经将项目所需的背景知识,大体讲解完了,接下来开始对游戏进行设计与分析


提示:以下是本篇文章正文内容,下面案例可供参考

游戏的设计与分析

地图:

我们要设计一个这样的地图:(本项目的设计并不是完全自主的从无到有的设置,而是学习已经写好的项目的思想与设计)
在这里插入图片描述

 在此地图中,□ 代表地图边界,★代表食物,●代表蛇
●,★,□三个符号均是宽字符,占两个字节,显示大小是普通字符的两倍

这里简述一下c语言的国际化特性相关的知识

c语言一开始是由美国人发明的,其使用的当然就是英语,其采用的编码方式是ASCII编码
,只使用了一个字节-准确地说是只使用了7个比特位,共128个字符,
但是对于一些其他非英语的国家如,德国,法国等其使用的字母,如法语中字母有注音符号,就无法用ASCII码表示,
为此,一些欧洲国家就决定用字节中闲置的最高位来引入新的符号,这样就可以用一个字节编码256个字符,
但是这样有个问题即不同国家的编码的字符是不一样的,比如希腊的与法国的就不同,
总体来说,不同国家在0-127表示字符是一样的,在128-256表示的字符是不同的。
在亚洲国家中所使用的字符就更多了,比如在中国,使用的汉字就达到10万左右,一个字节只能表示的256个字符,这是远远不够的,所以需要用多个字节来表示一个字符,比如简体中文常见的编码方式GB2312:即用两个字节表示一个汉字,所以理论上可以表示256*256 == 65536   个汉字!

那么c语言中除了字符集具有国际化特性之外,还有哪些成分具有国际化特性?
c语言的国际化特性,不体现在关键字与操作符,与c语言语法相关的各种符号(*,->等)。

还有数字量的格式
货币量的格式
日期与时间的表示形式c语言标准不断被国际化支持,体现在一些标准头文件与库函数之中,比如:加入宽字符类型 wchar_t类型和宽字符的输入输出函数<locale.h>头文件中
其中提供了程序员针对特定地区调整程序行为(所谓调整程序行为,即在中国此程序该怎样执行,在其他地区此程序该怎样执行)的函数,
<locale.h> 本地化头文件
locale提供的函数用于调整程序在不同地区的表现,正规一点:即帮助程序实现国际化与本地化,以适应不同地区的语言环境要求。
locale提供的函数可以控制c标准库中根据不同地区会产生不一样行为的部分。
因为c标准库中的是函数或者宏,即locale提供的函数可以控制这些函数与宏。
类项

不同地区(语言环境不同),有许多方面不同,比如字符,时间与日期格式,货币的表现形式等,
这些可以调整的部分称其为类项,下面的这些宏针对各自的类项:
在这里插入图片描述

setlocale函数

在这里插入图片描述

 本函数的功能是通过调整C语言模式以改变程序对我们指定类项的操作
本函数的第一个参数是要调整的类项(适配到本地环境),第二个参数是c语言模式
c标准中为这个函数提供了两种参数:一种是:标准模式,对应的参数:" C"第二种是  本地模式:" "    标准模式即英语环境下的c语言版本本地模式即适配当前所在地区的c语言版本可以用setlocale函数返回当前C语言的模式,只需要将函数第二个参数置为NULL即可

我们就以打印宽字符为例:

#include<stdio.h>
#include<locale.h>  //setlocale函数包含在locale.h文件中
int main() {//我们将当前模式先设置成标准模式char* ret = setlocale(LC_ALL, "C");wchar_t a = L'张';  //wchar_t是宽字符的数据类型,汉字是宽字符的一种//在宽字符之前需要加上L,否则会被当做窄字符处理printf("%s\n", ret);wprintf(L"%c\n", a);//在格式串之前也要加上Lreturn 0;
}

在这里插入图片描述
此时的结果:C代表C语言当前模式是标准模式,?代表无法解析字符是什么,这是此时程序执行完的结果。
下面我们改变当前C语言的模式,修改成本地模式:

#include<stdio.h>
#include<locale.h>  //setlocale函数包含在locale.h文件中
int main() {//我们将当前模式先设置成标准模式//char* ret = setlocale(LC_ALL, "C");char* ret = setlocale(LC_ALL, "");wchar_t a = L'张';  //wchar_t是宽字符的数据类型//在宽字符之前需要加上L,否则会被当做窄字符处理printf("%s\n", ret);wprintf(L"%c\n", a);//在格式串之前也要加上Lreturn 0;
}

在这里插入图片描述
此时的结果表明当前的模式是本地在中国,输出宽字符‘张’。

如果我们函数的第一个参数不是LC-ALL全部类项,而是某一类项呢?,比如LC_TIME,那我们还能打印宽字符吗?

#include<stdio.h>
#include<locale.h>  //setlocale函数包含在locale.h文件中
int main() {//改变此时的类项char* ret = setlocale(LC_TIME, ""); wchar_t a = L'张';  //wchar_t是宽字符的数据类型//在宽字符之前需要加上L,以做标记printf("%s\n", ret);wprintf(L"%c\n", a);return 0;
}

在这里插入图片描述
结果显示不能,也就是说此时函数只能调整程序对时间格式的操作,而不能改变其他!

上面我们讲到需要打印★,●,□三个宽字符

找到这三个字符

但是键盘上并没有这三个字符,我们需要用搜狗输入法输入
下载搜狗输入法后:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
就完成了。

打印的方式有两种:

第一种方式就是我们上面所讲的通过locale.h文件,setlocale函数调整C语言当前模式来使得程序能够打印宽字符
第二种方式就是直接通过printf函数,直接用字符串的形式打印:

#include<stdio.h>
#include<locale.h>  //setlocale函数包含在locale.h文件中
int main() {printf("□\n");printf("ab\n");return 0;
}

在这里插入图片描述

控制台屏幕的长宽特性:

#include<windows.h>
int main() {system("mode con cols=30 lines=30");return 0;
}

在这里插入图片描述
问: 为什么行与高均为30,则屏幕会是这样?
是因为X轴的一个单位是一个字节!
而Y轴的一个单位是两个字节!

在这里插入图片描述

游戏代码实现:

我们要设计一个27行,58列的地图:

项目结构:

在这里插入图片描述
Snake.h:

#define KEY_PRESS(vkey) ((GetAsyncKeyState(vkey)&1)?1:0) #include<Windows.h>
#include<stdio.h>
#include<locale.h>
#include<time.h>
#include<stdbool.h>
#define POS_X 26
#define POS_Y 10
//关于游戏的状态
enum STATUS {OK = 1,      //开始END_NORMAL,  //正常结束KILL_BY_WALL,//墙撞结束KILL_BY_SELF //撞到自己结束    };//关于蛇方向的枚举
enum DERECTION
{UP = 1,DOWN,LEFT,RIGHT};//定义一个蛇身节点
typedef struct SnakeNode
{int x;int y;struct SnakeNode* Next; //下一个节点指针!
}SnakeNode,*PSnakeNode;//对于一次游戏的数据封装到一个类当中
typedef struct Snake
{//对于一次游戏中的数据有:PSnakeNode head ;              //指向蛇的指针	enum DERECTION derection;      //蛇转向的方向:                    int sumscore;                  //总分数int foodscore;	               //单个事物的分数PSnakeNode  foodposition;      //食物的位置enum STATUS status;            //游戏的状态——开始,撞墙结束,撞到自己结束,正常结束int SleepTime;                 //停顿的时间——(游戏执行停顿的时间。)}Snake,*PSnake;
//函数的声明
//设置光标的位置
void SetPos(short x, short y);
//打印游戏欢迎界面
void WelcomeToGame(PSnake sn);//游戏的准备工作:
void GameStart(PSnake sn);
//游戏开始运行:
void GameRunning(PSnake sn);
//游戏结束:
void GameEnd(PSnake sn);

Snake.c:

#include"Snake.h"
//设置光标的位置
void SetPos(short x,short y) {HANDLE houtput = GetStdHandle(STD_OUTPUT_HANDLE); //获取屏幕标准输出的句柄//封装光标的位置COORD pos = { x,y };//设置光标位置SetConsoleCursorPosition(houtput, pos);
}
//打印游戏地图
void GameMap(PSnake sn) {//打印游戏地图://打印一个27行58列的游戏地图://打印上届!for (int i = 0; i < 29; i++) {wprintf(L"%lc", L'□');}//打印下界SetPos(0, 26);for (int k = 0; k < 29; k++) {wprintf(L"%lc", L'□');}//打印左界for (int j = 1; j < 27; j++) {SetPos(0, j);wprintf(L"%lc", L'□');}//打印右界//需要将光标设置在地图右上角SetPos(56, 0);for (int x = 1; x < 27; x++) {SetPos(56, x);//根据光标的位置进行打印符号,光标的位置随着x变化wprintf(L"%lc",L'□');}
}
//打印欢迎界面与提示信息
void WelcomeToGame(PSnake sn) {//先打印第一个欢迎页面!SetPos(40, 14);printf("欢迎来到贪吃蛇游戏!!!");   //再打印第二个欢迎界面SetPos(40, 27);system("pause");   //将打印在屏幕上的第一个页面清除掉。system("cls");SetPos(25, 13);printf("用↑.↓.←.→ 分别控制蛇的移动,F3为加速,F4为减速\n");SetPos(25, 14);printf("加速能得到更高的分数!");SetPos(25, 20);system("pause");system("cls");//打印游戏地图:GameMap(sn);}
//设置创建食物
void SetFoodPosition(PSnake sn) {int x = 0;int y = 0;
//需要为食物设置随机坐标:
//这个随机也需要限制,x坐标不能为奇数,
// 食物坐标必须在地图墙之内,且食物不能出现在蛇的体内
// 食物的x坐标也不能为奇数//地图大小为58列,x属于0-57,去除两边的字符,一个字符占两个字节,所以x的范围应该是2-54;
//地图大小为27行,y属于0-26,去除上下的字符,行的宽度为1个字符,所以y的范围应该是1-25
//先获取随机值
again: do {x = rand() % 53 + 2;   //x的坐标范围为2-54:  y = rand() % 25 + 1;
}       //y的坐标范围为1-25
//当x为奇数时,就重新获取while (x % 2 == 1);//判断获取的坐标是否与蛇的身体重复
PSnakeNode tmp = sn->head;
while (tmp != NULL) {if (tmp->x == x && tmp->y == y) {//此时说明食物与蛇身位置相撞。//使用goto语句重新生成食物位置goto  again;}tmp = tmp->Next;
}
//为食物创建一个节点
PSnakeNode cur = (PSnakeNode)malloc(sizeof(SnakeNode));
if (cur == NULL) {perror("SetFoodPositon::malloc");return;}
//当食物位置确定后:
sn->foodposition = cur;
sn->foodposition->x = x;
sn->foodposition->y = y;
//在指定位置打印食物字符
SetPos(x, y);wprintf(L"%lc",L'◇');
}
//初始化蛇身
void InitializeSnake(PSnake sn) {//初始化蛇身for (int i = 0; i < 5; i++) {PSnakeNode cur = (PSnakeNode)malloc(sizeof(SnakeNode));if (cur == NULL) {perror("Intialize::malloc");return;}cur->Next = NULL;cur->x = i * 2 + POS_X;cur->y = POS_Y;//选择头插法if (sn->head == NULL) {sn->head = cur;}else {//进行头插法cur->Next = sn->head;sn->head = cur;}}PSnakeNode cur = sn->head; while (cur !=NULL) {SetPos(cur->x, cur->y);wprintf(L"%lc", L'㊣');cur = cur->Next;}}
//初始化游戏信息
void GameStart(PSnake sn) {//1.欢迎界面的打印与功能介绍与地图的绘制!WelcomeToGame(sn);//2.初始化贪吃蛇的信息// 创建蛇InitializeSnake(sn);//设置蛇最开始的方向:向右sn->derection = RIGHT;//设置游戏的状态:sn->status = OK;//设置食物的分数:10sn->foodscore = 10;//设置当前的总分数:sn->sumscore = 0;//设置食物的位置:SetFoodPosition(sn);//设置游戏停顿的时间sn->SleepTime = 200;
}
//打印游戏的帮助信息!
void PrintHelpInfo() {SetPos(65, 17);printf("不能穿墙,不能咬到自己!");SetPos(65, 18);printf("用↑.↓.←.→来控制蛇的移动!");SetPos(65, 19);printf("按F3加速,F4减速");SetPos(65, 20);printf("按ESC退出游戏,按空格暂停游戏");}
//判断下一个节点是否是食物:
int IsFoodNode(PSnakeNode PNextNode,PSnake sn) {//判断是否是食物:return PNextNode->x == sn->foodposition->x && PNextNode->y == sn->foodposition->y;
}
//蛇吃掉食物
void EatFood(PSnakeNode PNextNode,PSnake sn) {//头插法插入节点sn->foodposition->Next = sn->head;sn->head = sn->foodposition;不可以只打印新增的节点。//SetPos(PNextNode->x,PNextNode->y);PSnakeNode tmp = sn->head;while (tmp != NULL) {SetPos(tmp->x, tmp->y);  wprintf(L"%lc", L'㊣');tmp = tmp->Next;}sn->sumscore += sn->foodscore; //在吃掉一个食物后,分数+单个食物的分数!//释放掉旧的节点:free(PNextNode);
}
//判断是否撞墙!
int  IsKillByWall(PSnakeNode PNextNode) {
return  PNextNode->x == 0 || PNextNode->x == 56 || PNextNode->y == 0 || PNextNode->y == 26;}
//判断是否撞到自己:
int  IsKillBySelf(PSnakeNode PNextNode,PSnake sn) {PSnakeNode tmp = sn->head->Next;while (tmp != NULL) {//如果与蛇身的某一个节点相同if (PNextNode->x == tmp->x && PNextNode->y == tmp->y) { return 1;}tmp = tmp->Next;}return 0;
}
//当遇到空白处时!
void   IsBlank(PSnakeNode PNextNode,PSnake sn) {PNextNode->Next = sn->head;sn->head = PNextNode;//找到尾节点PSnakeNode  tmp = sn->head;while (tmp->Next->Next != NULL) {SetPos(tmp->x, tmp->y);wprintf(L"%lc", L'㊣');tmp = tmp->Next;}//当找到倒数第二个节点时:SetPos(tmp->Next->x, tmp->Next->y);printf(" ");printf(" ");//释放尾结点free(tmp->Next);tmp->Next = NULL;}
//蛇移动一步的操作void SnakeMove(PSnake sn) {//先找到当前蛇头的坐标与蛇头的方向,判断下一步是什么!int x = 0;int y = 0;//用switch语句显得更简洁:switch (sn->derection) {case UP://此时下一个节点的坐标即:x = sn->head->x;y = sn->head->y - 1;break;case DOWN://下一个节点的坐标:x = sn->head->x;y = sn->head->y + 1;break;case LEFT://下一个节点的坐标:x = sn->head->x - 2;y = sn->head->y;break;case RIGHT://下一个节点的坐标x = sn->head->x + 2;y = sn->head->y;break;}//创建一个新的节点PSnakeNode cur = (PSnakeNode)malloc(sizeof(SnakeNode));if (cur == NULL) {perror("NextPace::malloc");return;}cur->x = x;cur->y = y;//要判断此节点是否是墙if (IsKillByWall(cur)) {sn->status = KILL_BY_WALL;//释放掉申请的节点free(cur);return;}//判断是否是食物if (IsFoodNode(cur,sn)){//吃掉食物!EatFood(cur, sn);//当吃掉食物时,需要再随机生成一个食物,SetFoodPosition(sn);return;}//判断是否撞到了自己if (IsKillBySelf(cur, sn)) {sn->status = KILL_BY_SELF;//释放掉申请的节点free(cur);return;}//如果程序执行到这里,说明下一节点是空白处://执行遇到空白时的函数。 IsBlank(cur, sn);}//游戏暂停void Pause() {//让游戏暂停即一直sleep即可!while (1) {Sleep(200);//单位为毫秒。//如果再按一次空格,则停止暂停!if (KEY_PRESS(VK_SPACE)) {break;}}} //游戏运行void GameRunning(PSnake sn) {//游戏运行的逻辑就是每走一步,就观察一下蛇的状态。//根据按键的选项,进行对应的操作://ESC,空格,↑,↓,←,→ F3,F4 这些键的虚拟值为://do {//打印游戏的帮助信息。PrintHelpInfo();SetPos(65, 14);printf("总分数:%2d", sn->sumscore);SetPos(65, 15);printf("当前食物的分数:%2d", sn->foodscore);//检测当前所按的键!//↑按键if (KEY_PRESS(VK_UP)&&sn->derection!=DOWN) {//按键不能与当前蛇的方向进行冲突//在按上键时,方向改变sn->derection = UP;}//↓按键else if (KEY_PRESS(VK_DOWN)&&sn->derection!=UP) {sn->derection = DOWN;}//←按键else if (KEY_PRESS(VK_LEFT)&&sn->derection!=RIGHT) {sn->derection = LEFT;}//→按键else if (KEY_PRESS(VK_RIGHT)&&sn->derection!=LEFT) {sn->derection = RIGHT;}//空格else if (KEY_PRESS(VK_SPACE)){  //游戏暂停Pause();}//ESC else if (KEY_PRESS(VK_ESCAPE)){sn->status = END_NORMAL;}//F3else if (KEY_PRESS(VK_F3)){//F3是加速//游戏休眠的时间不能为负数if (sn->SleepTime > 80) {sn->SleepTime -= 30;sn->foodscore += 2;}		 }//F4else if (KEY_PRESS(VK_F4)){//F4是减速//游戏休眠的时间也不能极其长if (sn->foodscore > 2) {sn->SleepTime += 30;sn->foodscore -= 2;}}SnakeMove(sn);Sleep(sn->SleepTime);} while (sn->status == OK);}//游戏结束的善后工作void GameEnd(PSnake sn) {SetPos(24, 12);switch (sn->status) {case END_NORMAL:printf("您主动退出了游戏!!!\n");break;case KILL_BY_SELF:printf("您撞到了自己,游戏结束!!!\n");break;case KILL_BY_WALL:printf("您撞到了墙,游戏结束!!!\n");break;}//释放蛇身的节点//选择头删,PSnakeNode cur = sn->head;while (cur) {//保证删除前面的节点能够找到后面的节点PSnakeNode del = cur;cur = cur->Next;free(del);}}

test.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include"Snake.h"
void test() {char ch = 0;do {Snake snake1 = { 0 };//设置屏幕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);//设置控制台光标状态//初始化游戏信息GameStart(&snake1);//运行游戏GameRunning(&snake1);//结束游戏GameEnd(&snake1);SetPos(20, 15);printf("再来一局吗?(Y/N)");ch =  getchar();getchar(); //用于吸收\n,即吸收掉按回车键} while (ch == 'Y' || ch == 'y');SetPos(12, 26);
}
int main() {setlocale(LC_ALL, "");//产生随机数srand((unsigned int)time(NULL));test();return 0; 
}

总结:

  1. 自己的调试能力比较差,没有认真地进行调试,监视变量!
  2. 缺乏错误经验,一个野指针便让自己摸不着头脑!
  3. 这种做项目的思维方式有问题,后面的出现问题,又不断地修改前面的内容,如果是大项目,很容易崩盘!
  4. 具体:在函数中修改尾结点时,不需要使用二级指针,可以通过->next->next的方式进行修改。
  5. 尽量将一个个的功能用函数封装起来,即使没有减少代码冗余的地方,也可以使得代码简洁,可读性更高,便于修改与扩展功能!

相关文章:

c语言项目-贪吃蛇项目2-游戏的设计与分析

文章目录 前言游戏的设计与分析地图&#xff1a;这里简述一下c语言的国际化特性相关的知识<locale.h> 本地化头文件类项setlocale函数 上面我们讲到需要打印★&#xff0c;●&#xff0c;□三个宽字符找到这三个字符打印的方式有两种&#xff1a; 控制台屏幕的长宽特性&a…...

力扣2831.找出最长等值子数组

力扣2831.找出最长等值子数组 思路&#xff1a;用二维数组存每个数字的出现下标 遍历所有数字求结果当前子数组大小&#xff1a;pos[i] - pos[j] 1;当前相同数个数&#xff1a;i - j 1;需要删去的数的个数&#xff1a;pos[i] - pos[j] - i j; class Solution {public:int…...

17K star,一款开源免费的手机电脑无缝同屏软件

导读&#xff1a;白茶清欢无别事&#xff0c;我在等风也等你。 作为程序员&#xff0c;在我们的工作中经常需要把手机投票到电脑进行调试工作&#xff0c;选择一款功能强大的投屏软件是一件很必要的事情。今天给大家介绍一款开源且免费的投屏软件&#xff0c;极限投屏&#xff…...

正则表达式二

修饰符 i&#xff1a;将匹配设置为不区分大小写&#xff0c;即A和a没有区别 var str"Google Runoob taobao runoob"; var n1str.match(/runoob/g); //runoob var n2str.match(/runoob/gi); //Runoob&#xff0c;runoobg&#xff1a;重找所有匹配项&#xff0…...

我的创作纪念日--我和CSDN一起走过的1825天

机缘 第一次在CSDN写文章&#xff0c;是自己在记录学习Java8新特性中Lambda表达式的内容过程中收获的学习心得。之前也有记录工作和生活中的心得体会、难点的解决办法、bug的排查处理过程等等。一直都用的有道笔记&#xff0c;没有去和大家区分享的想法&#xff0c;是一起的朋…...

递归书写树形图示例

大叫好&#xff0c;今天书写了一个扁型转换为树型的例子&#xff0c;使用的是递归&#xff0c;请大家食用&#xff0c;无毒 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" conte…...

【python】IndexError: Replacement index 1 out of range for positional args tuple

成功解决“IndexError: Replacement index 1 out of range for positional args tuple”错误的全面指南 一、引言 在Python编程中&#xff0c;IndexError: Replacement index 1 out of range for positional args tuple这个错误通常发生在使用str.format()方法或者f-string&am…...

Spring自带定时任务@Scheduled注解

文章目录 1. cron表达式生成器2. 简单定时任务代码示例&#xff1a;每隔两秒打印一次字符3. Scheduled注解的参数3.1 cron3.2 fixedDelay3.3 fixedRate3.4 initialDelay3.5 fixedDelayString、fixedRateString、initialDelayString等是String类型&#xff0c;支持占位符3.6 tim…...

代码随想录算法训练营第二十九天|LeetCode491 非递减子序列、LeetCode46 全排列、LeetCode47 全排列Ⅱ

题1&#xff1a; 指路&#xff1a;491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; 思路与代码&#xff1a; 对于这个题我们应该想起我们做过的子集问题&#xff0c;就是在原来的问题上加一个去重操作。我们用unordered_set集合去重&#xff0c;集合中使用过的元…...

初识C++ · 优先级队列

目录 前言&#xff1a; 1 优先级队列的使用 2 优先级队列的实现 3 仿函数 前言&#xff1a; 栈和队列相对其他容器来说是比较简单的&#xff0c;在stl里面&#xff0c;有一种容器适配器是优先级队列&#xff08;priority_queue&#xff09;&#xff0c;它也是个队列&#…...

php反序列化入门

一&#xff0c;php面向对象。 1.面向对象&#xff1a; 以“对象”伪中心的编程思想&#xff0c;把要解决的问题分解成对象&#xff0c;简单理解为套用模版&#xff0c;注重结果。 2.面向过程&#xff1a; 以“整体事件”为中心的编程思想&#xff0c;把解决问题的步骤分析出…...

嵌入式 Linux LED 驱动开发实验学习

I.MX6U-ALPHA 开发板上的 LED 连接到 I.MX6ULL 的 GPIO1_IO03 这个引脚上&#xff0c;进行这个驱动开发实验之前&#xff0c;需要了解下地址映射。 地址映射 MMU 全称叫做 MemoryManage Unit&#xff0c;也就是内存管理单元。在老版本的 Linux 中要求处理器必须有 MMU&#x…...

C++:多态

文章目录 多态的概念多态的定义及实现多态的构成条件虚函数虚函数的重写override 和 final重载、重写&#xff08;覆盖&#xff09;、重定义&#xff08;隐藏&#xff09;的对比 抽象类概念接口继承和实现继承 多态的原理虚函数表多态的原理 单继承和多继承关系的虚函数表单继承…...

Java事务入门:从基础概念到初步实践

Java事务入门&#xff1a;从基础概念到初步实践 引言1. Java事务基础概念1.1 什么是事务&#xff1f;1.2 为什么需要事务&#xff1f; 2. Java事务管理2.1 JDBC 的事务管理2.2 Spring 事务管理2.2.1 Spring JDBC2.2.1.1 添加 Spring 配置2.2.1.2 添加业务代码并测试验证 2.2.2…...

鸿蒙轻内核M核源码分析系列七 动态内存Dynamic Memory

内存管理模块管理系统的内存资源&#xff0c;它是操作系统的核心模块之一&#xff0c;主要包括内存的初始化、分配以及释放。 在系统运行过程中&#xff0c;内存管理模块通过对内存的申请/释放来管理用户和OS对内存的使用&#xff0c;使内存的利用率和使用效率达到最优&#x…...

从头搭hadoop集群--分布式hadoop集群搭建

模板虚拟机安装配置见博文&#xff1a;https://blog.csdn.net/weixin_66158110/article/details/139236148 配置文件信息如下&#xff1a;https://pan.baidu.com/s/1074eD5aNVugEPcjwVvi9jA?pwdl1xq&#xff08;提取码&#xff1a;l1xq&#xff09; hadoop版本&#xff1a;h…...

odoo10 权限控制用户只允许看到自己的字段

假设一个小区管理员用户&#xff0c;只想看到自己小区的信息。 首先添加一个用户信息选项卡界面&#xff0c;如下图的 用户 > 隶属信息&#xff1a; 我们在自己创建的user模块中&#xff0c;views文件夹下添加base_user.xml <?xml version"1.0" encoding&q…...

图解Mysql索引原理

概述 是什么 索引像是一本书的目录列表&#xff0c;能根据目录快速的找到具体的书本内容&#xff0c;也就是加快了数据库的查询速度索引本质是一个数据结构索引是在存储引擎层&#xff0c;而不是服务器层实现的&#xff0c;所以&#xff0c;并没有统一的索引标准&#xff0c;…...

Arduino网页服务器:如何将Arduino开发板用作Web服务器

大家好&#xff0c;我是咕噜铁蛋&#xff01;今天&#xff0c;我将和大家分享一个有趣且实用的项目——如何使用Arduino开发板搭建一个简易的网页服务器。通过这个项目&#xff0c;你可以将Arduino连接到互联网&#xff0c;并通过网页控制或查询Arduino的状态。 一、项目背景与…...

大模型日报2024-06-05

大模型日报 2024-06-05 大模型资讯 AI气象预测取得重大进展&#xff1a;单台桌面电脑即可运行全球天气模型 摘要: 一项新的人工智能天气预测模型已经取得重大进展&#xff0c;该模型能够在一台普通的桌面电脑上运行&#xff0c;预测全球天气。这意味着即使没有复杂的物理计算&a…...

LLM 大模型学习必知必会系列(二):提示词工程-Prompt Engineering 以及实战闯关

角色扮演&#xff1a;在系统指令中告诉千问你需要它扮演的角色&#xff0c;即可沉浸式和该角色对话交流语言风格&#xff1a;简单调整 LLM 的语言风格任务设定&#xff1a;比如旅行规划&#xff0c;小红书文案助手这样的专项任务处理System message 也可以被用于规定 LLM 的答复…...

Spring系统学习 - Spring入门

什么是Spring&#xff1f; Spring翻译过来就是春天的意思&#xff0c;字面意思&#xff0c;冠以Spring的意思就是想表示使用这个框架&#xff0c;代表程序员的春天来了&#xff0c;实际上就是让开发更加简单方便&#xff0c;实际上Spring确实做到了。 官网地址&#xff1a;ht…...

Priority_queue

一、priority_queue的介绍和使用 1.1 priority_queue的介绍 1.优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。 2.优先队列类似于堆&#xff0c; 在堆中可以随时插入元素&#xff0c; 并且只能检索最大堆…...

SpringMVC:获取请求数据

1. 通过RequestParma注解接收 /**** value和name都可以使用&#xff0c;互为别名* 如果此处设置了需要什么参数而前端请求时没有提供则会报400&#xff08;请求参数不一致错误&#xff09;* required参数用于设置该参数是否为必须传递参数&#xff0c;默认为true必须传递* defa…...

深度学习 --- stanford cs231 编程作业(assignment1,Q2: SVM分类器)

stanford cs231 编程作业之SVM分类器 写在最前面&#xff1a; 深度学习&#xff0c;或者是广义上的任何学习&#xff0c;都是“行千里路”胜过“读万卷书”的学识。这两天光是学了斯坦福cs231n的一些基础理论&#xff0c;越往后学越觉得没什么。但听的云里雾里的地方也越来越多…...

【scikit-learn010】sklearn算法模型清单实战及经验总结(已更新)

1.一直以来想写下基于scikit-learn训练AI算法的系列文章,作为较火的机器学习框架,也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架模型算法包相关技术点及经验。 3.欢迎批评指正,欢迎互三,跪谢一键…...

Rethinking overlooked aspects in vision-language models

探讨多模态视觉语言模型的一些有趣结论欢迎关注 CVHub!https://mp.weixin.qq.com/s/zouNu-g-33_7JoX3Uscxtw1.Introduction 多模态模型架构上的变化不大,数据的差距比较大,输入分辨率和输入llm的视觉token大小是比较关键的,适配器,VIT和语言模型则不是那么关键。InternVL-…...

【漯河市人才交流中心_登录安全分析报告-Ajax泄漏滑动距离导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

C语言—字符函数和字符串函数

1.字符分类函数 C语言中有一系列的函数是专门做字符分类的&#xff0c;也就是一个字符是属于什么类型的字符的。 这些函数的使用都需要包含一个头文件 ctype.h。 例&#xff1a;将一句话中的小写字母改成大写字母。 2.字符转换函数 头文件&#xff1a;ctype.h C语言提供了2…...

爬山算法的详细介绍

爬山算法&#xff08;Hill Climbing Algorithm&#xff09;是一种基于启发式的局部搜索算法&#xff0c;常用于解决优化问题。它的核心思想是从当前解的邻域中选择能够使目标函数值最大&#xff08;或最小&#xff09;的下一个解作为当前解&#xff0c;直到找到一个满足问题要求…...

wordpress 采集微信公众号/建站abc

文章目录PointNetDGCNN:Dynamic Graph CNN for Learning on Point Clouds (2018)其它PointNet PointNet论文翻译&#xff08;PointNet实现第1步&#xff09; ModelNet40格式的理解(PointNet实现第2步) 点云数据理解&#xff08;PointNet实现第3步&#xff09; PointNet理解…...

梧州网站开发/官方百度下载安装

一个数组的元素为1至N的整数&#xff0c;现在要对这个数组进行排序&#xff0c;在排序时只能将元素放在数组的头部或尾部&#xff0c;问至少需要移动多少个数字&#xff0c;才能完成整个排序过程&#xff1f; 例如&#xff1a; 2 5 3 4 1 将1移到头部 > 1 2 5 3 4 将5移到…...

百度 门户网站/衡阳seo优化推荐

也许你在写OC的时候已经用过了Masonry这个第三方库来写自动布局&#xff0c;今天我们来说说Swift版本的Masonry第三方库SnapKit SnapKit snp_remakeConstraints snp_remakeConstraints is similar to snp_makeConstraints, but will first remove all existing constraints ins…...

自己家开了一家装修公司怎么做装修网站/青岛seo推广专员

基于专家系统的入侵检测系统的实现电子发烧友 电子技术论坛基于专家系统的入侵检测系统的实现林 庆 1 王 飞 1 吴旻 2 廖定安 1 王 敏 11(江苏大学计算机科学与通信工程学院,江苏镇江 212013 &#xff1b;2 江苏大学人事处,江苏镇江 212013 )Implementation of Intrusion Detec…...

网站里怎样做物流跟踪功能/长沙优化科技有限公司

2019独角兽企业重金招聘Python工程师标准>>> 转自:http://blog.csdn.net/java_min/article/details/5943077 EL表达式的使用前提是&#xff0c;容器必须在2.4及以上版本。 EL表达式中有隐式对象&#xff0c;pageScope,requestScope,sessionScope,applicationScope …...

wordpress网站 添加微信/世界羽联巡回赛总决赛

增强现实技术[1](AugmentedReality,简称AR技术)将计算机产生的虚拟对象放置到反映真实世界的场景空间中,对真实世界起到补充、增强的作用。AR技术有着广阔的应用前景,是虚拟现实技术(VirtualReali-ty)领域日益重要的一个分支。AR技术可以应用在工业、军事、娱乐、医疗、教育等领…...