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

C语言实现游戏2048(超详细!!!超易懂!!!)

2048是众所周知的一款经典游戏,在曾经没有智能电脑和手机的年代,也陪伴了我们许多年。那今天就让我们用C语言来回顾一下这款游戏吧~

一、游戏2048的思路

2048游戏的玩法是在初始的时候,给玩家一个4*4格子的,其中内容全为空的棋盘。每过一回合,棋盘上就会在随机位置生成一个数字2,而2就是2048游戏中最小的数字。在每一回合中玩家需要输入W,S,A,D移动棋盘中现有的数字。(W代表上移,S代表下移,A代表左移,D代表右移)。而在数字的移动过程中,如果有两个数字大小相同,并且在移动过程中发生了碰撞,那么就会将两个数字合成为一个值为两数之和的数字当棋盘中所有格子都被装满时,则游戏结束

以上就是游戏2048的规则啦,那么让我们把这些规则一条条理清顺序,再对各个规则逐一击破吧~

1.打印游戏菜单

首先我们需要创造一个可以选择开始游戏和退出游戏的菜单。打印游戏菜单就没什么过多的要求,符合自己的审美,自己喜欢就好啦~

2.将4*4格内数据初始化

想要在每一个格子中填充数据,需要对每一个格子内的值进行初始化

3.在棋盘随机位置生成一个2

想要游戏正常运行,通过使用生成随机数的rand()函数,使棋盘每一回合生成一个2是不可或缺的条件。

4.打印游戏棋盘

我们需要创造一个能够容纳4*4格子内所有数值,并且又不失美观的棋盘。

5.实现WSAD移动数字功能

我们需要构建一个能够使输入WSAD时,使棋盘中的数字进行相应的移动

6.判断游戏是否结束

创造一个判断游戏结束的函数。

二、游戏2048的文件

实现游戏2048,需要分成头文件game.h源文件game.c源文件test.c三个文件。

他们的作用分别是:

  • game.h:作为头文件,它用来存放创造游戏所需要的各种类型的全局变量,并且也用来实现编写代码使所必需的函数说明
  • game.c: 存放各种实现游戏功能所需要的函数。
  • test.c:作为编译的主程序,存放主函数,编写实现游戏功能的主要思想。

三、实现游戏的各种函数

①打印游戏菜单

void GameInte()
{printf("**********************************\n");printf("--**--**- 游 戏  2 0 4 8 -**--**--\n");printf("**********************************\n");printf("***-*-*-*-*   1.play   *-*-*-*-***\n");printf("***-*-*-*-*   0.quit   *-*-*-*-***\n");printf("************----------************\n");printf("是否游玩?请输入>:");
}

我们需要将菜单函数GameInte在源文件game.c中进行创建和定义,然后再在头文件game.h中对函数进行声明。就像这个样子:

(给大家看一下game.h头文件中宏定义的数值和定义的全局变量,这样方便后期对数值修改,并且修改代码时也比较方便)

②棋盘的数据初始化

因为是4*4的数据,所以我们在上面定义了一个全局变量board[Row][Col]用来存放这4*4个的数值定义成int型方便后续接收整形数据也方便数值的打印。在这里我们将棋盘数据的初始值都设置成0

void BoardCreate(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = 0;}}
}

③打印游戏棋盘

因为在上面我们定义的,用于记录数据的二维数组中存放的数据为int型所以没办法像创造其他棋盘一样也用'  '来代表'空格子' ,所以在打印游戏棋盘的时候,我们可以使用一个if...else选择语句,使当格子中数值为0时,不打印格子中的数据。

void PrintBoard(int board[Row][Col], int row, int col)
{system("CLS");//清空上一回合的屏幕printf("\n");int i = 0;int j = 0;printf(" ----------2048 游戏----------\n");printf("-*-*-*-*-*- 0->exit -*-*-*-*-*- \n");printf("   +-----+-----+-----+-----+\n");for (i = 0; i < row; i++){printf("   |");for (j = 0; j < col; j++){if (board[i][j] == 0)printf("     |");elseprintf("%4d |", board[i][j]);}printf("\n   +-----+-----+-----+-----+\n");}printf("w->up s->down a->left d->right\n");printf(" ----------2048 游戏----------\n");
}

