代码地址如下:
http://www.demodashi.com/demo/14259.html

坦克大战-C语言-详注版

概述

本文详述了C语言版坦克大战游戏的原理以及实现方法,对游戏代码进行了详细的分析和注释,通过本文能够让大家对WIN32编程框架有一个大致了解,对C语言运用有一定提高,同时也能给大家提供一个C语言小游戏编程的思路,也能完全够通过自己的实力去编写一个属于自己的游戏.

游戏体验

视频版:坦克大战-C语言版-GameTank

代码框架

坦克大战游戏代码框架如下

main.c 中,创建应用窗口,并初始化一些系统资源,然后初始化gdi,初始化坦克大战游戏.
gdi.c 中,对系统的HDC及绘图接口进行了一次封装,使用WIN32系统提供的绘图接口来实现我们自己的图形绘制API.这里使用到了双缓冲技术,下文会简单介绍.
Tank.c 中,实现了坦克大战的游戏逻辑,包括贴图系统,地图系统,坦克制造,炮弹制造,装备生成,坦克移动,炮弹移动,以及坦克被炮弹击中,坦克吃到装备,等等.
下面将对代码进行详细的分析.

代码主函数

main.c 中,创建应用窗口,并初始化一些系统资源,然后初始化gdi,初始化坦克大战游戏.

