【c语言】飞机大战2

1.优化边界问题

之前视频中当使用drawAlpha函数时,是为了去除飞机后面变透明,当时当飞机到达边界的时候,会出现异常退出,这是因为drawAlpha函数不稳定,昨天试过制作掩码图,下载了一个ps,改的话,图片大小又变了,最后采用的方式是当飞机在窗口内的时候使用drawAlpha函数贴图,当飞机要出边缘的时候,使用putimage贴图,防止出现闪退,优化后飞机到边界的时候会出现黑框.

边界优化

对应的代码实现

void draw()
{putimage(0, 0, &img_bk);if (plane.x > -1 && plane.x < WIDTH && plane.y>-1 && plane.y + 48< HEIGHT){drawAlpha(&img_plane, plane.x, plane.y);}else{putimage(plane.x, plane.y, &img_plane);}if (a.x > -1 && a.x < WIDTH && a.y>0&& a.y + 98 < HEIGHT){drawAlpha(&img_a, a.x, a.y);}else{putimage(a.x, a.y, &img_a);}if (b.x > -1 && b.x < WIDTH && b.y>-1 && b.y +120 < HEIGHT){drawAlpha(&img_b, b.x, b.y);}else{putimage(b.x, b.y, &img_b);}if (c.x > -1 && c.x < WIDTH && c.y>-1 && c.y + 120 < HEIGHT){drawAlpha(&img_c, c.x, c.y);}else{putimage(c.x, c.y, &img_c);}}

2.我方战机发射子弹

如果我们用数组存储子弹的信息的话,在不断发射子弹的过程中,不断的创建数组元素,会导致栈溢出,所以我们使用链表存储每个子弹的信息,当打出一个子弹时,会创建一个新的结点,并且尾插到头结点上去,当子弹出屏幕,或者隔一段时间,删除出屏幕的子弹,用到单链表节点的删除.

1.首先创建一个子弹的结构体,并创建我方飞机子弹的头节点

typedef struct bullet
{float x, y;float vx, vy;int  isexist;struct bullet* next;}list;
list* planebullet = NULL;

2.创建新结点

