【C++】做一個飛機空戰小游戲(八)——生成敵方炮彈(rand()和srand()函數應用)

???[導讀]本系列博文內容鏈接如下:

【C++】做一個飛機空戰小游戲(一)——使用getch()函數獲得鍵盤碼值

【C++】做一個飛機空戰小游戲(二)——利用getch()函數實現鍵盤控制單個字符移動
【C++】做一個飛機空戰小游戲(三)——getch()函數控制任意造型飛機圖標移動

【C++】做一個飛機空戰小游戲(四)——給游戲添加背景音樂(多線程技巧應用)

【C++】做一個飛機空戰小游戲(五)——getch()控制兩個飛機圖標移動(控制光標位置)

【C++】做一個飛機空戰小游戲(六)——給兩架飛機設置不同顏色(cout輸出彩色字符、結構體使用技巧)

【C++】做一個飛機空戰小游戲(七)——兩組按鍵同時檢測平滑移動(GetAsyncKeyState()函數應用)

【C++】做一個飛機空戰小游戲(八)——生成敵方炮彈(rand()函數應用)

前邊7講都是介紹飛機控制的方法,從今天開始介紹敵方炮彈生成的方法。炮彈生成所用到的rand()函數詳細介紹見:【c++】rand()隨機函數的應用(一)——rand()函數詳解和實例_一只爬爬蟲的博客-CSDN博客

目錄

一、生成敵方炮彈的幾個關鍵問題

(一)炮彈的數量

1、每輪炮彈數量(bombs_round)

2、每關總炮彈數量(bombs_stage)

3、最大同屏炮彈數量(end_bombs_round)

(二)炮彈出現的時間(rt)

(三)炮彈的起始位置

1、y坐標

2、x坐標

(四)炮彈移動速度(bomb_interval)

(五)炮彈與飛機相撞或被飛機子彈擊落

二、構造結構體

(一)游戲結構體Game

(二)炮彈結構體Bomb

三、新增與炮彈相關的函數

(一)單個炮彈初始化函數

(二)所有炮彈初始化

(三)炮彈位置更新線程函數

(四)炮彈位置更新線程啟動函數

四、更新后的程序代碼

(一)主函數

(二)頭文件control_plane.h

(三)庫函數control_plane.cpp


一、生成敵方炮彈的幾個關鍵問題

(一)炮彈的數量

1、每輪炮彈數量(bombs_round)

每輪炮彈數量,也就是屏幕當中出現的最多炮彈數量,也就是敵方同一波發射的最多炮彈數量,數量越多,難度也越大,這個數量可隨關數的增加而增加。

2、每關總炮彈數量(bombs_stage)

每關發射的炮彈總數量不一樣,關數越高,炮彈總數量也越多。

3、最大同屏炮彈數量(end_bombs_round)

最大單輪炮彈數量,也就是最后一關,敵方同一波發射炮彈數量。

(二)炮彈出現的時間(rt)

同一波炮彈出現的時間不能一樣,否則所有炮彈呈現一排,游戲的體驗感較差,所以,炮彈出現的時間也應該是隨機的,也就是炮彈的y值是隨機的。如下圖所示,黃色方框為敵方炮彈。

?為了實現這個效果,炮彈設置了一個炮彈墜地(炮彈到達屏幕最下方)、被擊落或者與飛機相撞后死亡復活時間(respawn time,縮寫為rt),在復活期間,炮彈不出現在屏幕。這個復活時間是隨機的,這個時間會自減1,當這個時間降為0的時候,炮彈復活,才從屏幕上方出現。

(三)炮彈的起始位置

1、y坐標

炮彈開始出現在屏幕的位置位于屏幕最上方,也就是y=0處,但因為炮彈有復活時間,炮彈的起始位置不能在y=0處,防止炮彈還未復活就被擊落。所以,炮彈的起始位置設置在屏幕最下側再往下一行,也就是b_b+6,b_b為飛機坐標的下邊界,6為飛機圖標的高度。這樣,炮彈在復活期間就不會與飛機相撞,也不會被飛機發射的子彈擊中。

