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

飞机大作战(c语言)

  前言:

飞机大作战游戏是一种非常受欢迎的射击类游戏,玩家需要控制一架战斗机在屏幕上移动,击落敌机以获得分数。本游戏使用C语言编写,旨在帮助初学者了解游戏开发的基本概念和技巧。

在开始编写代码之前,我们需要先了解一下游戏的基本规则和功能:

  1. 游戏界面:游戏界面是一个矩形区域,玩家可以在这个区域内控制战斗机移动和射击。

  2. 战斗机:玩家控制的战斗机可以在游戏界面内自由移动,按下特定键可以发射子弹和开启技能击落敌机。

  3. 敌机:敌机会从屏幕的一侧出现,并沿着直线路径向另一侧移动。玩家需要击落敌机以获得分数。

  4. 分数:玩家每击落一架敌机,分数会增加。

  5. 游戏结束:当玩家飞机被敌机撞到到或者得分为0时,游戏结束。

接下来,我们将通过以下几个步骤来实现这个游戏:

  1. 初始化游戏界面和战斗机。

  2. 处理键盘输入,实现战斗机的移动和射击。

  3. 生成敌机,并控制其移动。

  4. 检测战斗机与敌机之间的碰撞,更新分数和技能充能值。

  5. 判断游戏是否结束。

通过学习这个游戏的开发过程,初学者将能够掌握C语言编程的基本技巧。

1. 打印菜单:

void menu()
{printf("--------------飞机大作战--------------\n");printf("|                                    |\n");printf("|             1.开始游戏             |\n");printf("|             0.退出游戏             |\n");printf("|             W/A/S/D移动            |\n");printf("|           空格射击 E/R技能         |\n");printf("|                                    |\n");printf("--------------------------------------\n");
}
int main()
{system("color b");int input = 0;menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入有误,请重新输入:\n");break;}return 0;
}

2. 写一个存放信息的数组

	int arr[Col][Row] = { 0 };

3. 写一个打印数组信息的函数

飞机大作战的要素无非就是路、围墙、玩家飞机、敌机、子弹这五个元素,要想在打印出这几个元素,我们只需在写一个函数在二维数组中存放这个五个元素的信息(用0-4代替),然后再写一个打印信息的函数分别出二维数组中对应的信息。

void DisPlay(int arr[Col][Row])
{gotoxy(0, 0);for(int i=0;i<Col;i++){for (int j = 0; j < Row; j++){if (arr[i][j] == 0){printf(" ");}if (arr[i][j] == 1){printf("█");}if (arr[i][j] == 2){printf("*");}if (arr[i][j] == 3){printf("$");}if (arr[i][j] == 4){printf("|");}}printf("\n");}printf("得分:%d ", score);printf("EnemySleep=%d ", EnemySleep);printf("skill1(20)=%d ", skill1);printf("skill2(5)=%d ", skill2);Sleep(20);
}

4. 写一个函数来初始化数组的信息

void InSet(int arr[Col][Row])
{//路--0//墙--1//玩家飞机--2//敌机--3//子弹--4
}

5. 初始化围墙

数组最边边的位置我们都让它等于1,这样就可以把游戏界面围起来了。

//墙--1
for (int i = 0; i < Col; i++)
{arr[i][0] = 1;arr[i][Row - 1] = 1;
}
for (int i = 0; i < Row; i++)
{arr[0][i] = 1;arr[Col - 1][i] = 1;
}

6. 初始化玩家飞机

玩家飞机刚开始应该出现在下侧的中央位置,所以将这个位置的坐标对应的值初始化为2。

//玩家飞机--2
arr[PlayerPlane_y][PlayerPlane_x] = 2;

7. 玩家操作飞机

通过按下A/W/S/D键来控制飞机的移动,空格键来控制飞机发射子弹,要想实现这个功能我们需要用到getch()函数,这个函数用于从标准输入(通常是键盘)获取一个字符,而不需要用户按下回车键。这个函数在Windows操作系统下的conio.h头文件中定义,而在Unix/Linux系统下,通常使用termios.hunistd.h头文件中的函数来实现类似的功能。