list* BuyplanebulletNode(float vx, float vy)
{list* newnode = (list*)malloc(sizeof(list));//空间申请assert(newnode);//断言,新结点是否申请到了newnode->vx = vx;//数据赋值newnode->vy = vy;//数据赋值newnode->x = plane.x + plane.width / 2+17;newnode->y = plane.y;//让子弹的出生坐标在飞机中间newnode->isexist = 1;newnode->next = NULL;//指向的地址赋值return newnode;//将申请好的空间首地址返回回去}

3 尾插新结点.

void pushback1(list** pphead,float vx,float vy)//尾插
{list* newnode = BuyplanebulletNode(vx, vy);if (*pphead == NULL)//链表无结点{*pphead = newnode;// 将创建好的头节点的地址给给*pphead,作为新头节点的地址}else{list* tail = *pphead;//定义一个指针,先指向头结点的地址while (tail->next != NULL)//循环遍历找尾结点{tail = tail->next;//指针指向下一个结点}tail->next = newnode;//找到尾结点,将尾结点的next存放新接结点的地址}}

4.结点的删除

void removebullet(list** pplist)
{if (*pplist == NULL)return;list* cur = *pplist;list* prev = NULL;while (cur != NULL){if (cur->isexist == 0){if (*pplist == cur){*pplist = cur->next;free(cur);cur = *pplist;}else{prev->next = cur->next;free(cur);cur = prev;}}else{prev = cur;cur = cur->next;}}}

5.子弹位置改变参数设置

void listchangexy(list** pplist)
{if (*pplist == NULL)return;list* cur = *pplist;while (cur != NULL){cur->x += cur->vx;cur->y += cur->vy;if ((cur->y<0 )|| (cur->y>HEIGHT) || (cur->x >0) || (cur->x <WIDTH))cur->isexist = 0;cur = cur->next;}}

遍历子弹链表,使得每个子弹的位置属性发生变化,当子弹出屏幕时,将当前cur指向的子弹的exist==0,表示子弹消失,cur指向下一个子弹,改变子弹的位置坐标属性.
上面创建的链表存下了每个子弹的属性,然后我们遍历子弹链表,贴子弹上去。

6.贴子弹上去

void showbullet()
{static int count1 = 0;listchangexy(&planebullet);for (list* cur = planebullet; cur!= NULL; cur = cur ->next){putimage(cur->x,cur->y, &img_planebullet);}if (++count1 == 100){removebullet(&planebullet);}if (count1 > 99999){count1 = 0;}}}

这里定时清理一下出屏幕的子弹,要不然太占内存了.如果直接使用removebullet会出现错误
当然在player_move函数里面加

	if (GetAsyncKeyState(VK_SPACE))// && Timer(300, 1)){pushback1(&planebullet, 0, -20);}

我们可以使用空格开火,当空格按下一次,就尾插子弹信息到对应子弹的结点上去
总结
在这里插入图片描述

子弹发射

7.解决子弹太密集问题

使用定时器函数,隔一段时间才能发射子弹

bool Timer(int ms, int id)
{static DWORD t[10];if (clock() - t[id] > ms){t[id] = clock();return true;}return false;
}

这个先记住就行,不用理解,参数第一个是定时时间,单位是ms,第二个我也不太清楚,传个1就行.

	if ((GetAsyncKeyState(VK_SPACE))&& Timer(300, 1)){pushback1(&planebullet, 0, -20);//pushback1(&planebullet, -10, -17.32);//pushback1(&planebullet, 10, -17.32);}

8.子弹升级

子弹升级

	if ((GetAsyncKeyState(VK_SPACE))&& Timer(300, 1)){pushback1(&planebullet, 0, -20);pushback1(&planebullet, -10, -17.32);pushback1(&planebullet, 10, -17.32);}

3.敌方的子弹发射

当我们会处理我方的子弹发射之后,敌方子弹的发射也是同样的道理

敌机a子弹的发射

敌机a子弹发射(步骤和我方战机相同)

list* abullet = NULL;
void pushback2(list** pphead, float vx, float vy);
list* BuyabulletNode(float vx, float vy)
{list* newnode = (list*)malloc(sizeof(list));//空间申请assert(newnode);//断言,新结点是否申请到了newnode->vx = vx;//数据赋值newnode->vy = vy;//数据赋值newnode->x = a.x + a.width / 2-10;newnode->y = a.y+80;newnode->isexist = 1;newnode->next = NULL;//指向的地址赋值return newnode;//将申请好的空间首地址返回回去}
void pushback2(list** pphead, float vx, float vy)//尾插
{list* newnode = BuyabulletNode(vx, vy);if (*pphead == NULL)//链表无结点{*pphead = newnode;// 将创建好的头节点的地址给给*pphead,作为新头节点的地址}else{list* tail = *pphead;//定义一个指针,先指向头结点的地址while (tail->next != NULL)//循环遍历找尾结点{tail = tail->next;//指针指向下一个结点}tail->next = newnode;//找到尾结点,将尾结点的next存放新接结点的地址}}
void removebullet(list** pplist)
{if (*pplist == NULL)return;list* cur = *pplist;list* prev = NULL;while (cur != NULL){if (cur->isexist == 0){if (*pplist == cur){*pplist = cur->next;free(cur);cur = *pplist;}else{prev->next = cur->next;free(cur);cur = prev;}}else{prev = cur;cur = cur->next;}}}
void listchangexy(list** pplist)
{if (*pplist == NULL)return;list* cur = *pplist;while (cur != NULL){cur->x += cur->vx;cur->y += cur->vy;if ((cur->y<0 )|| (cur->y>HEIGHT) || (cur->x >0) || (cur->x <WIDTH))cur->isexist = 0;cur = cur->next;}}void showbullet()
{static int count1 = 0;listchangexy(&planebullet);if (++count1 == 100){removebullet(&planebullet);removebullet(&abullet);removebullet(&bbullet);}if (count1 > 99999){count1 = 0;}for (list* cur = planebullet; cur!= NULL; cur = cur ->next){putimage(cur->x,cur->y, &img_planebullet);}listchangexy(&abullet);for (list* cur = abullet; cur != NULL; cur = cur->next){//putimage(cur->x - 10, cur->y - 10, &img_planebullet);putimage(cur->x , cur->y, &img_abullet);}//listchangexy(&bbullet);////for (list* cur = bbullet; cur != NULL; cur = cur->next)//{//	//putimage(cur->x - 10, cur->y - 10, &img_planebullet);//	putimage(cur->x, cur->y, &img_bbullet);//}}

因为敌机a在移动中发射子弹,所以将puchback2放在ufoamove函数里面

void ufoamove()
{static int dir1 = 1;static int cnt = 0;if (a.bornflag == 1){a.bornflag = 0;a.x = rand() % (WIDTH - a.width);a.y = -50;}if (a.y > 200){dir1 = 0;}else if (a.y < -150){dir1 = 1;a.bornflag = 1;}if (1 == dir1){a.y += a.speed;}else{a.y -= a.speed;}if (++cnt % 50 == 0){pushback2(&abullet, 0, 10);}if (cnt > 99999){cnt = 0;}}

设置一个静态变量cnt,当cnt%50取余==0时,发射子弹,这样也解决了子弹太密集(50可以修改,就相当于间隔),cnt为int,可能会溢出,所以>99999,将cnt=0;

敌机b子弹的发射

同理
在这里插入图片描述
包含头文件#include<math.h>

4.程序源码

#include<stdio.h>
#include <graphics.h>
#include <assert.h>
#include <stdlib.h>
#include<conio.h>//_getch();
#include <time.h>
#include <math.h>
#define PI 3.1415926
#define HEIGHT  503
#define WIDTH 700IMAGE img_bk, img_plane, img_a, img_b, img_c, img_abullet, img_bbullet, img_cbullet, img_planebullet,img_tmp;
typedef struct bullet
{float x, y;float vx, vy;int  isexist;struct bullet* next;}list;
list* planebullet = NULL;
list* abullet = NULL;
list* bbullet = NULL;
void pushback2(list** pphead, float vx, float vy);
void pushback3(list** pphead, float vx, float vy);
void pushback(list** pphead, list* newnode);//尾插;
struct aircraft
{int x, y;int width;int height;int speed;int bornflag;};
aircraft plane, a, b, c;
void datainit()
{plane = { 150,150 };//a = { 0,0 };/*b = { 300,0 };*//*c = { 450,0 };*/a.speed = 1;a.bornflag = 1;b.bornflag = 1;c.bornflag = 1;a.width = 100;a.height = 100;b.speed = 1;b.width = 80;b.height = 100;c.height = 70;c.width = 70;c.speed = 3;}
list* BuyabulletNode(float vx, float vy)
{list* newnode = (list*)malloc(sizeof(list));//空间申请assert(newnode);//断言,新结点是否申请到了newnode->vx = vx;//数据赋值newnode->vy = vy;//数据赋值newnode->x = a.x + a.width / 2-10;newnode->y = a.y+80;newnode->isexist = 1;newnode->next = NULL;//指向的地址赋值return newnode;//将申请好的空间首地址返回回去}
list* BuybbulletNode(float vx, float vy)
{list* newnode = (list*)malloc(sizeof(list));//空间申请assert(newnode);//断言,新结点是否申请到了newnode->vx = vx;//数据赋值newnode->vy = vy;//数据赋值newnode->x = b.x + b.width / 2 - 10;newnode->y = b.y + 80;newnode->isexist = 1;newnode->next = NULL;//指向的地址赋值return newnode;//将申请好的空间首地址返回回去}
list* BuyplanebulletNode(float vx, float vy)
{list* newnode = (list*)malloc(sizeof(list));//空间申请assert(newnode);//断言,新结点是否申请到了newnode->vx = vx;//数据赋值newnode->vy = vy;//数据赋值newnode->x = plane.x + plane.width / 2+17;newnode->y = plane.y;newnode->isexist = 1;newnode->next = NULL;//指向的地址赋值return newnode;//将申请好的空间首地址返回回去}
void drawAlpha(IMAGE* picture, int  picture_x, int picture_y) //x为载入图片的X坐标,y为Y坐标
{// 变量初始化DWORD* dst = GetImageBuffer();    // GetImageBuffer()函数,用于获取绘图设备的显存指针,EASYX自带DWORD* draw = GetImageBuffer();DWORD* src = GetImageBuffer(picture); //获取picture的显存指针int picture_width = picture->getwidth(); //获取picture的宽度,EASYX自带int picture_height = picture->getheight(); //获取picture的高度,EASYX自带int graphWidth = getwidth();       //获取绘图区的宽度,EASYX自带int graphHeight = getheight();     //获取绘图区的高度,EASYX自带int dstX = 0;    //在显存里像素的角标// 实现透明贴图 公式: Cp=αp*FP+(1-αp)*BP , 贝叶斯定理来进行点颜色的概率计算for (int iy = 0; iy < picture_height; iy++){for (int ix = 0; ix < picture_width; ix++){int srcX = ix + iy * picture_width; //在显存里像素的角标int sa = ((src[srcX] & 0xff000000) >> 24); //0xAArrggbb;AA是透明度int sr = ((src[srcX] & 0xff0000) >> 16); //获取RGB里的Rint sg = ((src[srcX] & 0xff00) >> 8);   //Gint sb = src[srcX] & 0xff;              //Bif (ix >= 0 && ix <= graphWidth && iy >= 0 && iy <= graphHeight && dstX <= graphWidth * graphHeight){if ((ix + picture_x) >= 0 && (ix + picture_x) <= graphWidth)	//防止出边界后循环显示{dstX = (ix + picture_x) + (iy + picture_y) * graphWidth; //在显存里像素的角标int dr = ((dst[dstX] & 0xff0000) >> 16);int dg = ((dst[dstX] & 0xff00) >> 8);int db = dst[dstX] & 0xff;draw[dstX] = ((sr * sa / 255 + dr * (255 - sa) / 255) << 16)  //公式: Cp=αp*FP+(1-αp)*BP  ; αp=sa/255 , FP=sr , BP=dr| ((sg * sa / 255 + dg * (255 - sa) / 255) << 8)         //αp=sa/255 , FP=sg , BP=dg| (sb * sa / 255 + db * (255 - sa) / 255);              //αp=sa/255 , FP=sb , BP=db}}}}
}void load()
{loadimage(&img_bk, "./back.png");loadimage(&img_plane, "./1.png");loadimage(&img_a, "./2.png");loadimage(&img_b, "./3.png");loadimage(&img_c, "./4.png");loadimage(&img_abullet, "./5.png");loadimage(&img_bbullet, "./6.png");loadimage(&img_cbullet, "./7.png");loadimage(&img_planebullet, "./8.png");}
void draw()
{putimage(0, 0, &img_bk);if (plane.x > -1 && plane.x < WIDTH && plane.y>-1 && plane.y + 48< HEIGHT){drawAlpha(&img_plane, plane.x, plane.y);}else{putimage(plane.x, plane.y, &img_plane);}if (a.x > -1 && a.x < WIDTH && a.y>0&& a.y + 98 < HEIGHT){drawAlpha(&img_a, a.x, a.y);}else{putimage(a.x, a.y, &img_a);}if (b.x > -1 && b.x < WIDTH && b.y>-1 && b.y +120 < HEIGHT){drawAlpha(&img_b, b.x, b.y);}else{putimage(b.x, b.y, &img_b);}if (c.x > -1 && c.x < WIDTH && c.y>-1 && c.y + 120 < HEIGHT){drawAlpha(&img_c, c.x, c.y);}else{putimage(c.x, c.y, &img_c);}/*drawAlpha(&img_a, a.x, a.y);drawAlpha(&img_b, b.x, b.y);drawAlpha(&img_c, c.x, c.y);drawAlpha(&img_abullet, 400, 0);drawAlpha(&img_bbullet, 400, 50);drawAlpha(&img_cbullet, 400, 100);drawAlpha(&img_planebullet, 400, 150);*//*       putimage(plane.x, plane.y, &img_plane); putimage(a.x, a.y ,&img_a);putimage(b.x, b.y ,&img_b );putimage(c.x, c.y, &img_c );putimage(400, 50 ,&img_bbullet);putimage(400, 100 ,&img_cbullet );*/}void ufoamove()
{static int dir1 = 1;static int cnt = 0;if (a.bornflag == 1){a.bornflag = 0;a.x = rand() % (WIDTH - a.width);a.y = -50;}if (a.y > 200){dir1 = 0;}else if (a.y < -150){dir1 = 1;a.bornflag = 1;}if (1 == dir1){a.y += a.speed;}else{a.y -= a.speed;}if (++cnt % 50 == 0){pushback2(&abullet, 0, 10);}if (cnt > 99999){cnt = 0;}}
void ufobmove()
{static int num = 0;static int step = b.speed;if (b.bornflag == 1){b.bornflag = 0;b.x = rand() % (WIDTH - b.width);b.y = -b.height;}if (b.x <= 0 || b.x + b.width >= WIDTH){step = -step;}b.x += step;b.y++;if (b.y >= HEIGHT){b.bornflag = 1;}if (++num % 200 == 0){for (int i = 0; i < 10; i++){float angle = i * 2 * PI / 10;float vx = 1* sin(angle);float vy = 1 * cos(angle);pushback3(&bbullet, vx, vy);}}if (num > 99999){num = 0;}}void pushback1(list** pphead,float vx,float vy)//尾插
{list* newnode = BuyplanebulletNode(vx, vy);if (*pphead == NULL)//链表无结点{*pphead = newnode;// 将创建好的头节点的地址给给*pphead,作为新头节点的地址}else{list* tail = *pphead;//定义一个指针,先指向头结点的地址while (tail->next != NULL)//循环遍历找尾结点{tail = tail->next;//指针指向下一个结点}tail->next = newnode;//找到尾结点,将尾结点的next存放新接结点的地址}}
void pushback2(list** pphead, float vx, float vy)//尾插
{list* newnode = BuyabulletNode(vx, vy);if (*pphead == NULL)//链表无结点{*pphead = newnode;// 将创建好的头节点的地址给给*pphead,作为新头节点的地址}else{list* tail = *pphead;//定义一个指针,先指向头结点的地址while (tail->next != NULL)//循环遍历找尾结点{tail = tail->next;//指针指向下一个结点}tail->next = newnode;//找到尾结点,将尾结点的next存放新接结点的地址}}
void pushback3(list** pphead, float vx, float vy)//尾插
{list* newnode = BuybbulletNode(vx, vy);if (*pphead == NULL)//链表无结点{*pphead = newnode;// 将创建好的头节点的地址给给*pphead,作为新头节点的地址}else{list* tail = *pphead;//定义一个指针,先指向头结点的地址while (tail->next != NULL)//循环遍历找尾结点{tail = tail->next;//指针指向下一个结点}tail->next = newnode;//找到尾结点,将尾结点的next存放新接结点的地址}}
void removebullet(list** pplist)
{if (*pplist == NULL)return;list* cur = *pplist;list* prev = NULL;while (cur != NULL){if (cur->isexist == 0){if (*pplist == cur){*pplist = cur->next;free(cur);cur = *pplist;}else{prev->next = cur->next;free(cur);cur = prev;}}else{prev = cur;cur = cur->next;}}}
void listchangexy(list** pplist)
{if (*pplist == NULL)return;list* cur = *pplist;while (cur != NULL){cur->x += cur->vx;cur->y += cur->vy;if ((cur->y<0 )|| (cur->y>HEIGHT) || (cur->x >0) || (cur->x <WIDTH))cur->isexist = 0;cur = cur->next;}}
void showbullet()
{static int count1 = 0;listchangexy(&planebullet);if (++count1 == 100){removebullet(&planebullet);removebullet(&abullet);removebullet(&bbullet);}if (count1 > 99999){count1 = 0;}for (list* cur = planebullet; cur!= NULL; cur = cur ->next){putimage(cur->x,cur->y, &img_planebullet);}listchangexy(&abullet);for (list* cur = abullet; cur != NULL; cur = cur->next){//putimage(cur->x - 10, cur->y - 10, &img_planebullet);putimage(cur->x , cur->y, &img_abullet);}listchangexy(&bbullet);for (list* cur = bbullet; cur != NULL; cur = cur->next){//putimage(cur->x - 10, cur->y - 10, &img_planebullet);putimage(cur->x, cur->y, &img_bbullet);}}void ufocmove()
{static float disx = 0, disy = 0;static float tmpx = 0, tmpy = 0;static float vx = 0, vy = 0;float step = 1000 / c.speed;if (1 == c.bornflag){c.bornflag = 0;tmpx = rand() % (WIDTH - c.width);tmpy = -c.height;disx = plane.x - tmpx;disy = plane.y - tmpy;vx = disx / step;vy = disy / step;}tmpx += vx;tmpy += vy;c.x = (int)(tmpx + 0.5);c.y = (int)(tmpy + 0.5);if (c.x < -c.width){c.bornflag = 1;}else if (c.x > WIDTH){c.bornflag = 1;}if (c.y > HEIGHT){c.bornflag = 1;}}
bool Timer(int ms, int id)
{static DWORD t[10];if (clock() - t[id] > ms){t[id] = clock();return true;}return false;
}
void player_move(int speed) //处理飞机移动
{int reload_time = 100;static int fire_start = 0;int tmp = clock();if (GetAsyncKeyState(VK_UP) || GetAsyncKeyState('W')){if (plane.y > 0)plane.y -= speed;}if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState('S')){if (plane.y + 51 < HEIGHT)plane.y += speed;}if (GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState('A')){if (plane.x > 0)plane.x -= speed;}if (GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState('D')){if (plane.x + 51 < WIDTH)plane.x += speed;}if ((GetAsyncKeyState(VK_SPACE))&& Timer(300, 1)){pushback1(&planebullet, 0, -20);pushback1(&planebullet, -10, -17.32);pushback1(&planebullet, 10, -17.32);}}int main(){initgraph(WIDTH, HEIGHT,CONSOLE_FULLSCREEN);BeginBatchDraw();datainit();while (1){load();draw();ufoamove();ufobmove();ufocmove();player_move(5);showbullet();FlushBatchDraw();}EndBatchDraw();getchar();}

5.剩下的发在下篇

6.效果演示

效果演示

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机基础面试题 |02.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

机器学习:贝叶斯估计在新闻分类任务中的应用

文章摘要 随着互联网的普及和发展&#xff0c;大量的新闻信息涌入我们的生活。然而&#xff0c;这些新闻信息的质量参差不齐&#xff0c;有些甚至包含虚假或误导性的内容。因此&#xff0c;对新闻进行有效的分类和筛选&#xff0c;以便用户能够快速获取真实、有价值的信息&…

虚拟专线网络(IP-VPN)

虚拟专线网络(IP-VPN)&#xff0c;因为它的安全性和可靠性。通过亚洲领先的 IP VPN 提供商。享受更高的可管理性和可扩展性&#xff0c;在多个站点之间交付 IP 流量或数据包&#xff0c;拥有亚太地区最大的 IP 骨干网。 1&#xff0c;保证正常运行时间&#xff0c;在网络链路发…

计算机视觉工程师就业前景如何

计算机视觉主要涵盖了图像处理、模式识别等多个领域&#xff0c;可以应用到很多行业中。随着人工智能技术的快速发展&#xff0c;计算机视觉作为其中的重要分支之一&#xff0c;其就业前景非常广阔。 为进一步贯彻落实中共中央印发《关于深化人才发展体制机制改革的意见》和国…

2023-12-14 LeetCode每日一题(用邮票贴满网格图)

2023-12-14每日一题 一、题目编号 2132. 用邮票贴满网格图二、题目链接 点击跳转到题目位置 三、题目描述 给你一个 m x n 的二进制矩阵 grid &#xff0c;每个格子要么为 0 &#xff08;空&#xff09;要么为 1 &#xff08;被占据&#xff09;。 给你邮票的尺寸为 stam…

易舟云财务软件使用教程【文章目录】

易舟云财务软件使用教程【文章目录】 1、财务软件导论2、易舟云财务软件3、财务软件原理4、账套5、会计凭证6、资金日记账7、发票8、员工工资9、固定资产10、期末处理(结转与结账)11、会计账簿12、财务报表13、财务软件设置 1、财务软件导论 财务软件导论 2、易舟云财务软件 …

CSS 纵向扩展动画

上干货 <template><!-- mouseenter"startAnimation" 表示在鼠标进入元素时触发 startAnimation 方法。mouseleave"stopAnimation" 表示在鼠标离开元素时触发 stopAnimation 方法。 --><!-- 容器元素 --><div class"container&q…

【C# 技术】 C# 常用排序方式——自定义数据排序

C# 常用排序方式——自定义数据排序 前言 在最近的项目中经常会对C#中的数据进行排序&#xff0c;对于基本数据类型&#xff0c;其排序方式比较简单&#xff0c;只需要调用内置算法即可实现&#xff0c;但对于自定义数据类型以及自定义排序规则的情况实现起来就比较麻烦&…

windows和linux操作Git(序章2)

Git 分布式版本控制系统(序章1) ## Linux 下安装 Git&#x1f53a; ​ ## Git命令大全&#x1f53a; windows和linux通用 安装完 Git 后&#xff0c;需要进行配置&#xff0c;如姓名、Email 等 git config --global user.name "你的名字"git config --global us…

【C++对于C语言的扩充】C++与C语言的联系,命名空间、C++中的输入输出以及缺省参数

文章目录 &#x1f680;前言&#x1f680;C有何过C之处&#xff1f;&#x1f680;C中的关键字&#x1f680;命名空间✈️为什么要引入命名空间&#xff1f;✈️命名空间的定义✈️如何使用命名空间中的内容呢&#xff1f; &#x1f680;C中的输入和输出✈️C标准库的命名空间✈…

蓝牙物联网灯控设计方案

蓝牙技术是当前应用最广泛的无线通信技术之一&#xff0c;工作在全球通用的 2.4GHZ 的ISM 频段。蓝牙的工作距离约为 100 米&#xff0c;具有一定的穿透性&#xff0c;没有方向限制。具有低成本、抗干扰能力强、传输质量高、低功耗等特点。蓝牙技术组网比较简单&#xff0c;无需…

MySQL Too many connections报错

MySQL 时不时出现Too many connections报错&#xff0c;重启MySQL就好了 但是过段时间又出现 一、解决方案&#xff1a; 1.修改mysql最大连接数 set global max_connections500; 以上是修改立即生效的&#xff0c;重启MySQL就会还原回去 在MySQL配置文件修改 max_connection…