游戏棋盘可以按照自己的意愿随意更改,我这只是一个参考,打印出来是这个样子的:

④在棋盘随机位置生成一个2

在棋盘的随机位置生成2就需要用到生成随机数的函数rand(),和使rand()变成"真正随机数"的srand()了。我们需要在test.c文件的主函数中输入srand((unsigned int)time(NULL))其作用是使生成随机数的rand()随时间变化而时刻变化。然后我们再在生成随机数的函数中,使用int a = rand() % row; int b = rand() % col来创造两个随机的坐标,再将对应坐标中的值改变为2。(如果坐标已经有数字,则使用goto语句跳转回去,重新生成坐标)

void TwoFind(int board[Row][Col], int row, int col)
{again:int a = rand() % row;int b = rand() % col;if (board[a][b] == 0){board[a][b] = 2;}elsegoto again;
}

我们调试两次代码可以发现2生成的位置并不相同,这就代表功能的实现成功了。

⑤实现通过WSAD选择上下左右

我们通过使用for循环嵌套的方式,来遍历数组中的全部元素,通过W,S,A,D对应的上下左右移动,判断要移动的元素的上,下,左,右是否为0如果为0,则将元素向着对应的位置移动如果不为0则判断两元素是否相等,如果两元素相等,则将靠近此次移动方向的元素加倍,另一个元素则减少成0,如果两元素不相等则不对两元素进行移动处理