所以,炮彈從死亡開始,到復活前,其位置為:x坐標隨機,y=b_b+6,而且在復活期間,位置不發生移動。復活后x坐標不變,y=0,然后y值自加1。

2、x坐標

x坐標在死亡后復活前和復活后都是隨機生成的,且坐標值一樣。為了簡化游戲難度,炮彈出現在屏幕中后,x坐標值不發生變化,僅有y值再增加,也就是炮彈是豎直下落的。

(四)炮彈移動速度(bomb_interval)

炮彈移動速度,由炮彈位置更新線程函數內的Sleep函數的參數決定,數值越大,位置更新的間隔越大,移動速度就越小,反之就越快。

(五)炮彈與飛機相撞或被飛機子彈擊落

本文今天暫時沒考慮,后邊會實現這個功能。

二、構造結構體

(一)游戲結構體Game

//定義游戲結構體 
typedef struct{int stage;					//游戲當前關 	int bombs_round;			//敵方每輪發射炮彈數量 int bombs_stage;			//每關總計出現炮彈數量	bool complete;				//游戲通關 bool gameover;				//游戲結束int num_plane;				//飛機數量 int cur_num_bomb;			//當前已發射炮彈數量 int bomb_interval; 			//位置更新間隔 bool bomb_move;				//炮彈是否移動 
}Game;

(二)炮彈結構體Bomb

//定義敵方炮彈結構體 
typedef struct{Location location;	//炮彈位置 bool alive;			//炮彈是否存活 int color;			//炮彈顏色string icon;		//炮彈圖標int rt;				//rt=respawn time復活時間 int hp;				//hp=hit point 生命值,此值<=0時,敵方炮彈死亡,敵方炮彈被飛機子彈擊中hp會減少,墜地或與飛機相撞hp直接降為0 int dam;			//dam=damage 傷害值int type;			//炮彈類型 
}Bomb;

三、新增與炮彈相關的函數

(一)單個炮彈初始化函數

這個函數在單個炮彈死亡后調用。

//單個炮彈初始化函數 
Bomb init_bomb(Bomb bomb)
{bomb.location.x=rand()%r_b;	bomb.location.y=b_b+6;bomb.icon=icon_bomb;bomb.color=6;bomb.dam=1;bomb.hp=1;bomb.alive=false;bomb.rt=rand()%(eq_rt+1)+1;	//eq_rt為復活最長時間return bomb;			
}

此處,init_bomb函數的形參為結構體,形參傳輸函數計算后的結果,并不能直接返回給全局結構體,所以必須采用返回值的方法將初始化的值傳遞給結構體。

(二)所有炮彈初始化

這個函數在游戲啟動或者游戲過關后調用。

//所有炮彈初始化函數 
void init_bombs(void)
{game.bomb_move=false;for(int i=0;i<game.bombs_round;i++){bomb[i]=init_bomb(bomb[i]);	}
}

(三)炮彈位置更新線程函數

這個函數在線程啟動函數中啟用。

//炮彈位置更新 線程 
void* thread_bomb(void* arg)
{while(1){Sleep(game.bomb_interval);game.bomb_move=true;for(int i=0;i<game.bombs_round;i++){			if(bomb[i].alive){bomb[i].location.y++;			}else{bomb[i].rt--;if(bomb[i].rt<=0){bomb[i].alive=true;bomb[i].location.y=0;}			}if(bomb[i].location.y>b_b+5){bomb[i].hp=0;									}if(bomb[i].hp<=0){bomb[i]=init_bomb(bomb[i]);				}}		}
}

(四)炮彈位置更新線程啟動函數

這個函數在主函數中調用啟動,然后一直運行。