char ch = getch();
if (ch == 'w' && arr[PlayerPlane_y - 1][PlayerPlane_x] == 0)
{arr[PlayerPlane_y][PlayerPlane_x] = 0;PlayerPlane_y--;arr[PlayerPlane_y][PlayerPlane_x] = 2;
}
if (ch == 'a' && arr[PlayerPlane_y][PlayerPlane_x - 1] == 0)
{arr[PlayerPlane_y][PlayerPlane_x] = 0;PlayerPlane_x--;arr[PlayerPlane_y][PlayerPlane_x] = 2;
}
if (ch == 's' && arr[PlayerPlane_y + 1][PlayerPlane_x] == 0)
{arr[PlayerPlane_y][PlayerPlane_x] = 0;PlayerPlane_y++;arr[PlayerPlane_y][PlayerPlane_x] = 2;
}
if (ch == 'd' && arr[PlayerPlane_y][PlayerPlane_x + 1] == 0)
{arr[PlayerPlane_y][PlayerPlane_x] = 0;PlayerPlane_x++;arr[PlayerPlane_y][PlayerPlane_x] = 2;
}
if (ch == ' ')
{Bullet_y = PlayerPlane_y - 1;Bullet_x = PlayerPlane_x;arr[Bullet_y][Bullet_x] = 4;
}
}

8. 子弹上移

子弹上移一格就调用一次DisPlay函数打印内容这样就实现了子弹上移的效果,这时需要用到到我们的while循环来循环子弹上移的函数和打印的函数,而子弹是由玩家按键产生的,所以这个while还需要循环上玩家操作飞机的函数,但是getch()会让while停止下来,玩家按键后才会继续,导致玩家按一次键盘按键,子弹才会上移一次,样就子弹就出现不了的这连续上移的效果了,所以我们需要在玩家操作的函数加上if(_kbhit())的判断语句函数,它会判断是否有按键按下来,如果没有就不执行getch()函数,继续循环。

_kbhit() 是一个C语言中的函数,用于检测键盘是否有按键被按下。它通常在Windows操作系统下的conio.h头文件中定义。该函数不接受任何参数,并返回一个整数值。如果键盘上有按键被按下,则返回非零值(通常是1),否则返回0。

while (1)
{//玩家操作PlayerPlay(arr);//打印棋盘DisPlay(arr);//子弹与敌机的操作BulletEnemy(arr);
}

在循环打印的时候它会框框打印根本就看不清游戏界面,所以在这里还需要使用到光标的知识 :

在C语言中,光标通常指的是控制台或终端中的文本输入位置指示器。它显示了用户当前输入或输出的位置。在编写C程序时,有时需要对光标的显示和位置进行控制,以便创建更复杂的用户界面或处理特定的输入输出需求。

在Windows操作系统下,可以使用conio.h头文件中提供的函数来控制光标。

因为它会在光标的位置输出信息,所以我们在每次打印前将光标的位置置为(0,0)就可以了。

但是光标还会在那框框的闪,非常的碍眼,所以我们还需要使用函数将光标隐藏。