1.实现按W向上移动
void Wup(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = row - 1; i > 0; i--){for (j = col - 1; j >= 0; j--)//必须设成>=0,否则j失去了=0的情况,会导致第一列无法正常移动{while (board[i][j] != 0 && board[i - 1][j] == 0){board[i - 1][j] = board[i][j];board[i][j] = 0;}}}for (i = row - 1; i > 0; i--){for (j = col - 1; j >= 0; j--){while (board[i][j] == board[i - 1][j]&&board[i][j]!=0&&board[i-1][j]!=0){board[i - 1][j] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}

或许有人会问,为什么for循环的遍历要逆向遍历呢?其实我最开始也是按照从头到尾的顺序遍历的,但是写完代码却发现每一次只能够将元素移动一个格子,后来我才发现:

比如,此时我们想把第三行的元素挪到第一行,如果是从前往后依次遍历数组,当我们把第三行的挪到第二行之后,紧接着就去遍历第四行了,不能再找到已经上移的元素所以就只能够实现一次移动。但如果我逆向遍历的话,当我将第三行的元素挪到了第二行,紧接着我就会遍历第二行,然后找到这个元素,再把它挪到第一行,这样就实现了按W上移的功能了。

通过这两张图来进行解释,可能会更加的一目了然。

之后我们进行W,S,A,D四种方向的移动时,也需要对照遍历的四种方向来选取正序遍历和逆序遍历。看了这两张图你应该就能明白我的意思啦~那么接下来让我们看看是否成功实现了W向上移动的功能:看来成功实现了移动的功能~再让我们看看将元素数值合并,和不相同的元素堆叠的功能是否实现吧!:看来也成功实现啦~

2.实现按S向下移动

和上面Wup的代码其实大同小异,只是向上移动时是当前元素与头顶的元素进行判断是否为0和比较大小,而向下移动则是当前元素与下方的元素进行判断是否为0和比较大小。

通过刚才的两张图,想必大家应该知道实现按S向下移动是正序遍历还是逆序遍历了吧~没错!就是正序遍历:

void Sdown(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row - 1; i++)//必须设置成<row - 1,防止while循环中越界访问{for (j = 0; j < col; j++){while (board[i][j] != 0 && board[i + 1][j] == 0){board[i + 1][j] = board[i][j];board[i][j] = 0;}}}for (i = 0; i < row - 1; i++){for (j = 0; j < col; j++){while (board[i][j] == board[i + 1][j] && board[i][j] != 0 && board[i + 1][j] != 0){board[i + 1][j] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}

看来向下移动功能也实现啦~

3.实现按A向左移动

接下来的按A向左移动和按D向右移动跟上面的W向上移动和S向下移动,基本上是相同的东西,只要懂了上面两个代码,这两个自然也就懂了。那么我就不多废话,直接将代码奉上啦~

void Aleft(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = row - 1; i >= 0; i--){for (j = col - 1; j > 0; j--)//必须设成>=0,否则j失去了=0的情况,会导致第一列无法正常移动{while (board[i][j] != 0 && board[i][j - 1] == 0){board[i][j - 1] = board[i][j];board[i][j] = 0;}}}for (i = row - 1; i >= 0; i--){for (j = col - 1; j > 0; j--){while (board[i][j] == board[i][j - 1] && board[i][j] != 0 && board[i][j - 1] != 0){board[i][j - 1] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}
4.实现按D向右移动
void Dright(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col - 1; j++){while (board[i][j] != 0 && board[i][j + 1] == 0){board[i][j + 1] = board[i][j];board[i][j] = 0;}}}for (i = 0; i < row; i++){for (j = 0; j < col - 1; j++){while (board[i][j] == board[i][j + 1] && board[i][j] != 0 && board[i][j + 1] != 0){board[i][j + 1] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}
5.选择上下左右

这个函数就是我们前四个函数的总和,我们需要利用switch语句来判断键盘上输入的W,S,A,D从而来通过case充当下一步函数的调用的过程。(在switch语句中可以添加一些其他的功能,比如说你想退出游戏,就加一个case 0的按键,然后写出对应功能的代码就可以啦,这里我只适配了退出游戏的case 0,其余的就交给小伙伴们自行探索啦~)

void ChooseMove(int board[Row][Col], int row, int col)
{again:char a = getch();switch(a){case 'W':case 'w':Wup(board, Row, Col);break;case 'S':case 's':Sdown(board, Row, Col);break;case 'A':case 'a':Aleft(board, Row, Col);break;case 'D':case 'd':Dright(board, Row, Col);break;case '0':{printf("你确定要退出游戏吗?\n");printf("如果退出请输入0,继续游戏请按任意键\n");int choose;scanf("%d", &choose);if (choose == 0){printf("退出游戏\n");exit(0);//程序正常结束执行}else{printf("返回游戏:\n");goto again;}break;}}
}

到了这里,我们的2048游戏基本上就能够进行游玩啦~

⑥判断游戏是否结束

判断游戏结束,我们只需要创造一个计数器,统计4*4棋盘中非零元素的数量,当非零元素的数量正好等于4*4时,那么游戏也就结束啦。

void over(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;int sum = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] != 0)sum++;}}if (sum == row * col){PrintBoard(board, Row, Col);printf("对不起,格子已满,游戏到此为止了!!!\n");exit(0);}
}

好啦~至此我们的C语言游戏2048就基本完成啦~这个也是比较初阶版,适合刚入门的小伙伴们来刷题用~那么废话不多说,这就将完整代码双手奉上!

四、游戏2048完整代码

1.game.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#include <windows.h>
#define Row 4
#define Col 4
int board[Row][Col];
//游戏菜单
void GameInte();//4*4格内数据初始化
void BoardCreate(char board[Row][Col], int row, int col);//在棋盘随机位置生成一个2
void TwoFind(char board[Row][Col], int row, int col);//打印游戏界面
void PrintBoard(char board[Row][Col], int row, int col);//实现按W键向上移动
void Wup(char board[Row][Col], int row, int col);//实现按S键向下移动
void Sdown(int board[Row][Col], int row, int col);//实现按A键向左移动
void Aleft(int board[Row][Col], int row, int col);//实现按D键向右移动
void Dright(int board[Row][Col], int row, int col);//实现通过WSAD选择上下左右
void ChooseMove(int board[Row][Col], int row, int col);//判断游戏是否结束
void over(int board[Row][Col], int row, int col);

2.game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"void GameInte()
{printf("**********************************\n");printf("--**--**- 游 戏  2 0 4 8 -**--**--\n");printf("**********************************\n");printf("***-*-*-*-*   1.play   *-*-*-*-***\n");printf("***-*-*-*-*   0.quit   *-*-*-*-***\n");printf("************----------************\n");printf("是否游玩?请输入>:");
}
void BoardCreate(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = 0;}}
}void TwoFind(int board[Row][Col], int row, int col)
{again:int a = rand() % row;int b = rand() % col;if (board[a][b] == 0){board[a][b] = 2;}elsegoto again;
}void PrintBoard(int board[Row][Col], int row, int col)
{system("CLS");//清屏上一次的棋盘printf("\n");int i = 0;int j = 0;printf(" ----------2048 游戏----------\n");printf("-*-*-*-*-*- 0->exit -*-*-*-*-*- \n");printf("   +-----+-----+-----+-----+\n");for (i = 0; i < row; i++){printf("   |");for (j = 0; j < col; j++){if (board[i][j] == 0)printf("     |");elseprintf("%4d |", board[i][j]);}printf("\n   +-----+-----+-----+-----+\n");}printf("w->up s->down a->left d->right\n");printf(" ----------2048 游戏----------\n");
}void Wup(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = row - 1; i > 0; i--){for (j = col - 1; j >= 0; j--)//必须设成>=0,否则j失去了=0的情况,会导致第一列无法正常移动{while (board[i][j] != 0 && board[i - 1][j] == 0){board[i - 1][j] = board[i][j];board[i][j] = 0;}}}for (i = row - 1; i > 0; i--){for (j = col - 1; j >= 0; j--){while (board[i][j] == board[i - 1][j]&&board[i][j]!=0&&board[i-1][j]!=0){board[i - 1][j] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}void Sdown(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row - 1; i++)//必须设置成<row - 1,防止while循环中越界访问{for (j = 0; j < col; j++){while (board[i][j] != 0 && board[i + 1][j] == 0){board[i + 1][j] = board[i][j];board[i][j] = 0;}}}for (i = 0; i < row - 1; i++){for (j = 0; j < col; j++){while (board[i][j] == board[i + 1][j] && board[i][j] != 0 && board[i + 1][j] != 0){board[i + 1][j] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}void Aleft(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = row - 1; i >= 0; i--){for (j = col - 1; j > 0; j--)//必须设成>=0,否则j失去了=0的情况,会导致第一列无法正常移动{while (board[i][j] != 0 && board[i][j - 1] == 0){board[i][j - 1] = board[i][j];board[i][j] = 0;}}}for (i = row - 1; i >= 0; i--){for (j = col - 1; j > 0; j--){while (board[i][j] == board[i][j - 1] && board[i][j] != 0 && board[i][j - 1] != 0){board[i][j - 1] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}void Dright(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col - 1; j++){while (board[i][j] != 0 && board[i][j + 1] == 0){board[i][j + 1] = board[i][j];board[i][j] = 0;}}}for (i = 0; i < row; i++){for (j = 0; j < col - 1; j++){while (board[i][j] == board[i][j + 1] && board[i][j] != 0 && board[i][j + 1] != 0){board[i][j + 1] *= 2;board[i][j] = 0;}}}PrintBoard(board, Row, Col);
}void ChooseMove(int board[Row][Col], int row, int col)
{again:char a = getch();switch(a){case 'W':case 'w':Wup(board, Row, Col);break;case 'S':case 's':Sdown(board, Row, Col);break;case 'A':case 'a':Aleft(board, Row, Col);break;case 'D':case 'd':Dright(board, Row, Col);break;case '0':{printf("你确定要退出游戏吗?\n");printf("如果退出请输入0,继续游戏请按任意键\n");int choose;scanf("%d", &choose);if (choose == 0){printf("退出游戏\n");exit(0);}else{printf("返回游戏:\n");goto again;}break;}}
}void over(int board[Row][Col], int row, int col)
{int i = 0;int j = 0;int sum = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (board[i][j] != 0)sum++;}}if (sum == row * col){PrintBoard(board, Row, Col);printf("对不起,格子已满,游戏到此为止了!!!\n");exit(0);}
}