//炮彈位置更新線程啟動函數
void bomb_location_update()
{pthread_t tid; pthread_create(&tid, NULL, thread_bomb, NULL);
}

四、更新后的程序代碼

(一)主函數

#include "control_plane.h"
using namespace std; Plane plane[eq_plane];
Game game;
Bomb bomb[eq_bombs_round];int main(int argc, char** argv) {	init();	//初始化					 bgmusic();//播放背景音樂getkey();bomb_location_update();	while(1)					//循環等待鍵盤指令 {if(plane[0].keycmd!=none_cmd ||plane[1].keycmd!=none_cmd ||game.bomb_move){game.bomb_move=false;system("cls");for(int i=0;i<game.num_plane;i++){show_plane(plane[i]);	//刷新飛機圖標}for(int i=0;i<game.bombs_round;i++){if(bomb[i].alive){show_bomb(bomb[i]);}}}}return 0; 	
}

(二)頭文件control_plane.h

#ifndef CONTROL_PLANE_H
#define CONTROL_PLANE
#include <iostream>
#include <ctime>
#include <string>
#include<stdlib.h>
#include<windows.h>
#include <pthread.h>//導入線程頭文件庫
#include <mmsystem.h> //導入聲音頭文件庫
#pragma comment(lib,"winmm.lib")//導入聲音的鏈接庫
#define _CRT_SECURE_NO_WARNINGS 
using namespace std;#define t_b 0  	//圖形顯示區域上側邊界 
#define l_b 0	//圖形顯示區域左側邊界
#define r_b 100	//圖形顯示區域右側邊界
#define b_b 20	//圖形顯示區域下側邊界#define eq_plane 2	//飛機架數
#define eq_bombs_round 23	//eq=end quantity最終炮彈數量 
#define eq_rt 10	//復活最大時間//定義飛機造型 
const string icon_plane1[]={"    ■","■  ■  ■","■■■■■","■  ■  ■","    ■","  ■■■"};
const string icon_plane2[]={"    ■","■  ■  ■","■■■■■","    ■","  ■■■","■■■■■"};//定義炮彈造型
const string icon_bomb="■";//定義坐標結構體 
typedef struct{int x;int y;
} Location;//定義移動方向命令枚舉類型 
typedef  enum {none_cmd,up_cmd,down_cmd,left_cmd,right_cmd} direction_cmd; //定義游戲結構體 
typedef struct{int stage;					//游戲當前關 	int bombs_round;			//敵方每輪發射炮彈數量 int bombs_stage;			//每關總計出現炮彈數量 bool clear;					//游戲過關 bool complete;				//游戲通關 bool gameover;				//游戲結束int num_plane;				//飛機數量 int cur_num_bomb;			//當前已發射炮彈數量 int bomb_interval; 			//位置更新間隔 bool bomb_move;				//炮彈是否移動 
}Game;//定義飛機結構體 
typedef struct{Location location;int color;int icon;direction_cmd keycmd;
}Plane;//定義敵方炮彈結構體 
typedef struct{Location location;	//炮彈位置 bool alive;			//炮彈是否存活 int color;			//炮彈顏色string icon;		//炮彈圖標int rt;				//rt=respawn time復活時間 int hp;				//hp=hit point 生命值,此值<=0時,敵方炮彈死亡,敵方炮彈被飛機子彈擊中hp會減少,墜地或與飛機相撞hp直接降為0 int dam;			//dam=damage 傷害值int type;			//炮彈類型 
}Bomb;extern Plane plane[eq_plane];
extern Game game;
extern Bomb bomb[eq_bombs_round];//聲明刷新飛機位置函數
void show_plane(Plane plane);//獲取鍵盤指令 
void key(void);//更新所有飛機坐標
void plane_location_update(void);//初始化函數 
void init(void);//播放背景音樂線程 
void* thread_bgmusic(void* arg);
void play_bgmusic();
void bgmusic();//獲取按鍵指令線程
void* thread_key(void* arg);
void getkey();//輸出彩色字符函數
template<typename T>	//T表示任何可以被cout輸出的類型 
void ColorCout(T t, const int ForeColor = 7, const int BackColor = 0);void init_bombs(void);
Bomb init_(Bomb bomb);
void* thread_bomb(void* arg);
void bomb_location_update();
void show_bomb(Bomb bomb);#endif