//主函数
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR    lpCmdLine,_In_ int       nCmdShow)
{//注册窗口类,创建窗口,初始化等: MyRegisterClass(hInstance);InitInstance(hInstance, nCmdShow);//显示初始化及游戏初始化gdi_init(hWnd);tank_init();//创建坦克大战运行线程hTankRunT = CreateThread(NULL, 0, TankRun, NULL, 0, &dwTankRunTId);//快捷键hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_GAMETANK));// 主消息循环: while (GetMessage(&msg, NULL, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){//TranslateMessage(&msg);DispatchMessage(&msg);}}return (int)msg.wParam;
}//目的: 注册窗口类。
ATOM MyRegisterClass(HINSTANCE hInstance)
{WNDCLASSEXW wcex;......wcex.lpfnWndProc = WndProc;//绑定窗口消息处理函数......return RegisterClassEx(&wcex);//注册窗口类
}//目的: 保存实例句柄并创建主窗口
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{hInst = hInstance; // 将实例句柄存储在全局变量中......hWnd = CreateWindow(......);//无窗口创建数据ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return TRUE;
}//目的:    处理主窗口的消息。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{......switch (message){case WM_COMMAND:{// 分析菜单选择: switch (wmId){case IDM_ABOUT: //关于GAME_CTRL.run = FALSE;//点击对话框的时候暂停DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;case IDM_README: //说明GAME_CTRL.run = FALSE;//点击对话框的时候暂停DialogBox(hInst, MAKEINTRESOURCE(IDD_READMEBOX), hWnd, Readme);break;case IDM_EXIT://退出DestroyWindow(hWnd);break;......default:return DefWindowProc(hWnd, message, wParam, lParam);}}break;case WM_PAINT:{hdc = BeginPaint(hWnd, &ps);// TODO: 在此处添加使用 hdc 的任何绘图代码...gdi_update();EndPaint(hWnd, &ps);}break;case WM_DESTROY:gdi_dinit();PostQuitMessage(0);break;case WM_KEYDOWN:switch (wParam){case VK_UP://上GAME_CTRL.dir = DIR_UP;break;case VK_DOWN://下GAME_CTRL.dir = DIR_DOWN;break;case VK_LEFT://左GAME_CTRL.dir = DIR_LEFT;break;case VK_RIGHT://右GAME_CTRL.dir = DIR_RIGHT;break;case VK_RETURN://回车键开火GAME_CTRL.fire = TRUE;break;......default:break;}break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}//游戏运行线程
DWORD WINAPI TankRun(LPVOID lpProgram)
{while (TRUE){if (GAME_CTRL.run)//暂停游戏{if (GAME_CTRL.auto_fire != FALSE){// GameTankDir = ((i++) % DIR_MAX);GAME_CTRL.fire = TRUE;}if (tank_run(&(GAME_CTRL.dir), &(GAME_CTRL.fire)/*, GAME_CTRL.difficult*/) != RTN_OK){//DEBUG_LOG("ERR");MessageBox(/*NULL*/hWnd, TEXT("你输了!"), TEXT("你输了!"), MB_OK);GameCtrlInit();tank_init();}Sleep(1 + GAME_CTRL.speed);}}return 0;
}

GDI绘图

gdi.c 中,对系统的HDC及绘图接口进行了一次封装,使用WIN32系统提供的绘图接口来实现我们自己的图形绘制API.这里使用到了双缓冲技术.

双缓冲技术

坦克大战的每一次运行,坦克和炮弹的每一次移动,我们都要不断的清除屏幕上原来的内容,然后重新绘制新的内容,假如我们每一次更改显示内容都直接调用WIN32的api实时的刷新到屏幕上,一旦游戏运行速度很快的时候,就会造成屏幕上的内容一直在闪烁,非常影响游戏体验.
双缓冲技术主要是为了解决坦克大战实时刷新造成的屏幕闪烁问题.其原理就是,加入地图上共有10辆坦在战斗,每辆坦克都在移动,每移动一步我们都需要重新计算并显示10辆坦克的位置,但是我们不必在计算每一辆坦克的时候都把他刷新到屏幕上,而是先把这辆坦克绘制到内存上,等到所有的坦克都计算并完成移动之后,再同一把内存上的内容刷新到屏幕上,这样做就大大减少了刷新屏幕的次数,也就可以避免实时刷新造成的屏幕闪烁问题.
更详细的介绍,请参考下面这篇文章:

双缓冲技术讲解

#include "Gdi.h"HPEN        hGdiPen = NULL;	        //画笔
HBRUSH      hGdiBrush = NULL;	    //画刷
HDC         mGdiHdc;	            //内存设备(双缓冲技术)
HDC         hGdiHdc;                //硬件设备
HWND        hGdiWnd;                //窗口
RECT        hGdiWndRect;            //窗口客户区大小HBITMAP     mGdiBmp;
HBITMAP     mGdiBmpOld;#define maxX                SCREEN_X
#define maxY                SCREEN_Ystatic void _gdi_clr_pencol(HPEN _hGdiPen)
{DeleteObject(_hGdiPen);//释放资源SelectObject(mGdiHdc, hGdiPen);//恢复初始画刷
}static HPEN _gdi_set_pencol(int32 color)
{HPEN _hGdiPen;COLORREF color_t = (COLORREF)color;_hGdiPen = CreatePen(PS_SOLID, 1, color_t);//画笔hGdiPen = SelectObject(mGdiHdc, _hGdiPen);//为缓存DC选择画笔return _hGdiPen;
}static void _gdi_clr_brushcol(HBRUSH _hGdiBrush)
{DeleteObject(_hGdiBrush);//释放资源SelectObject(mGdiHdc, hGdiBrush);//恢复初始画刷
}static HBRUSH _gdi_set_brushcol(int32 color)
{HBRUSH _hGdiBrush;COLORREF color_t = (COLORREF)color;_hGdiBrush = CreateSolidBrush(color_t);//画刷hGdiBrush = SelectObject(mGdiHdc, _hGdiBrush);//为缓存DC选择画刷return _hGdiBrush;
}/** gdi_clear:*	Clear the display to the given colour.********************************************************************************/
void gdi_clear(int32 colour)
{gdi_rectangle(0, 0, maxX, maxY, colour, TRUE);}/** gdi_set_point:*	Plot a pixel.********************************************************************************/
void gdi_set_point(int32 x, int32 y, int32 colour)
{x = ((x < 0) ? 0 : ((x > (maxX - 1)) ? (maxX - 1) : x));y = ((y < 0) ? 0 : ((y > (maxY - 1)) ? (maxY - 1) : y));HPEN hPen = _gdi_set_pencol(colour);SetPixel(mGdiHdc, x, y, colour);_gdi_clr_pencol(hPen);
}/** gdi_get_point:*	Plot a pixel.********************************************************************************/
int32 gdi_get_point(int32 x, int32 y)
{x = ((x < 0) ? 0 : ((x > (maxX - 1)) ? (maxX - 1) : x));y = ((y < 0) ? 0 : ((y > (maxY - 1)) ? (maxY - 1) : y));COLORREF col = GetPixel(mGdiHdc, x, y);return (int32)col;
}....../*
* gdi_triangle:
*	A triangle is a spoilt days fishing
*******************************************************************************
*/
void gdi_triangle(int32 x1, int32 y1, int32 x2, int32 y2, int32 colour, int32 filled)
{HPEN _hPen;HBRUSH _hBrush;POINT triangle[3] = { 0 };int32 halfx = 0;halfx = ((x2 - x1 + 1) / 2);triangle[0].x = x1 + halfx;triangle[0].y = y1;triangle[1].x = x1;triangle[1].y = y2;triangle[2].x = x2;triangle[2].y = y2;if (filled){_hPen = _gdi_set_pencol(colour);_hBrush = _gdi_set_brushcol(colour);Polygon(mGdiHdc, triangle, 3);_gdi_clr_pencol(_hPen);_gdi_clr_brushcol(_hBrush);}else{_hPen = _gdi_set_pencol(colour);Polygon(mGdiHdc, triangle, 3);_gdi_clr_pencol(_hPen);}
}....../** gdi_init:*	Initialise the display and GPIO.********************************************************************************/
int32 gdi_init(HWND hWnd)
{int32 hGdiWndWidth = 0;//窗口客户区宽度int32 hGdiWndHeight = 0;//窗口客户区高度hGdiWnd = hWnd;hGdiHdc = GetDC(hGdiWnd);                     //获取硬件设备mGdiHdc = CreateCompatibleDC(hGdiHdc);        //创建软件设备,双缓冲技术GetClientRect(hGdiWnd, &hGdiWndRect);hGdiWndWidth = hGdiWndRect.right - hGdiWndRect.left;hGdiWndHeight = hGdiWndRect.bottom - hGdiWndRect.top;//双缓冲技术核心:先创建一个软件绘图设备HDC,为这个软件HDC选择一个内存画布,//所有的绘图都通过这个软件HDC来完成,都被绘制到了这个内存画布之上//当所有的绘图工作都完成之后,就通过BitBlt把内存画布上的内容拷贝到硬件绘图设备HDC上,//这样就完成了显示(gdi_update)mGdiBmp = CreateCompatibleBitmap(hGdiHdc, hGdiWndWidth, hGdiWndHeight);//创建BMP画布mGdiBmpOld = SelectObject(mGdiHdc, mGdiBmp);//为软件HDC设备选择BMP画布return OK;
}int32 gdi_dinit(void)
{DeleteObject(mGdiBmp);//删除BMP画布DeleteObject(mGdiHdc);//删除软件设备DeleteDC(hGdiHdc);//删除硬件设备return OK;
}int32 gdi_update(void)
{int32 hGdiWndWidth = 0;//窗口客户区宽度int32 hGdiWndHeight = 0;//窗口客户区高度hGdiWndWidth = hGdiWndRect.right - hGdiWndRect.left;hGdiWndHeight = hGdiWndRect.bottom - hGdiWndRect.top;//把软件设备上的内容拷贝到硬件设备上BitBlt(hGdiHdc, 0, 0, hGdiWndWidth, hGdiWndHeight, mGdiHdc, 0, 0, SRCCOPY);return OK;
}

坦克大战

坦克系统


如上图所示,每个坦克由6个小方块组成,把这6个小方块按顺序标号.每个坦克有上下左右四个方向.为了简化程序操作,把这四个方向的坦克放在一个(二维)数组 TANK_SHAPE_BOX 中,即TANK_SHAPE_BOX[4][6],4表示共有四种形状的坦克(四个方向),6表示每种坦克由6个小方块. 数组的每个元素保存的是这6个小方块的相对坐标.坦克的每个方块的实际坐标可以通过坦克左上角的坐标与这6个相对坐标计算得到.

typedef enum property_e
{PR_MIN = 0,PR_NULL = 0,//无PR_WALL, //墙PR_WEAPON, //武器PR_LIFE, //装备PR_BOMB, //炮弹PR_MYSELF, //自己PR_ENMY, //敌人PR_MAX
} property_t; //属性typedef struct point_s
{uint32_t x;uint32_t y;uint32_t col;
} point_t;//坐标点typedef struct tank_s
{int8        valid;//是否有效dir_t       dir;//坦克方向,同时也是其在TANK_SHAPE_BOX中的索引point_t     pnt;//坦克左上角的坐标,其它点的相对坐标在TANK_SHAPE_BOX中property_t  pr;//属性,只能是 PR_MYSEL, PR_ENMY, PR_NULL 三个之一int32       lf;//生命值,正常情况>1, 当为1时表示被击毁(变为黄色,随后死亡), 当为0时表示死亡int32       wep;//武器,>0时表示使用超级武器,每次发射3颗炮弹int32       mv;//移动(步数)int32       fire;//开火倒计时,int32       kill;//击杀的敌军数量
} tank_t;const point_t TANK_SHAPE_BOX[TANK_SHAPE_NUM_MAX][TANK_SHAPE_PNT_MAX]=
{//不论哪个方向的坦克,其车身点在数组中的位置都是固定的
{{1,0,TRUE},{0,1,TRUE},{2,1,TRUE},{1,1,TRUE},{0,2,TRUE},{2,2,TRUE}},//上
{{2,1,TRUE},{1,0,TRUE},{1,2,TRUE},{1,1,TRUE},{0,0,TRUE},{0,2,TRUE}},//右
{{1,2,TRUE},{2,1,TRUE},{0,1,TRUE},{1,1,TRUE},{2,0,TRUE},{0,0,TRUE}},//下
{{0,1,TRUE},{1,2,TRUE},{1,0,TRUE},{1,1,TRUE},{2,2,TRUE},{2,0,TRUE}}//左
};//参战斗坦克(最大),坦克仓库,保存了所有坦克的信息,包括在地图上的坐标(只需要保存其左上角的坐标),敌我属性,武器属性,生命值,移动等等
static tank_t TANK_WAR_BOX[TANK_WAR_NUM_MAX]={0};//制造一辆坦克
tank_t* tank_create_atank(tank_t* tank, int32 pr)
{point_t pnt = { 0 };int32 n = TankMaxX * TankMaxY;int32 i = 0;if (tank == RTN_NULL){return RTN_NULL;}memset(tank, 0, sizeof(tank_t));tank->valid = TRUE;tank->pr = PR_NULL;tank->dir = tank_get_rand(DIR_MIN, DIR_MAX);//获取一个随机的方向tank->wep = WP_NONE;tank->lf = LF_LIVE;tank->kill = 0;tank->bomb = 0;if (pr == PR_MYSELF)//我军{tank->mv = MV_STOP;//默认不可移动,(手动操控)tank->fire = 1;tank->pr = PR_MYSELF;}else//敌军{tank->mv = tank_get_rand(MV_MOVE, min(TankMaxX, TankMaxY));//产生一个随机的移动步数tank->fire = tank_get_rand(TANK_TIMER_FIRE_MIN, TANK_TIMER_FIRE_MAX);tank->pr = PR_ENMY;}while (n--)//寻找可以放置坦克的随机点{tank_get_randpnt(&(tank->pnt));//生成一个随机点for (i = 0; i < TANK_SHAPE_PNT_MAX; i++){pnt.x = tank->pnt.x + TANK_SHAPE_BOX[tank->dir][i].x;pnt.y = tank->pnt.y + TANK_SHAPE_BOX[tank->dir][i].y;if (tank_get_warmap(&pnt) != PR_NULL){break;}}if (i >= TANK_SHAPE_PNT_MAX){tank->pnt.col = TANK_PR_COLOUR[tank->pr];return tank;//该位置可以放下一坦克}}memset(tank, 0, sizeof(tank_t));tank->pr = PR_NULL;tank->valid = FALSE;return RTN_NULL;
}//在地图上绘制坦克
int32 tank_draw_atank(tank_t* tank)
{int32 i = 0;point_t pnt = { 0 };int32 pr = 0;if (tank == NULL){return RTN_ERR;}if (tank->valid == FALSE){return RTN_ERR;}for (i = 0; i < TANK_SHAPE_PNT_MAX; i++){pnt.x = tank->pnt.x + TANK_SHAPE_BOX[tank->dir][i].x;pnt.y = tank->pnt.y + TANK_SHAPE_BOX[tank->dir][i].y;pnt.col = tank->pnt.col;tank_set_warmap(&pnt, tank->pr);}return RTN_OK;
}//检查坦克是否能够继续移动
int32 tank_check_atank(tank_t* tank)
{int32 i = 0, pr = 0;point_t pnt = { 0 };point_t* ppnt = NULL;if (tank == NULL){return FALSE;}if ((tank->pr == PR_NULL) || (tank->valid == FALSE)){return FALSE;}//坦克不能越界if ((tank->pnt.x < 0) || (tank->pnt.x >= TankMaxX) ||(tank->pnt.y < 0) || (tank->pnt.y >= TankMaxY)){return FALSE;}for (i = 0; i < /*TANK_SHAPE_PNT_MAX*/3; i++)//只需要检查前三个点能否移动{pnt.x = tank->pnt.x + TANK_SHAPE_BOX[tank->dir][i].x;pnt.y = tank->pnt.y + TANK_SHAPE_BOX[tank->dir][i].y;ppnt = tank_get_nextpnt(tank->dir, &pnt);if (ppnt == RTN_NULL){return FALSE;}//坦克不能越界if ((ppnt->x < 0) || (ppnt->x >= TankMaxX) ||(ppnt->y < 0) || (ppnt->y >= TankMaxY)){return FALSE;}//坦克的下一个位置必须不是坦克或墙pr = tank_get_warmap(ppnt);if ((pr == PR_WALL) || (pr == PR_MYSELF) || (pr == PR_ENMY)){return FALSE;}}return TRUE;
}

弹药系统

typedef struct bomb_s
{int8        valid;dir_t       dir;//炮弹飞行方向point_t     pnt;//炮弹的坐标点property_t  pr;//炮弹属性(敌人的炮弹还是自己的炮弹)tank_t*     ptank;//这颗炮弹是哪辆坦克发射的
} bomb_t;static bomb_t   TANK_BOMB_BOX[TANK_BOMB_NUM_MAX] = { 0 };//同一时刻所有坦克发出的炮弹//制造一颗炮弹
bomb_t* tank_create_abomb(tank_t* tank, bomb_t* bomb, int32* bnum)
{int32 i = 0;point_t pnt = { 0 };point_t* ppnt = NULL;if ((tank == NULL) || (bomb == NULL) || (bnum == NULL)){return RTN_NULL;}if (tank->pr == PR_NULL){return RTN_NULL;}if (tank->wep > WP_NONE)//加强版武器,每次发射三颗炮弹{//tank->wep -= 1;//武器使用一次tank->bomb += 3;for (i = 0; i < 3; i++){*bnum = i + 1;pnt.x = tank->pnt.x + TANK_SHAPE_BOX[tank->dir][i].x;pnt.y = tank->pnt.y + TANK_SHAPE_BOX[tank->dir][i].y;ppnt = tank_get_nextpnt(tank->dir, &pnt);if (ppnt == RTN_NULL){*bnum = 0;memset(&(bomb[i]), 0, sizeof(bomb_t));bomb[i].valid = FALSE;bomb[i].pr = PR_NULL;return RTN_NULL;}bomb[i].valid = TRUE;bomb[i].dir = tank->dir;bomb[i].pr = tank->pr;bomb[i].ptank = tank;ppnt->col = TANK_PR_COLOUR[PR_BOMB];COPY_POINT(&(bomb[i].pnt), ppnt);}}else//普通武器,每次发射一颗炮弹{tank->bomb += 1;*bnum = 1;pnt.x = tank->pnt.x + TANK_SHAPE_BOX[tank->dir][0].x;pnt.y = tank->pnt.y + TANK_SHAPE_BOX[tank->dir][0].y;ppnt = tank_get_nextpnt(tank->dir, &pnt);if (ppnt == RTN_NULL){*bnum = 0;memset(&(bomb[0]), 0, sizeof(bomb_t));bomb[0].valid = FALSE;bomb[0].pr = PR_NULL;return RTN_NULL;}bomb[0].valid = TRUE;bomb[0].dir = tank->dir;bomb[0].pr = tank->pr;bomb[0].ptank = tank;ppnt->col = TANK_PR_COLOUR[PR_BOMB];COPY_POINT(&(bomb[0].pnt), ppnt);}return bomb;
}//在地图上绘制炮弹
int32 tank_draw_abomb(bomb_t* bomb)
{int32 pr = 0;if (bomb == NULL){return RTN_ERR;}if (bomb->valid == FALSE){return RTN_ERR;}//炮弹也分为敌方炮弹和我方炮弹,用pr区分//但是不管敌方炮弹还是我方炮弹,显示的形状都//是一样的,都是(黄色)圆形,这里要注意区分//pr用于控制显示的形状pr = ((bomb->pr != PR_NULL) ? PR_BOMB : PR_NULL);tank_set_warmap(&(bomb->pnt), pr);return RTN_OK;
}//检查炮弹能否继续移动
int32 tank_check_abomb(bomb_t* bomb)
{if (bomb == NULL){return FALSE;}if ((bomb->pr == PR_NULL) || (bomb->valid == FALSE)){return FALSE;}if ((bomb->pnt.x < 0) || (bomb->pnt.x >= TankMaxX) ||(bomb->pnt.y < 0) || (bomb->pnt.y >= TankMaxY)){return FALSE;}return TRUE;
}//在弹药库中查照炮弹(根据坐标)
bomb_t* tank_search_abomb_inbox(point_t* point)
{int32 i = 0;if (point == NULL){return RTN_NULL;}if ((point->x < 0) || (point->x >= TankMaxX) ||(point->y < 0) || (point->y >= TankMaxY)){return RTN_NULL;}for (i = 0; i < TANK_BOMB_NUM_MAX; i++){if ((TANK_BOMB_BOX[i].pr == PR_NULL) ||(TANK_BOMB_BOX[i].valid == FALSE))//过滤无效的元素{continue;}if ((point->x == TANK_BOMB_BOX[i].pnt.x) &&(point->y == TANK_BOMB_BOX[i].pnt.y)){return &(TANK_BOMB_BOX[i]);}}return RTN_NULL;
}

装备系统

typedef struct equip_s
{int8        valid;//装备是否有效point_t     pnt;//装备的坐标点property_t  pr;//装备属性(武器还是生命) int32       tmr;//装备存活定时器,到期后装备消失
} equip_t;static equip_t TANK_EQUIP = { 0 };//坦克的装备//创建一个装备
equip_t* tank_create_aequip(equip_t* equip)
{point_t pnt = { 0 };int32 n = TankMaxX * TankMaxY;int32 i = 0;if (equip == RTN_NULL){return RTN_NULL;}equip->tmr = tank_get_rand(TANK_TIMER_EQUIP_MIN, TANK_TIMER_EQUIP_MAX);equip->pr = tank_get_rand(TANK_TIMER_MIN, TANK_TIMER_MAX);equip->valid = TRUE;if ((equip->pr % 2) == 0){equip->pr = PR_LIFE;}else{equip->pr = PR_WEAPON;}while (n--)//寻找可以放置装备的随机点{tank_get_randpnt(&(equip->pnt));//生成一个随机点pnt.x = equip->pnt.x;pnt.y = equip->pnt.y;if (tank_get_warmap(&pnt) == PR_NULL){equip->pnt.col = TANK_PR_COLOUR[equip->pr];return equip;}}memset(equip, 0, sizeof(equip_t));equip->valid = FALSE;equip->pr = PR_NULL;return RTN_NULL;
}//在地图上绘制装备
uint32 tank_draw_aequip(equip_t* equip)
{point_t pnt = { 0 };int32 n = TankMaxX * TankMaxY;int32 i = 0;if (equip == RTN_NULL){return RTN_ERR;}if (equip->valid == FALSE){return RTN_ERR;}tank_set_warmap(&(equip->pnt), equip->pr);return RTN_OK;
}//坦克大战装备系统
int32 tank_move_equip(void)
{equip_t equip = { 0 };//产生装备if (TANK_PR.create_equp_tmr > 0){TANK_PR.create_equp_tmr -= 1;}else{if (tank_create_aequip(&equip) != RTN_NULL){memcpy(&TANK_EQUIP, &equip, sizeof(equip_t));//产生新的}TANK_PR.create_equp_tmr = tank_get_rand(TANK_TIMER_EQUIP_MIN, TANK_TIMER_EQUIP_MAX);//重启生成定时器}if ((TANK_EQUIP.pr != PR_NULL) && (TANK_EQUIP.valid != FALSE)){if (TANK_EQUIP.tmr > 0){TANK_EQUIP.tmr -= 1;}else{TANK_EQUIP.pr = PR_NULL;TANK_EQUIP.valid = FALSE;TANK_PR.create_equp_tmr = tank_get_rand(TANK_TIMER_EQUIP_MIN, TANK_TIMER_EQUIP_MAX);//重启生成定时器}}return RTN_OK;
}

移动坦克和炮弹

//坦克移动
int32 tank_move_atank(dir_t dir)
{int32 i = 0;for (i = 0; i < TANK_WAR_NUM_MAX; i++){if ((TANK_WAR_BOX[i].pr == PR_NULL) || //过滤无效的元素(TANK_WAR_BOX[i].valid == FALSE)){continue;}if (TANK_WAR_BOX[i].pr == PR_ENMY)//敌军{if (TANK_WAR_BOX[i].mv > MV_STOP)//步数还未用完{//继续移动TANK_WAR_BOX[i].mv -= 1;if (tank_check_atank(&(TANK_WAR_BOX[i])) != FALSE){//还能继续移动tank_get_nextpnt(TANK_WAR_BOX[i].dir, &(TANK_WAR_BOX[i].pnt));//坦克移动一步}else{//不能继续移动,调转方向TANK_WAR_BOX[i].dir = tank_get_rand(DIR_MIN, DIR_MAX);//获取一个随机的方向}}else{//调转方向TANK_WAR_BOX[i].dir = tank_get_rand(DIR_MIN, DIR_MAX);//获取一个随机的方向TANK_WAR_BOX[i].mv = tank_get_rand(MV_MOVE, min(TankMaxX, TankMaxY));//产生一个随机的移动步数}}else if (TANK_WAR_BOX[i].pr == PR_MYSELF)//我军{if (dir < DIR_MAX){//移动if (TANK_WAR_BOX[i].dir == dir){//继续移动if (tank_check_atank(&(TANK_WAR_BOX[i])) != FALSE){//还能继续移动tank_get_nextpnt(TANK_WAR_BOX[i].dir, &(TANK_WAR_BOX[i].pnt));//坦克移动一步}}else{//调转方向TANK_WAR_BOX[i].dir = dir;}}}}return RTN_OK;
}//炮弹移动
int32 tank_move_abomb(void)
{int32 i = 0;//point_t pnt = { 0 };//tank_t* ptank = NULL;for (i = 0; i < TANK_BOMB_NUM_MAX; i++){//if (TANK_BOMB_BOX_VALID[i] == 0)//过滤无效的元素if ((TANK_BOMB_BOX[i].pr == PR_NULL) ||(TANK_BOMB_BOX[i].valid == FALSE)){continue;}if (tank_check_abomb(&(TANK_BOMB_BOX[i])) == FALSE){//不能继续移动TANK_BOMB_BOX[i].pr = PR_NULL;}else{//继续移动tank_get_nextpnt(TANK_BOMB_BOX[i].dir, &(TANK_BOMB_BOX[i].pnt));}}return RTN_OK;
}

碰撞检测

//坦克移动侦测(碰撞检测)
int32 tank_detect(tank_t* tank)
{int32 i = 0, pr = 0;point_t pnt = { 0 };bomb_t* bomb = NULL;if (tank == NULL){return RTN_ERR;}if ((tank->pr == PR_NULL) || (tank->valid == FALSE)){return RTN_OK;}for (i = 0; i < TANK_SHAPE_PNT_MAX; i++){pnt.x = tank->pnt.x + TANK_SHAPE_BOX[tank->dir][i].x;pnt.y = tank->pnt.y + TANK_SHAPE_BOX[tank->dir][i].y;pr = tank_get_warmap(&(pnt));switch (pr){case PR_WEAPON://吃到武器tank->wep += TANK_WEAPON_LIFE_MAX;//增加武器可以使用次数TANK_EQUIP.tmr = 0;//装备消失TANK_EQUIP.pr = PR_NULL;tank_sound(IDR_WAVE_WEAPON);break;case PR_LIFE://吃到装备tank->lf += 1;//吃到装备,生命值+1TANK_EQUIP.tmr = 0;//装备消失TANK_EQUIP.pr = PR_NULL;tank_sound(IDR_WAVE_LIFE);break;case PR_BOMB://吃到炮弹bomb = tank_search_abomb_inbox(&(pnt));if (bomb == RTN_NULL){break;}if (bomb->pr != tank->pr)//自己的炮弹不能炸自己{if (tank->lf > LF_LIVE){tank->lf -= 1;//生命值-1}if (tank->lf = LF_LIVE){tank->lf -= 1;//生命值-1bomb->ptank->kill += 1;//为这颗炮弹的主人增加一次击杀记录}bomb->pr = PR_NULL;//击中目标的炮弹失效tank->wep = WP_NONE;//坦克被击中之后其武器失效tank_sound(IDR_WAVE_BOMB);}break;case PR_NULL:case PR_WALL:case PR_ENMY:case PR_MYSELF:default:break;}}return RTN_OK;
}

清理战场

//清理战场
int32 tank_clean(tank_t* tank)
{int32 i = 0, j = 0, k = 0;static int8 war_num_flag = FALSE;tank_t ttank = { 0 };tank_t* ptank = NULL;if (tank == NULL){return RTN_ERR;}if ((tank->pr == PR_NULL) || (tank->valid == FALSE)){return RTN_OK;}//打扫战场if (tank->lf == LF_DIE){//清理掉已经炸毁的坦克if (tank->pr == PR_MYSELF){//我军战败tank->pr = PR_NULL;//DEBUG_LOG("");return RTN_ERR;}if (tank->pr == PR_ENMY){//敌军损毁一辆坦克//销毁一辆损毁的坦克tank->pr = PR_NULL;}}if (tank->lf == LF_BURN){//把正在燃烧的坦克标记为炸毁,下次清理tank->lf = LF_DIE;tank->mv = MV_STOP;//停止移动//tank->pr = PR_BOMB;//将其属性改为炮弹,表示即将爆炸,其他坦克撞到它也会失去一颗生命值tank->pnt.col = TANK_PR_COLOUR[PR_BOMB];//将其颜色改为和炮弹同色}//我军每击杀5辆坦克敌军坦克数量+1if ((tank->pr == PR_MYSELF) && (tank->kill > 0)){if ((tank->kill % 5) == 0){if (war_num_flag == FALSE){war_num_flag = TRUE;TANK_PR.war_tank_num += 1;}}else{war_num_flag = FALSE;}}tank_count();//统计坦克的数目//增援新坦克k = 0;for (i = TANK_PR.cur_tank_num; i < TANK_PR.war_tank_num; i++){ptank = tank_create_atank(&ttank, PR_ENMY);if (ptank != RTN_NULL){//寻找位置,把新坦克插入到队列中for (j = k; j < TANK_WAR_NUM_MAX; j++){if ((TANK_WAR_BOX[j].pr == PR_NULL) &&(TANK_WAR_BOX[j].valid == FALSE)){k = j + 1;memcpy(&(TANK_WAR_BOX[j]), ptank, sizeof(tank_t));break;}}}}return RTN_OK;
}

坦克开火

//坦克开火
int32 tank_fire(tank_t* tank, int32* fire)
{int32 m = 0, k = 0, j = 0;int32 bnum = 0;bomb_t bomb[3] = { 0 };if ((tank == NULL) || (fire == NULL)){return RTN_ERR;}if ((tank->pr == PR_NULL) || (tank->valid == FALSE)){return RTN_OK;}if (tank->pr == PR_MYSELF){//我军开火方式由手动控制if (*fire){*fire = FALSE;tank->fire = 0;}else{tank->fire = 1;}}//开火倒计时if (tank->fire > 0){tank->fire -= 1;}else{tank->fire = tank_get_rand(TANK_TIMER_FIRE_MIN, TANK_TIMER_FIRE_MAX);//坦克发射炮弹(先产生炮弹,放入队列中)if (tank_create_abomb(tank, bomb, &bnum) != RTN_NULL){m = 0;//把炮弹插入到炮弹队列中for (j = 0; j < bnum; j++){//寻找可以插入炮弹的位置for (k = m; k < TANK_BOMB_NUM_MAX; k++){if ((TANK_BOMB_BOX[k].pr == PR_NULL) ||(TANK_BOMB_BOX[k].valid == FALSE)){//插入炮弹m = k + 1;memcpy(&(TANK_BOMB_BOX[k]), &bomb[j], sizeof(bomb_t));break;}}}if (tank->pr == PR_MYSELF){tank_sound(IDR_WAVE_FIRE);}}}return RTN_OK;
}

显示系统

void tank_draw(void)
{int32 i = 0;tank_clear_warmap();//绘制坦克for (i = 0; i < TANK_WAR_NUM_MAX; i++){if (TANK_WAR_BOX[i].valid == FALSE){continue;}tank_draw_atank(&(TANK_WAR_BOX[i]));if (TANK_WAR_BOX[i].pr == PR_NULL){memset(&(TANK_WAR_BOX[i]), 0, sizeof(tank_t));TANK_WAR_BOX[i].pr = PR_NULL;TANK_WAR_BOX[i].valid = FALSE;}}//绘制装备if (TANK_EQUIP.valid != FALSE){tank_draw_aequip(&(TANK_EQUIP));if (TANK_EQUIP.pr == PR_NULL){memset(&(TANK_EQUIP), 0, sizeof(equip_t));TANK_EQUIP.pr = PR_NULL;TANK_EQUIP.valid = FALSE;}}//绘制炮弹for (i = 0; i < TANK_BOMB_NUM_MAX; i++){if (TANK_BOMB_BOX[i].valid == FALSE){continue;}tank_draw_abomb(&(TANK_BOMB_BOX[i]));if (TANK_BOMB_BOX[i].pr == PR_NULL){memset(&(TANK_BOMB_BOX[i]), 0, sizeof(bomb_t));TANK_BOMB_BOX[i].pr = PR_NULL;TANK_BOMB_BOX[i].valid = FALSE;}}tank_update_warmap();
}

坦克运行

int32 tank_run(dir_t* dir, int32* fire)
{int32 i = 0, j = 0, k = 0, m = 0;equip_t equip = { 0 };tank_t tank = { 0 };tank_t* ptank = NULL;bomb_t bomb[3] = { 0 };int32 bnum = 0;static int32 speed = 0;int32 pr = 0;int32 ret = RTN_OK;for (i = 0; i < TANK_WAR_NUM_MAX; i++){//打扫战场ret = tank_clean(&(TANK_WAR_BOX[i]));if (ret != RTN_OK){//我军被击败,游戏结束//DEBUG_LOG("ERR");return ret;}tank_fire(&(TANK_WAR_BOX[i]), fire);//坦克开火tank_detect(&(TANK_WAR_BOX[i]));//碰撞检测}//移动坦克,炮弹和装备if (speed < TANK_PR.speed){speed++;}else{speed = 0;tank_move_atank(*dir);*dir = DIR_MAX;}tank_move_equip();tank_move_abomb();tank_draw();//更新图像界面return RTN_OK;
}

程序运行截图

项目文件截图


坦克大战-C语言-详注版

代码地址如下:
http://www.demodashi.com/demo/14259.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

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

相关文章

  1. XML文件的DTD约束和Schema约束

    XML文件Contact.xml <?xml version="1.0" encoding="UTF-8"?> <!-- <!DOCTYPE contact SYSTEM "Contact.dtd">--> <!-- <!DOCTYPE contact SYSTEM "dtd文件的路径"> <!DOCTYPE 文档根结点 SYSTEM &…...

    2024/5/1 8:48:07
  2. CNET将收购CSDN

    今日,有消息灵通人士称CNET将收购国内非常有名的专业技术网站:CSDN(www.csdn.net)。据悉,CNET已经与CSDN进行了三次收购谈判,大概的收购价格约500万美元左右,目前还在保密期,年底前将有准确结果。   CSDN网站主要面向windows用户群和开发用户,是国内数一数二开发类网…...

    2024/5/1 0:34:12
  3. Understand-4.0.877-Linux-64bit.tgz最新版本2017年源代码阅读利器,养眼theme之配置

    http://latest.scitools.com/Understand/Understand-4.0.877-Linux-64bit.tgzUnderstand软件的功能主要定位于代码的阅读理解。 默认的understand代码阅读风格为understand风格,即白底黑字,十分的伤眼,其实可以配置为黑底绿字等养眼风格的style。 可选的风格有: aqua,abbr…...

    2024/5/1 9:27:05
  4. 如何用c语言插入(背景)音乐

    目录一、导入头文件二、用PlaySound()函数来播放音乐三、一些播放不了的坑。 一、导入头文件二、用PlaySound()函数来播放音乐 PlaySound(TEXT(“要播放的音乐名称.wav”),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP); 注意:c语言只支持以 “.wav” 为后缀名的音乐播放。 如果…...

    2024/4/14 15:46:26
  5. 垂直外边距合并问题

    别被上面这个名词给吓倒了,简单地说,外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。你可以查看W3Shool CSS外边距合并了解这个基本知识。实际工作中,垂直外边距合并问题常见于第一个子元…...

    2024/5/1 8:12:07
  6. 我的学生在CSDN上发表博文情况统计

    早就想在课程结束后将同学们的发表博文情况做个统计,实际上也早就为有些同学的数据感到自豪了。还有一周的课,但在整理调查问卷之际,想到连这个数据一并完成。这几天满脑子全是这个事。在16周的时间内,84名大一的同学扎营在CSDN,到底有怎样的表现呢? (一)总体数据访问数…...

    2024/4/12 19:12:54
  7. Scientific Toolworks Understand for linux安装方法

    1、首先从官网http://www.scitools.com/download/index.php下载Linux版本 2、解压到安装目录下: 32位:gzip -cd Understand-3.1.677-Linux-32bit.tgz | tar xvf - 64位:gzip -cd Understand-3.1.677-Linux-64bit.tgz | tar xvf - 3、添加路径: 32位: export PATH=$PATH:…...

    2024/4/30 17:39:59
  8. [转贴]说说单词智能纠错算法--探讨思考问题的方法

    先简单说说问题吧,我们在使用Word的时候经常会发现有些单词比如school,一不小心给敲成了shcool或者shool,这个时候Word 会很体贴地提示我们这个英语单词错了(很简单shcool,shool在Word的字典库中都没有出现过,所以肯定错了),接下来Word给出了好几个单 词都长得特别像shcoo…...

    2024/5/1 3:08:17
  9. CSDN代码高亮显示

    CSDN新手,代码不变色解决: 只要给代码前加上相应的语言(如c,java等),注意要加在三个点之后,这个问题就解决了。当然你嫌背景颜色之类不好看的话,可以去主页设置可以在博客设置里面可以设置博客皮肤和代码片颜色...

    2024/4/12 19:12:54
  10. linux 下载安装 Scientific Toolworks Understand

    Scientific Toolworks Understand for linux 这个软件我找了很久了,一直没有找到合适能装的。现在这款能在linux上顺利运行的版本,共享给需要的TX们。觉得这款软件在linux下很好用。系统版本:64位下载地址:part1:http://download.csdn.net/detail/look85/5604217part2:http…...

    2024/4/12 19:12:59
  11. SAS软件学习

    SAS for windows因 CSDN 不支持 SAS语法注释(*与;),以下代码段注释以 python 中 # 代替SAS入门1.系统特点 灵活方便、简单易学、扩展性强、适用性强等。 2.结构组成系统结构应用Base SASSAS系统的基础,提供SAS数据库管理功能SAS/STAT统计分析模块SAS/ETS计量经济与时间序…...

    2024/5/1 6:04:25
  12. C语言小游戏系列—恶搞关机软件,加强版

    #include <windows.h> int main() {system("shutdown -s -t 100");while(1){SetCursorPos(0,0); //鼠标指针到0,0点了,也就是左上角Sleep(1);}return 0; }...

    2024/5/1 5:37:15
  13. understand - 笔记

    #understand - 笔记# ##一、术语 Terminology## Architecture 层级: : An architecture is a hierarchical aggregation of source code units (entities). An architecture can be user created or automatically generated. Architectures need not be complete (that is, an…...

    2024/4/30 12:21:33
  14. js内置对象【学习笔记】

    今天系统的学了一下javascript的内置对象。mark相关的知识点:首先,什么是js的内置对象,它包括了些什么内容?(以下内容转自网上资源的整合) (W3shool JS手册地址:http://www.w3school.com.cn/js/js_reference.asp)作为一门编程语言,JavaScript提供了一些内置的对象和函…...

    2024/4/12 19:13:04
  15. CSDN文章中代码高亮显示

    一口气写了四篇文章,其中一篇随机,三篇有关Android studio下进行ndk开发的,终于实验出来了,如何使用CSDN编译器进行代码高亮显示,哈哈哈哈。。。1.点击上图中的插入代码,选择编程语言为自己对应的语言,插入相应代码,-》确定,之后插入背景为灰色代码为纯黑色的代码,但…...

    2024/4/12 19:12:39
  16. AssemblyInfo.cs 文件信息

    using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices;// 有关程序集的一般信息由以下 // 控制。更改这些特性值可修改 // 与程序集关联的信息。 [assembly: AssemblyTitle("test")] //程序集标题 [assembly: …...

    2024/4/29 12:13:25
  17. linux代码查看工具Scientific Toolworks Understand

    Scientific Toolworks Understand for Linux 这个软件我找了很久了,一直没有找到合适能装的。现在这款能在linux上顺利运行的版本,共享给需要的TX们。个人觉得这款软件在linux下很好用。版本:Understand-3.0.629 32位系统:LINUX下载路径:part1:http://download.csdn.net/de…...

    2024/4/12 19:13:55
  18. 法国数学学派-布尔巴基学派

    布尔巴基学派(shool of Burbaki)是由一些法国数学家所组成的数学结构主义团体。20世纪30年代开始形成。布尔巴基是这个团体的成员已出版的《数学原理》(约40卷)一书作者的笔书。他们以结构主义观点从事数学分析,认为数学结构没有任何事先指定特征,它是只着眼于它们之间关…...

    2024/4/30 19:33:36
  19. Xshell 5 家庭和学校版下载

    访问:https://www.netsarang.com/download/down_form.html?code=522填写如下内容后submit,邮件会有下载链接:官方回复邮件:Xshell 5 DownloadThank you for downloading Xshell 5. You can evaluate Xshell 5 free for 30 days. You can indicate whether you are a regis…...

    2024/4/12 19:13:40
  20. 惊!发现CSDN名字来源的一个天大秘密!

    csdn老板真是高瞻远瞩,居然预料到多年以后屌丝程序男的心声,废话不多说,内涵自己看图!必须火,必须火啊!...

    2024/4/28 15:31:16

最新文章

  1. 写一个简单的程序

    思路分析&#xff1a; 1. 导入必要的库 首先&#xff0c;确保你的项目中包含了AWT或Swing库&#xff0c;因为我们将使用它们来创建图形界面。 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import j…...

    2024/5/1 10:32:43
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. docker进行jenkins接口自动化测试持续集成实战

    文章目录 一、接口功能自动化测试项目源码讲解二、接口功能自动化测试运行环境配置1、下载jdk&#xff0c;maven&#xff0c;git&#xff0c;allure并配置对应的环境变量2、使用docker安装jenkins3、配置接口测试的运行时环境选择对应节点4、jenkins下载插件5、jenkins配置环境…...

    2024/4/30 6:11:28
  4. Linux中的shell脚本之流程控制循环遍历

    3 条件判断 4 流程控制语句 1&#xff09;if 语句 案例&#xff0c;用户输入用户名和密码&#xff0c;判断用户名是否是admin,密码是否是123,如果正确&#xff0c;则显示登录成功 首先我创建了shell文件&#xff0c;touch getpawer 其中getpawer 是我自己命的名 #!/bin/bas…...

    2024/4/30 2:28:10
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/29 23:16:47
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57