3.test.c

#include"game.h"
void game()
{//初始化4*4格子内数据//BoardCreate(board, Row, Col);//打印游戏界面PrintBoard(board, Row, Col);//实现按W键向上移动//Wup(board, Row, Col);//实现按S键向下移动//Sdown(board,Row,Col);//实现按A键向左移动//Aleft(board, Row, Col);//实现按D键向右移动//Dright(board,Row,Col);//实现通过WSAD选择上下左右ChooseMove(board, Row, Col);//在棋盘随机位置生成一个2TwoFind(board, Row, Col);over(board, Row, Col);
}
int main()
{srand((unsigned int)time(NULL));GameInte();BoardCreate(board, Row, Col);int a = 0;do{scanf("%d", &a);if (a == 1){game();}else if (a == 0){printf("退出游戏\n");break;}else{printf("输入错误,重新输入:\n");}} while (a);return 0;
}

那么关于用C语言来实现游戏2048就讲解到这里啦~如果有说的不够充分或者有错误的地方,还希望各位能在评论区积极指出,我也会积极学习的!我们下期再见啦ヾ(•ω•`)o

相关文章:

C语言实现游戏2048(超详细!!!超易懂!!!)

2048是众所周知的一款经典游戏&#xff0c;在曾经没有智能电脑和手机的年代&#xff0c;也陪伴了我们许多年。那今天就让我们用C语言来回顾一下这款游戏吧~ 一、游戏2048的思路 2048游戏的玩法是在初始的时候&#xff0c;给玩家一个4*4格子的&#xff0c;其中内容全为空的棋盘…...

MATLAB代码检查工具PolySpace

概述 PolySpace是MATLAB里面代码静态检查工具。通过检查源代码&#xff0c;可以确定可能在哪里发生潜在的运行时错误&#xff0c;例如算术溢出&#xff0c;缓冲区溢出等等。它最大的特点是可以检查车企常用的MISRA C标准&#xff0c;还免费&#xff0c;就让各大车企爱不释手。…...

FPGA设计之跨时钟域(CDC)设计篇(5)----同步FIFO的两种设计方法(计数器法/高位扩展法 | 手撕代码)

1、什么是FIFO? FIFO(First In First Out) 是一种先进先出的数据缓存器,在逻辑设计里面用的非常多。它是一种存储器结构,被广泛应用于芯片设计中。FIFO由存储单元队列或阵列构成,第一个被写入队列的数据也是第一个从队列中读出的数据。 FIFO 设计可以说是逻辑设计人员必须…...

快速掌握Vue:基础命令详解

1. Vue概述 Vue.js&#xff08;读音 /vjuː/, 类似于 「view」&#xff09; 是一套构建用户界面的 「渐进式框架」。与其他重量级框架不同的是&#xff0c;Vue 采用自底向上增量开发的设计。Vue 的核心库只关注视图层&#xff0c;并且非常容易学习&#xff0c;非常容易与其它库…...

MySQL——索引(二)创建索引(1)创建表的时候创建索引

要想使用索引提高数据表的访问速度&#xff0c;首先要创建一个常引。创建索引的方式有三种&#xff0c;具体如下。 创建表的时候可以直接创建索引&#xff0c;这种方式最简单、方便&#xff0c;其基本的语法格式如下所示: CREATE TABLE 表名 (字段名 数据类型 [完整性约束条件…...

源代码加密怎么做?企业常用十款源代码加密软件排行榜

在数字化信息时代&#xff0c;源代码是企业的核心资产之一。保护源代码的安全不仅能防止知识产权泄露&#xff0c;还能保护企业的竞争优势。因此&#xff0c;源代码加密成为企业信息安全的重要环节。 源代码是软件的基础&#xff0c;包含了企业独特的技术和解决方案。未加密的源…...

python 文件打开、读、关闭练习

一、题目要求 二、代码实现 f open("D:\\workspace\\word.txt" , "r", encoding "UTF-8")# 方案一 # content f.read() # count content.count("itheima") # print(f"itmeiha在文件中出现了&#xff1a;{count}次")# 方案…...

迈向大规模小目标检测:综述与数据集

为了准确检测小目标&#xff0c;领域内现有方法大多基于通用目标检测范式进行针对性改进&#xff0c;根据这些改进所采用关键技术的不同&#xff0c;可以分为六种类别&#xff1a;&#xff08;1&#xff09;面向样本的方法&#xff1b;&#xff08;2&#xff09;基于尺度感知的…...

69、zabbix自动、代理、snmp监控

一、zabbix 1.1、自动发现 [roottest1 ~]# systemctl stop firewalld [roottest1 ~]# setenforce 0 [roottest3 ~]# vim /etc/hosts 192.168.168.21 test1 192.168.168.23 test3 [roottest1 ~]# vim /etc/hosts 192.168.168.21 test1 192.168.168.23 test3 ------------…...

搜索引擎设计:如何避免大海捞针般的信息搜索

搜索引擎设计&#xff1a;如何避免大海捞针般的信息搜索 随着互联网的发展&#xff0c;信息的数量呈爆炸式增长。如何在海量信息中快速、准确地找到所需信息&#xff0c;成为了搜索引擎设计中的核心问题。本文将详细探讨搜索引擎的设计原理和技术&#xff0c;从信息获取、索引…...

设计模式- 数据源架构模式

表数据入口(Table Data Gateway) 充当数据库表访问入口的对象。一个实例处理表中所有的行。 表数据入口包含了用于访问单个表或者视图的所有SQL&#xff0c;如选择、插入、更新、删除等。其他代码调用它的方法来实现所有与数据库的交互。 运行机制 表数据入口包括的每个方法…...

Unity 使用字符串更改Text指定文字颜色、大小、换行、透明

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、使用字符串改变文字属性的方法&#xff08;一&#xff09;修改颜色&#xff08;二&#xff09;修改大小&#xff08;三&#xff09;换行&#xff08;四&…...

数字信号处理2: 离散信号与系统的频谱分析

文章目录 前言一、实验目的二、实验设备三、实验内容四、实验原理五、实验步骤1.序列的离散傅里叶变换及分析2.利用共轭对称性&#xff0c;设计高效算法计算2个N点实序列的DFT。3.线性卷积及循环卷积的实现及二者关系分析4.比较DFT和FFT的运算时间5.利用FFT求信号频谱及分析采样…...

20240805软考架构--------每日打卡题21-25

每日打卡题21-25答案 21、【2014年真题】 难度&#xff1a;一般 在UML提供的系统视图中&#xff0c; &#xff08;1&#xff09; 是逻辑视图的一次执行实例&#xff0c;描述了并发与同步结构&#xff1b; &#xff08;2&#xff09; 是最基本的需求分析模型。 &#xff08;1&a…...

GPT-5:未来已来,你准备好了吗?

GPT-5 一年半后发布&#xff1f;对此你有何期待&#xff1f; IT之家6月22日消息&#xff0c;在美国达特茅斯工程学院周四公布的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布&#xff0c;给出了肯定答案并表示将在一年半后发布。此外&#xff0c;穆…...

解决C#对Firebase数据序列化失败的难题

背景介绍 在当今的游戏开发领域&#xff0c;Unity与Firebase的结合日益普及。Firebase实时数据库提供了强大的数据存储和同步功能&#xff0c;使开发者能够轻松管理和使用数据。然而&#xff0c;在使用C#进行Firebase数据序列化和反序列化时&#xff0c;常常会遇到一些棘手的问…...

设计模式中的类关系

1. 依赖&#xff08;Dependency&#xff09; 定义&#xff1a;一个类使用到另一个类的实例&#xff0c;通常是通过方法参数、局部变量等。依赖关系是最弱的关系&#xff0c;因为它仅仅表示类之间的临时关联。 特征&#xff1a;在 UML 图中&#xff0c;依赖关系用带箭头的虚线…...

glibc的安装及MySQL的安全用户角色权限(twenty-one day)

一、glibc安装 mysql 清空/etc/目录下的my.cnf ls -l /etc/my.cnf rm -rf /etc/my.cnf yum -y remove mariadb find / -name "*mysql*" -exec rm -rf {} \; 安装mysql软件包 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-li nux-glibc2.1…...

AttributeError: ‘ChatGLMTokenizer‘ object has no attribute ‘sp_tokenizer‘. 已解决

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…...

徐州BGP机房与普通机房的区别有哪些?

BGP也被称为是边界网关协议&#xff0c;是运行在TCP上的一种自治系统的路由协议&#xff0c;能够用来处理因特网大小的网络协议&#xff0c;同时也是能够处理好不相关路由域之间的多路连接的协议&#xff0c;今天小编主要来聊一聊徐州BGP机房与普通机房之间的区别有哪些&#x…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...