(三)庫函數control_plane.cpp

#include <iostream>
#include "conio.h"
#include <string>
#include "control_plane.h"
#include<windows.h>
using namespace std;//彩色輸出函數
template<typename T>	//T表示任何可以被cout輸出的類型
void ColorCout(T t, const int ForeColor = 7, const int BackColor = 0)
{//	0 = 黑色	1 = 藍色	 2 = 綠色	 3 = 淺綠色		 4 = 紅色	 5 = 紫色	 6 = 黃色	 7 = 白色//	8 = 灰色	9 = 淡藍色	10 = 淡綠色	11 = 淡淺綠色	12 = 淡紅色	13 = 淡紫色	14 = 淡黃色	15 = 亮白色SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), ForeColor + BackColor * 0x10);cout << t;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}//隱藏光標函數
HANDLE han = GetStdHandle(-11);
void hide(){CONSOLE_CURSOR_INFO cursor;cursor.bVisible = 0;cursor.dwSize = 1;SetConsoleCursorInfo(han,&cursor);
}//初始化函數 
void init(void)
{plane[0].location={2*r_b/3,b_b};plane[1].location={r_b/3,b_b};plane[0].color=1;plane[1].color=2;plane[0].icon=1;plane[1].icon=2;srand(time(NULL));game.num_plane=2;game.bombs_round=3;game.bomb_move=false;game.bomb_interval=1000;init_bombs();system("cls");for(int i=0;i<game.num_plane;i++)//刷新飛機圖標{		show_plane(plane[i]);	plane[i].keycmd=none_cmd;		}		
//	game.num_plane=2;	game.bombs_round=3;hide();//隱藏光標
}//********************************************************************************//以下三個函數為獲得按鍵指令線程函數 
//********************************************************************************void* thread_key(void* arg)
{while(1){Sleep(60); 		//獲取指令延時一定時間,起濾波作用,延緩獲取指令的響應速度 key();			//獲取按鍵指令plane_location_update() ;//獲取完指令馬上更新飛機坐標 }
}
void getkey()
{pthread_t tid; pthread_create(&tid, NULL, thread_key, NULL);
}//獲取鍵盤指令函數
void key(void)
{direction_cmd c=none_cmd;direction_cmd d=none_cmd;	if (GetAsyncKeyState(VK_UP) & 0x8000)		c = up_cmd;if (GetAsyncKeyState(VK_DOWN) & 0x8000)		c = down_cmd;if (GetAsyncKeyState(VK_LEFT) & 0x8000)		c = left_cmd;if (GetAsyncKeyState(VK_RIGHT) & 0x8000)	c = right_cmd;if (GetAsyncKeyState('W') & 0x8000)	d = up_cmd;if (GetAsyncKeyState('S') & 0x8000)	d = down_cmd;if (GetAsyncKeyState('A') & 0x8000)	d = left_cmd;if (GetAsyncKeyState('D') & 0x8000)	d = right_cmd;plane[0].keycmd=c;plane[1].keycmd=d;
}void gotoxy(int x, int y) {COORD pos = { x,y };HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//獲取標準輸出設備句柄SetConsoleCursorPosition(hOut, pos);//兩個參數分別指定哪個窗口,具體位置
}//飛機圖標刷新函數 
void show_plane(Plane plane)		//預先定義字符定位顯示函數,x是列坐標,y是行坐標,原點(x=0,y=0)位于屏幕左上角 
{int x,y;int i,j;int rows;x=plane.location.x;y=plane.location.y;switch(plane.icon){case 1://第一種造型 rows=sizeof(icon_plane1)/sizeof(icon_plane1[0]);for(i=0;i<rows;i++)				 {gotoxy(x,y+i);				ColorCout(icon_plane1[i],plane.color);}break;case 2://第二種造型 rows=sizeof(icon_plane2)/sizeof(icon_plane2[0]);for(i=0;i<rows;i++)				{gotoxy(x,y+i);				ColorCout(icon_plane2[i],plane.color);}break;				}
}//更新兩個飛機的坐標 
void plane_location_update(void)
{ 	for(int i=0;i<2;i++){if(plane[i].keycmd!=none_cmd) {int x,y;x=plane[i].location.x;y=plane[i].location.y;switch(plane[i].keycmd){case up_cmd:y--;				//字符上移一行,行值y減1if(y<t_b)			//限定y值最小值為0{y=t_b;}break;case down_cmd:y++;				//字符下移一行,行值y加1if(y>b_b)			//限定y高度 {y=b_b;}break;case left_cmd:x--;				//字符左移一列,列值x減1if(x<l_b){x=l_b;			//限定x最小值為0; }break;case right_cmd:x++;				//字符右移一列,列值x加1if(x>r_b){x=r_b;			//限定x寬度}break;}plane[i].location.x=x;plane[i].location.y=y;plane[i].keycmd=none_cmd;	}} 		
}//單個炮彈初始化函數 
Bomb init_bomb(Bomb bomb)
{bomb.location.x=rand()%r_b;	bomb.location.y=b_b+6;bomb.icon=icon_bomb;bomb.color=6;bomb.dam=1;bomb.hp=1;bomb.alive=false;bomb.rt=rand()%(eq_rt+1)+1;	return bomb;			
}//所有炮彈初始化函數 
void init_bombs(void)
{game.bomb_move=false;for(int i=0;i<game.bombs_round;i++){bomb[i]=init_bomb(bomb[i]);	}
}//炮彈位置更新 線程 
void* thread_bomb(void* arg)
{while(1){Sleep(game.bomb_interval);game.bomb_move=true;for(int i=0;i<game.bombs_round;i++){			if(bomb[i].alive){bomb[i].location.y++;			}else{bomb[i].rt--;if(bomb[i].rt<=0){bomb[i].alive=true;bomb[i].location.y=0;}			}if(bomb[i].location.y>b_b+5){bomb[i].hp=0;									}if(bomb[i].hp<=0){bomb[i]=init_bomb(bomb[i]);				}}		}
}
//炮彈位置更新 
void bomb_location_update()
{pthread_t tid; pthread_create(&tid, NULL, thread_bomb, NULL);
}炮彈圖標刷新函數
void show_bomb(Bomb bomb)		//預先定義字符定位顯示函數,x是列坐標,y是行坐標,原點(x=0,y=0)位于屏幕左上角 
{int x,y;	x=bomb.location.x;y=bomb.location.y;gotoxy(x,y);ColorCout(bomb.icon,bomb.color);} //********************************************************************************//以下三個函數為播放背景音樂功能 
//********************************************************************************//播放一遍背景音樂 void play_bgmusic() {  mciSendString(TEXT("open hero.mp3 alias s1"),NULL,0,NULL);mciSendString(TEXT("play s1"),NULL,0,NULL);Sleep(153*1000);//153*1000意思是153秒,是整首音樂的時長 mciSendString(TEXT("close S1"),NULL,0,NULL); }//循環播放音樂線程函數 
void* thread_bgmusic(void* arg) //
{ while(1){  	play_bgmusic();}
} //創建音樂播放線程,開始循環播放音樂 
void bgmusic()
{pthread_t tid; pthread_create(&tid, NULL, thread_bgmusic, NULL);
}

(未完待續)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38658.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38658.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38658.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringBoot中的可擴展接口

目錄 # 背景 # 可擴展的接口啟動調用順序圖 # ApplicationContextInitializer # BeanDefinitionRegistryPostProcessor # BeanFactoryPostProcessor # InstantiationAwareBeanPostProcessor # SmartInstantiationAwareBeanPostProcessor # BeanFactoryAware # Applicati…

炬芯科技發布全新第二代智能手表芯片,引領腕上新趨勢!

2023年7月&#xff0c;炬芯科技宣布全新第二代智能手表芯片正式發布。自2021年底炬芯科技推出第一代的智能手表芯片開始便快速獲得了市場廣泛認可和品牌客戶的普遍好評。隨著技術的不斷創新和突破&#xff0c;為了更加精準地滿足市場多元化的變幻和用戶日益增長的體驗需求&…

Jmeter-壓力測試工具

文章目錄 Jmeter快速入門1.1.下載1.2.解壓1.3.運行 2.快速入門2.1.設置中文語言2.2.基本用法 Jmeter快速入門 1s內發送大量請求&#xff0c;模擬高QPS&#xff0c;用以測試網站能承受的壓力有多大 Jmeter依賴于JDK&#xff0c;所以必須確保當前計算機上已經安裝了JDK&#xff0…

Android Shape 的使用

目錄 什么是Shape? shape屬性 子標簽屬性 corners &#xff08;圓角&#xff09; solid &#xff08;填充色&#xff09; gradient &#xff08;漸變&#xff09; stroke &#xff08;描邊&#xff09; padding &#xff08;內邊距&#xff09; size &#xff08;大小…

CentOS系統環境搭建(三)——Centos7安裝DockerDocker Compose

centos系統環境搭建專欄&#x1f517;點擊跳轉 Centos7安裝Docker&Docker Compose 使用 yum 安裝Docker 內核 [rootVM-4-17-centos ~]# uname -r 3.10.0-1160.88.1.el7.x86_64Docker 要求 CentOS 系統的內核版本高于 3.10 更新 yum yum update安裝需要的軟件包&#x…

在Windows Server 2008上啟用自動文件夾備份

要在Windows Server 2008上啟用自動文件夾備份&#xff0c;您可以使用內置的Windows備份功能。下面是如何設置它的方法&#xff1a; 1. 點擊“開始”按鈕并選擇“服務器管理器”&#xff0c;打開“服務器管理器”。 2. 在“服務器管理器”窗口中&#xff0c;單擊左側窗格中的“…

Python學習筆記_基礎篇(六)_Set集合,函數,深入拷貝,淺入拷貝,文件處理

1、Set基本數據類型 a、set集合&#xff0c;是一個無序且不重復的元素集合 class set(object):"""set() -> new empty set objectset(iterable) -> new set objectBuild an unordered collection of unique elements."""def add(self, *a…

redis-數據類型及樣例

一.string 類型數據的基本操作 1.添加/修改數據 set key value2.獲取數據 get key3.刪除數據 del key4.添加/修改多個數據 mset key1 value1 key2 value25.獲取多個數據 mget key1 key2二.list類型的基本操作 數據存儲需求&#xff1a;存儲多個數據&#xff0c;并對數據…

day 0815

計算文件有多少行&#xff1f; 2.文件的拷貝

SpringBoot引入外部jar打包失敗解決,SpringBoot手動引入jar打包war后報錯問題

前言 使用外部手動添加的jar到項目&#xff0c;打包時出現jar找不到問題解決 處理 例如項目結構如下 引入方式換成這種 <!-- 除了一下這兩種引入外部jar&#xff0c;還是可以將外部jar包添加到maven中&#xff08;百度查&#xff09;--><!-- pdf轉word --><…

Installshield軟件項目打包學習

Installshield打包學習記錄 個人工作學習的一點點記錄&#xff0c;可能有不專業的表述&#xff0c;各位可以提出建議&#xff0c;共同學習。 目錄 Installshield打包學習記錄一、Installshield的幾個事件&#xff1a;1. Before Move Data&#xff08;安裝數據前&#xff09;1.…

前端代理配置

dev: {env: require(./dev.env),port: process.env.PORT || 8080,autoOpenBrowser: true,assetsSubDirectory: static,assetsPublicPath: /,proxyTable: {// 以 /party/fundamental/ 開頭的請求&#xff0c;全部轉發到 target 設置的地址/party/fundamental/: {// target: http…

【BASH】回顧與知識點梳理(二十八)

【BASH】回顧與知識點梳理 二十八 二十八. 例行性工作排程(crontab)28.1 什么是例行性工作排程Linux 工作排程的種類&#xff1a; at, cronCentOS Linux 系統上常見的例行性工作 28.2 僅執行一次的工作排程atd 的啟動at 的運作方式實際運作單一工作排程at 工作的管理batch&…

Windows下升級jdk1.8小版本

1.首先下載要升級jdk最新版本&#xff0c;下載地址&#xff1a;Java Downloads | Oracle 中國 2.下載完畢之后&#xff0c;直接雙擊下載完畢后的文件&#xff0c;進行安裝。 3.安裝完畢后&#xff0c;調整環境變量至新安裝的jdk位置 4.此時&#xff0c;idea啟動項目有可能會出…

ATF bl1 ufshc_dme_get/set處理流程分析

ATF bl1 ufshc_dme_get/set處理流程分析 UFS術語縮略詞1 ATF的下載鏈接2 ATF BL1 ufshc_dme_get/set流程3 ufs總體架構圖3.1 UFS Top Level Architecture3.2 UFS System Model 4 ufshc_dme_get/set函數接口詳細分析4.1 ufshc_dme_get4.2 ufshc_dme_set4.3 ufshc_send_uic_cmd4.…

nodejs+vue+elementui考研互助交流網站

語言 node.js 框架&#xff1a;Express 前端:Vue.js 數據庫&#xff1a;mysql 數據庫工具&#xff1a;Navicat 開發軟件&#xff1a;VScode 前端nodejsvueelementui,該系統采用vue技術和B/S結構進行開發設計&#xff0c;后臺使用MySQL數據庫進行數據存儲。系統主要分為兩大模…

大數據課程J2——Scala的基礎語法和函數

文章作者郵箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;廣東惠州 ▲ 本章節目的 ? 掌握Scala的基礎語法&#xff1b; ? 掌握Scala的函數庫&#xff1b; 一、Scala 基礎語法一 1. 概述 語句 說明 示例 var 用來聲明一個變量&#xff0c; 變量聲明后…

java面試題(16):Mysql一致性視圖是啥時候建立的

1 演示錯誤案例 先給大家來一個錯誤演示。 我們打開兩個會話窗口&#xff0c;默認情況下隔離級別是可重復讀&#xff0c;我們來看下&#xff1a; 首先在 A 會話中查看當前 user 表&#xff0c;查看完成后開啟事務&#xff1a; 可以看到id3的數據sex是男。 接下來在 B 會話中…

K8S系列一:概念入門

寫在前面 本文組織方式&#xff1a; K8S的架構、作用和目的。需要首先對K8S整體有所了解。 K8S是什么&#xff1f; 為什么是K8S&#xff1f; K8S怎么做&#xff1f; K8S的重要概念&#xff0c;即K8S的API對象。要學習和使用K8S必須知道和掌握的幾個對象。 Pod 實例 Volume 數…

php錯誤類型與處理

1 語法編譯錯誤&#xff0c;少了分號&#xff0c;這是系統觸發的錯誤&#xff0c;不需要我們去管。 2 錯誤類型有四種&#xff1a;error致命錯誤&#xff0c;代碼不會往下運行&#xff1b;warning&#xff1a;提醒錯誤&#xff0c;會往下運行&#xff0c;但是會有意想不到的結果…