void HideCursor()
{CONSOLE_CURSOR_INFO cursor_info = { 1,0 };  //第二个值为0,表示隐藏光标SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

9. 初始化敌机

在这里我们需要随机生成5架敌机出现在游戏界面上侧1-3格的位置,所以需要使用一个大小为5的数组接受随机数的值。

//敌机--3
for (int i = 0; i < Count; i++)
{Enemy_y[i] = rand() % 3 + 1;Enemy_x[i] = rand() % Row + 1;//防止敌机生成在围墙上if (Enemy_x[i] >= Row - 1)Enemy_x[i] -= 2;arr[Enemy_y[i]][Enemy_x[i]] = 3;
}

10. 敌机的下移

如果敌机也像子弹一样直接进去循环的话,那么敌机会移动得非常快,所以我们需要定义两个全局变量sleep和EnemySleep来控制敌机的移动速度,例如给EnemySleep赋值一个20,然后sleep赋值一个0,随后sleep在while循环中循环一次就加1,当sleep等于EnemySleep时我们才给敌机进行一次下移的操作,这样就相当于while每循环20次,敌机才下移一次。

在敌机下的过程中我们可能无法打中敌机,而使敌机下降到了最下侧,这时就得让敌机在触碰到围墙前一格消失,然后重新在上侧生成新的敌机。

在敌机下移的过程中可能会碰到玩家的飞机,这时游戏就得结束了,然后告诉玩家游戏结束。控制游戏结束需要用到system("pause")和exit()这两个函数。

system("pause")的作用是在Windows系统的命令行窗口中暂停程序的执行,等待用户按下任意键后继续执行。这通常用于调试程序时,以便查看程序运行过程中的输出结果。

exit(0);是C/C++语言中用于终止程序执行的语句。其中,参数0表示程序正常退出,非零值表示程序异常退出。在程序执行到该语句时,程序会立即停止运行,并返回给操作系统一个退出状态码。

//控制敌机的速度
if (sleep < EnemySleep)
{sleep++;
}
else if (sleep > EnemySleep)
{sleep = 0;
}
for (int i = 0; i < Count; i++)
{//敌机击中玩家飞机的处理if (PlayerPlane_y == Enemy_y[i] && PlayerPlane_x == Enemy_x[i] || score < 0){printf("  /\\_/\\  \n");printf(" ( o.o ) \n");printf("  > ^ < \n");printf("游戏失败!\n");printf("\a");system("pause");exit(0);}//敌机到达最底面的处理if (Enemy_y[i] >= Col - 2){score -= 100;arr[Enemy_y[i]][Enemy_x[i]] = 0;Enemy_y[i] = rand() % 3 + 1;Enemy_x[i] = rand() % Row + 1;if (Enemy_x[i] >= Row - 1)Enemy_x[i] -= 2;arr[Enemy_y[i]][Enemy_x[i]] = 3;}//敌机下移的处理if (sleep == EnemySleep){for (int j = 0; j < Count; j++){arr[Enemy_y[j]][Enemy_x[j]] = 0;sleep = 0;Enemy_y[j]++;arr[Enemy_y[j]][Enemy_x[j]] = 3;}}
}

 11. 游戏数值的设定

(1)敌机加速的分数阈值

  • 当玩家得分达到 2000 分时,敌机的移动速度增加 2
  • 当玩家得分再次增加 2000 分,即达到 4000 分时,敌机的移动速度再增加 2
  • 以此类推,每当玩家得分增加 2000 分,敌机的速度增加 2

(2)打爆一架敌机的得分

  • 打爆一架普通敌机,玩家得到 100 分。

(3)一架敌机到底部消失的失分

  • 如果一架敌机到达屏幕底部而未被击落,玩家失去 100 分。

12. 游戏的优化

为了使游戏更具可玩性,我们可以给玩家飞机加上一些技能,在这里的我设定了E/R是释放技能的指令,这个加在玩家操作飞机的函数哪里就可以了,这两个技能都是可发射范围更广的子弹,当然了这两个技能也不是无限释放的,是需要达到一定的值才能释放的,这里我们可以设定一个变量来存放一个技能的充能值,打爆一架敌机就给充能值加1,当这个值达到的我们所规定的满能值时才能接受释放技能的指令。

//技能指令
if (ch == 'r')
{if (skill1 == 20){for (int i = 1; i < Row - 1; i++){skill1 = 0;Bullet_y = PlayerPlane_y - 1;Bullet_x = i;arr[Bullet_y][Bullet_x] = 4;}}
}
if (ch == 'e')
{int left = PlayerPlane_x - 3;int right = PlayerPlane_x + 3;if (skill2 == 5){for (int i = left; i < right; i++){if (i > 0 && i < Row - 1){skill2 = 0;Bullet_y = PlayerPlane_y - 1;Bullet_x = i;arr[Bullet_y][Bullet_x] = 4;}}}
}

源码: 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<Windows.h>
#include<time.h>
#define Count 5
#define Col 40//列
#define Row 40//行
//玩家飞机坐标
int PlayerPlane_y = Col - 2;
int PlayerPlane_x = Row / 2 - 1;
//子弹坐标
int Bullet_y;
int Bullet_x;
//敌机坐标
int Enemy_y[Count] = { 0 };
int Enemy_x[Count] = { 0 };
//敌机的移动速度
int EnemySleep = 20;
int sleep = 0;
//分数
int score = 0;
//技能充能
int skill1 = 20;
int skill2 = 5;
void menu()
{printf("--------------飞机大作战--------------\n");printf("|                                    |\n");printf("|             1.开始游戏             |\n");printf("|             0.退出游戏             |\n");printf("|             W/A/S/D移动            |\n");printf("|           空格射击 E/R技能         |\n");printf("|                                    |\n");printf("--------------------------------------\n");
}//隐藏光标
void HideCursor()
{CONSOLE_CURSOR_INFO cursor_info = { 1,0 };  //第二个值为0,表示隐藏光标SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}// 光标移到(X, Y)位置
void gotoxy(int x, int y)
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle, pos);
}void DisPlay(int arr[Col][Row])
{gotoxy(0, 0);for(int i=0;i<Col;i++){for (int j = 0; j < Row; j++){if (arr[i][j] == 0){printf(" ");}if (arr[i][j] == 1){printf("█");}if (arr[i][j] == 2){printf("*");}if (arr[i][j] == 3){printf("$");}if (arr[i][j] == 4){printf("|");}}printf("\n");}printf("得分:%d ", score);printf("EnemySleep=%d ", EnemySleep);printf("skill1(20)=%d ", skill1);printf("skill2(5)=%d ", skill2);Sleep(20);
}void InSet(int arr[Col][Row])
{srand(time(NULL));//路--0//墙--1for (int i = 0; i < Col; i++){arr[i][0] = 1;arr[i][Row - 1] = 1;}for (int i = 0; i < Row; i++){arr[0][i] = 1;arr[Col - 1][i] = 1;}//玩家飞机--2arr[PlayerPlane_y][PlayerPlane_x] = 2;//敌机--3for (int i = 0; i < Count; i++){Enemy_y[i] = rand() % 3 + 1;Enemy_x[i] = rand() % Row + 1;if (Enemy_x[i] >= Row - 1)Enemy_x[i] -= 2;arr[Enemy_y[i]][Enemy_x[i]] = 3;}//子弹--4
}
void PlayerPlay(int arr[Col][Row])
{if (_kbhit())//判断是否有按键按下{char ch = getch();if (ch == 'w' && arr[PlayerPlane_y - 1][PlayerPlane_x] == 0){arr[PlayerPlane_y][PlayerPlane_x] = 0;PlayerPlane_y--;arr[PlayerPlane_y][PlayerPlane_x] = 2;}if (ch == 'a' && arr[PlayerPlane_y][PlayerPlane_x - 1] == 0){arr[PlayerPlane_y][PlayerPlane_x] = 0;PlayerPlane_x--;arr[PlayerPlane_y][PlayerPlane_x] = 2;}if (ch == 's' && arr[PlayerPlane_y + 1][PlayerPlane_x] == 0){arr[PlayerPlane_y][PlayerPlane_x] = 0;PlayerPlane_y++;arr[PlayerPlane_y][PlayerPlane_x] = 2;}if (ch == 'd' && arr[PlayerPlane_y][PlayerPlane_x + 1] == 0){arr[PlayerPlane_y][PlayerPlane_x] = 0;PlayerPlane_x++;arr[PlayerPlane_y][PlayerPlane_x] = 2;}if (ch == ' '){Bullet_y = PlayerPlane_y - 1;Bullet_x = PlayerPlane_x;arr[Bullet_y][Bullet_x] = 4;}if (ch == 'r'){if (skill1 == 20){for (int i = 1; i < Row - 1; i++){skill1 = 0;Bullet_y = PlayerPlane_y - 1;Bullet_x = i;arr[Bullet_y][Bullet_x] = 4;}}}if (ch == 'e'){int left = PlayerPlane_x - 3;int right = PlayerPlane_x + 3;if (skill2 == 5){for (int i = left; i < right; i++){if (i > 0 && i < Row - 1){skill2 = 0;Bullet_y = PlayerPlane_y - 1;Bullet_x = i;arr[Bullet_y][Bullet_x] = 4;}}}}}
}
void BulletEnemy(int arr[Col][Row])
{for (int i = 0; i < Col; i++){for (int j = 0; j < Row; j++){if (arr[i][j] == 4){for (int k = 0; k < Count; k++){//子弹击中敌机的处理if (i == Enemy_y[k] && j == Enemy_x[k]){if (skill1 < 20){skill1++;}if (skill2 < 5){skill2++;}score += 100;arr[Enemy_y[k]][Enemy_x[k]] = 0;Enemy_y[k] = rand() % 3 + 1;Enemy_x[k] = rand() % Row + 1;if (Enemy_x[k] >= Row - 1)Enemy_x[k] -= 2;arr[Enemy_y[k]][Enemy_x[k]] = 3;//每2000分敌机加速if (score % 2000 == 0 && EnemySleep > 4){EnemySleep -= 2;}}}//子弹的移动if (arr[i][j] == 4){arr[i][j] = 0;if (i > 1){arr[i - 1][j] = 4;}}}}}//敌机的移动if (sleep < EnemySleep){sleep++;}else if (sleep > EnemySleep){sleep = 0;}for (int i = 0; i < Count; i++){if (PlayerPlane_y == Enemy_y[i] && PlayerPlane_x == Enemy_x[i] || score < 0){printf("  /\\_/\\  \n");//敌机击中玩家飞机的处理printf(" ( o.o ) \n");printf("  > ^ < \n");printf("游戏失败!\n");printf("\a");system("pause");exit(0);}//敌机到达最底面的处理if (Enemy_y[i] >= Col - 2){score -= 100;arr[Enemy_y[i]][Enemy_x[i]] = 0;Enemy_y[i] = rand() % 3 + 1;Enemy_x[i] = rand() % Row + 1;if (Enemy_x[i] >= Row - 1)Enemy_x[i] -= 2;arr[Enemy_y[i]][Enemy_x[i]] = 3;}//敌机下移的处理if (sleep == EnemySleep){for (int j = 0; j < Count; j++){arr[Enemy_y[j]][Enemy_x[j]] = 0;sleep = 0;Enemy_y[j]++;arr[Enemy_y[j]][Enemy_x[j]] = 3;}}}}void game()
{//设置一个存放信息的数组int arr[Col][Row] = { 0 };//隐藏光标HideCursor();//放置信息InSet(arr);//打印游戏界面DisPlay(arr);//玩家移动while (1){//玩家操作PlayerPlay(arr);//打印棋盘DisPlay(arr);//子弹与敌机的操作BulletEnemy(arr);}
}
int main()
{system("color b");int input = 0;menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入有误,请重新输入:\n");break;}return 0;
}

最终效果

飞机大作战

相关文章:

飞机大作战(c语言)

前言&#xff1a; 飞机大作战游戏是一种非常受欢迎的射击类游戏&#xff0c;玩家需要控制一架战斗机在屏幕上移动&#xff0c;击落敌机以获得分数。本游戏使用C语言编写&#xff0c;旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代码之前&#xff0c;我们需要先了…...

服务器操作系统windows和linux区别对比

阿里云服务器镜像Windows和Linux操作系统有什么区别&#xff1f;性能有差异吗&#xff1f;有&#xff0c;同配置下Linux性能要优于Windows&#xff0c;但这与阿里云无关&#xff0c;仅仅是linux和windows之间的区别。另外&#xff0c;阿里云提供的windows和linux操作系统均为正…...

吉他学习:识谱,认识节奏,视唱节奏,节拍器的使用

第九课 识谱https://m.lizhiweike.com/lecture2/29362692 第十课 基础乐理(二)——节奏篇https://mp.csdn.net/mp_blog/creation/editor?spm=1011.2124.3001.6192...

[前端开发] JavaScript基础知识 [下]

上篇&#xff1a;JavaScript基础知识 [上] JavaScript基础知识 [下] 字符串数组函数对象 字符串 字符串语法规则&#xff1a;单引号、双引号和反引号的使用 利用双引号"或者单引号所括起来双引号中不能嵌套双引号,单引号中不能嵌套单引号如果要在双引号中嵌套双引号或者…...

新版UI界面影视小程序亲测无问题带详细搭建教程

新版UI界面影视小程序亲测无问题带详细搭建教程 环境php7.0 — fileinfo–redis–sg11 mysql5.5 apache2.4 添加站点php7.0—-创建ftp—-上传后端文件《后端文件修改&#xff0c;/maccms/wxapi/config/dbs.php–修改当前数据库》—-设置ssl—-打开数据库安装cms 安装好后管…...

2024.2.7日总结(小程序开发4)

页面导航 页面导航是页面之间的相互跳转&#xff1a; <a>链接location.href 小程序中实现页面导航的两种方式&#xff1a; 声明式导航 在页面上声明一个<navigator>导航组件通过点击<navigator>组件实现页面跳转 编程式导航 调用小程序的导航API&…...

每日五道java面试题之java基础篇(七)

第一题. HashMap和HashTable有什么区别&#xff1f;其底层实现是什么&#xff1f; 区别 &#xff1a; HashMap⽅法没有synchronized修饰&#xff0c;线程⾮安全&#xff0c;HashTable线程安全&#xff1b;HashMap允许key和value为null&#xff0c;⽽HashTable不允许 底层实现…...

树莓派4B(Raspberry Pi 4B)使用docker搭建单机版nacos [基于docker-compose]

树莓派4B&#xff08;Raspberry Pi 4B&#xff09;使用docker搭建单机版nacos [基于docker-compose] 镜像仓库提供的基于arm64架构的nacos镜像很少&#xff0c;我选用的是centralx/nacos-server &#xff0c;它是基于nacos 2.0.4开发的。 ⚠️ 本文基于docker-compose记述构建单…...

DAY50:完全背包、爬楼梯、322、279

70 爬楼梯 &#xff08;进阶) 爬楼梯问题在我们刚开始学习动态规划的时候作为入门的问题。当时题目考虑的是1或2种走法。如果将能走的台阶设为M&#xff0c;则能产生进阶的题目。通过求解完全背包问题得到。 题目如下&#xff1a; 题目页面 如果最多能走m个台阶&#xff0c…...

MySQL性能调优篇(3)-缓存的优化与清理

MySQL数据库缓存的优化与清理 数据库缓存在MySQL中扮演着非常重要的角色&#xff0c;它可以显著提高数据库的性能和响应速度。在本篇博客中&#xff0c;我们将介绍如何优化和清理MySQL数据库的缓存&#xff0c;以进一步提高数据库的效率。 优化缓存 1. 适当调整缓存大小 My…...

Zig、C、Rust的Pk1

Zig、C、Rust的Pk1 github.com上看到“A basic comparitive analysis of C, C, Rust, and Zig.”&#xff1a;https://github.com/CoalNova/BasicCompare/tree/main 里边的代码是9个月之前的&#xff0c;用现在的zig 0.11.0 及0.12-dev都无法通过编译(具体为&#xff1a;zig-w…...

如何用 ChatGPT 做项目管理?

ChatGPT 可以通过创建和维护跨团队项目协作计划&#xff0c;让员工更容易理解他们的角色和职责。 这个协作计划里面会包括每个团队或个人要执行的具体任务&#xff0c;每个任务最后期限和任何事情之 间的依赖关系。 该场景对应的关键词库:(24 个) 项目管理、项目协作计划、跨…...

DS:树及二叉树的相关概念

创作不易&#xff0c;兄弟们来波三连吧&#xff01;&#xff01; 一、树的概念及结构 1.1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c…...

MATLAB | 情人节画个花瓣venn图?

之前七夕节情人节各种花&#xff0c;相册&#xff0c;爱心啥的都快画够了&#xff0c;今年画个花瓣韦恩图&#xff1f; 花瓣上的数字是仅属于该类的样本数&#xff0c;而中心的数字是属于每一类的样本数 教程部分 0 数据准备 % 给组起名t1 t2 t3...t15 setName compose(t%d,…...

[日常使用] Shell常用命令

Shell是什么&#xff1f; Shell简介 Shell是操作系统的外壳&#xff0c;是用户与操作系统内核之间的主要接口。它接收用户的命令并将其传递给内核执行&#xff0c;然后将执行结果返回给用户。Shell不仅是一个命令解释器&#xff0c;也是一种强大的编程语言。常见的Shell分为图…...

QT+OSG/osgEarth编译之八十七:osgdb_p3d+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_p3d)

文章目录 一、osgdb_p3d介绍二、文件分析三、pro文件四、编译实践一、osgdb_p3d介绍 P3DXML是Panda3D引擎中使用的一种文件格式,用于描述3D场景的层次结构和属性。它是一种基于XML(eXtensible Markup Language)的文本格式,可以被Panda3D引擎读取和解析。 P3DXML文件包含了…...

寒假 day13

1.请编程实现二维数组的杨慧三角 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) { int n,i,j;printf("please enter n:");scanf("%d",&n);int arr[n][n];for(i0;i<n;i){for(j0;j<i;j){if(j0 || ij…...

探索微信小程序的奇妙世界:从入门到进阶

文章目录 一、什么是微信小程序1.1 简要介绍微信小程序的定义和特点1.2 解释小程序与传统应用程序的区别 二、小程序的基础知识2.1 微信小程序的架构2.2 微信小程序生命周期的理解2.3 探索小程序的目录结构和文件类型 三、小程序框架和组件3.1 深入了解小程序框架的核心概念和原…...

容器库(4)-std::forward_list

std::forward_list是可以从任何位置快速插入和移除元素的容器&#xff0c;不支持快速随机访问&#xff0c;只支持正向迭代。 本文章的代码库&#xff1a; https://gitee.com/gamestorm577/CppStd 成员函数 构造、析构和赋值 构造函数 可以用元素、元素列表、迭代器或者另…...

Netty Review - 服务端channel注册流程源码解析

文章目录 PreNetty主从Reactor线程模型服务端channel注册流程源码解读入口 serverBootstrap.bind(port) 源码流程图 Pre Netty Review - ServerBootstrap源码解析 Netty Review - NioServerSocketChannel源码分析 Netty主从Reactor线程模型 Netty 使用主从 Reactor 线程模型…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

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

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

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...