热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

C++实现俄罗斯方块(windowsAPI)

这篇文章主要为大家详细介绍了C++实现俄罗斯方块,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文分享的这些俄罗斯方块代码是我最近放假在家里自己写的,虽然以前有过看别人写的代码,但是那个游戏代码好像不是很全面,因为无法实现全部的方块和实现随机的产生任意方向的方块,现在也基本上是忘光了当时的代码,下面的这些代码是我最近写的,没有参考其他人的代码,真正写俄罗斯方块起来感觉真的是挺难的,关键是在于方块的旋转。当然下面的代码仅仅是一个框架,只能够实现大致上的功能,还不全面,贴出来和大家交流学习。

编译器是code::block  +  MinGW ,感觉CB这个IDE真的是太强大,太棒了,下面的代码直接复制到VC里面运行应该不会出错,有个问题一直不知道怎么解决,就是更新客户区时窗口总是闪不知道有哪位达人能指点我一下。有的都是windows API写的,对windows编程还不是很懂,望大家多多留言,指点一下本人。

#include  
#include  
#include  
#include  
using namespace std; 
#define CellWidth 20 
#define MAP_WIDTH 12 
#define MAP_HEIGHT 18 
#define ID_TIMER 1 
class map_floor; 
class Block; 
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); 
/* Make the class name into a global variable */ 
char szClassName[ ] = "CodeBlocksWindowsApp"; 
int WINAPI WinMain (HINSTANCE hThisInstance, 
           HINSTANCE hPrevInstance, 
           LPSTR lpszArgument, 
           int nCmdShow) 
{ 
  HWND hwnd;        /* This is the handle for our window */ 
  MSG messages;      /* Here messages to the application are saved */ 
  WNDCLASSEX wincl;    /* Data structure for the windowclass */ 
 
  /* The Window structure */ 
  wincl.hInstance = hThisInstance; 
  wincl.lpszClassName = szClassName; 
  wincl.lpfnWndProc = WindowProcedure;   /* This function is called by windows */ 
  wincl.style = CS_DBLCLKS|CS_HREDRAW | CS_VREDRAW;         /* Catch double-clicks */ 
  wincl.cbSize = sizeof (WNDCLASSEX); 
 
  /* Use default icon and mouse-pointer */ 
  wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); 
  wincl.hIcOnSm= LoadIcon (NULL, IDI_APPLICATION); 
  wincl.hCursor = LoadCursor (NULL, IDC_ARROW); 
  wincl.lpszMenuName = NULL;         /* No menu */ 
  wincl.cbClsExtra = 0;           /* No extra bytes after the window class */ 
  wincl.cbWndExtra = 0;           /* structure or the window instance */ 
  /* Use Windows's default colour as the background of the window */ 
  wincl.hbrBackground =(HBRUSH) GetStockObject(WHITE_BRUSH);//COLOR_BACKGROUND; 
 
  /* Register the window class, and if it fails quit the program */ 
  if (!RegisterClassEx (&wincl)) 
    return 0; 
 
  /* The class is registered, let's create the program*/ 
  hwnd = CreateWindowEx ( 
      0,         /* Extended possibilites for variation */ 
      szClassName,     /* Classname */ 
      "Code::Blocks Template Windows App",    /* Title Text */ 
      WS_OVERLAPPEDWINDOW, /* default window */ 
      CW_USEDEFAULT,    /* Windows decides the position */ 
      CW_USEDEFAULT,    /* where the window ends up on the screen */ 
      CW_USEDEFAULT,         /* The programs width */ 
      CW_USEDEFAULT,         /* and height in pixels */ 
      NULL,    /* The window is a child-window to desktop */ 
      NULL,        /* No menu */ 
      hThisInstance,    /* Program Instance handler */ 
      NULL         /* No Window Creation data */ 
      ); 
 
  /* Make the window visible on the screen */ 
  ShowWindow (hwnd, nCmdShow); 
 
  /* Run the message loop. It will run until GetMessage() returns 0 */ 
  while (GetMessage (&messages, NULL, 0, 0)) 
  { 
    /* Translate virtual-key messages into character messages */ 
    TranslateMessage(&messages); 
    /* Send message to WindowProcedure */ 
    DispatchMessage(&messages); 
  } 
 
  /* The program return-value is 0 - The value that PostQuitMessage() gave */ 
  return messages.wParam; 
} 
 
enum{e_LINE,e_CORNER,e_STAIR,e_TANCK,e_TIAN}; 
const int TOTAL_BLOCK_STYLE = 5;//方块类型有4种 
class Block 
{ 
  public: 
      Block(int x = 100, int y = 100); 
      Block(const Block & rh)//复制构造函数,可能没什么用,但是还是定义它吧 
      { 
        this->m_style = rh.m_style; 
        this->m_direct = rh.m_direct; 
        for(int i = 0 ; i <4 ; i ++) 
          this->m_block[i] = rh.m_block[i]; 
      } 
      Block & operator = (const Block& rh)//重载=号,实现方块的赋值 
      { 
        this->m_style = rh.m_style; 
        this->m_direct = rh.m_direct; 
        for(int i = 0 ; i <4 ; i ++) 
          this->m_block[i] = rh.m_block[i]; 
        return *this; 
      } 
      ~Block(){} 
  int   create_block(int x = 100 , int y = 100); 
  //显示在游戏区内移动的方块 
  int   show_block(HDC hdc,const POINT& GameLeftTop); 
  //显示将要出现的方块,即游戏区左边的方块 
  int   show_next_block(HDC hdc); 
  //旋转,该函数比较难实现,代码量也比较大,以后有时间在慢慢优化,关于解析看定义处 
  int   rotate(); 
  //产生随机方块 
  int   random_block(); 
 
  //下面为方块移动的成员函数 
  int   get_block_height(){ return m_block[1].y;} 
  int   move_down(const RECT& GameClient); 
  int   move_left(const RECT& GameClient); 
  int   move_right(const RECT& GameClient); 
  int   move_up(const RECT& GameClient); 
  int   move_to(int x , int y); 
  //检测方块是否在游戏区内 
//  int   check_block(const map_floor& map, const RECT& GameClent); 
  int   check_block(const map_floor& map, const POINT& LeftTopScrCdnt); 
  int   print_to_map(map_floor& map , const POINT& LeftTopScrCdnt); 
  private: 
  int   m_style;//方块的风格样式,具体看定义的枚举变量 
  int   m_direct;//方块的方向,是对m_style的具体数据 
 POINT   m_block[4];//下标为1的方块是中心坐标,旋转都是围绕着该方块进行,这样可以利于旋转和逻辑清晰 
}; 
class map_floor 
{ 
  public: 
    map_floor() 
    { 
      ZeroMemory(m_block_bar,sizeof(int )*12*18); 
    } 
    ~map_floor(){} 
  void show_block_bar(HDC hdc , const POINT& LeftTopScrCdnt) 
  { 
    for(int i = 0 ; i = MAP_WIDTH || y >= MAP_HEIGHT)//不用检测y <0 的情况 
    return 0; 
    if(y <0) continue; 
    if(map.m_block_bar[y][x]) 
    return 0; 
  } 
  return 1; 
} 
int Block::move_down(const RECT& GameClient)//下移,由计时器消息调用 
{ 
  int i; 
//  for (i = 0 ; i <4 ; i ++ ) 
//  { 
//   if(m_block[i].y == GameClient.bottom - CellWidth) 
//   return 0; 
//  } 
  for (i = 0; i <4 ;i ++ ) 
  { 
    m_block[i].y += CellWidth; 
  } 
  return 1; 
} 
int Block::move_up(const RECT& GameClient) 
{ 
  move_to(m_block[1].x,m_block[1].y - CellWidth); 
  return 1; 
} 
int Block::move_left(const RECT& GameClient) 
{ 
  move_to(m_block[1].x - CellWidth,m_block[1].y); 
  return 1; 
} 
int Block::move_right(const RECT& GameClient) 
{ 
  move_to(m_block[1].x + CellWidth , m_block[1].y); 
  return 1; 
} 
int Block::create_block(int x , int y) 
{ 
  m_block[1].x = x; 
  m_block[1].y = y; 
  random_block(); 
  rotate(); 
  return 1; 
} 
int Block::move_to(int x , int y) 
{ 
  int Vx = x - m_block[1].x; 
  int Vy = y - m_block[1].y; 
  for(int i = 0 ; i <4 ; i ++) 
  { 
    m_block[i].x += Vx; 
    m_block[i].y += Vy; 
  } 
} 
int Block::print_to_map(map_floor& map , const POINT& LeftTopScrCdnt) 
{ 
  int x , y; 
  int i , j; 
  for(i = 0 ; i <4 ; i ++ ) 
  { 
    x = (m_block[i].x - LeftTopScrCdnt.x)/CellWidth; 
    y = (m_block[i].y - LeftTopScrCdnt.y)/CellWidth; 
    if(x<0 || x >= MAP_WIDTH || y <0 || y >= MAP_HEIGHT)//为保安全 ,测试之用,完成后将被注释掉 
      return 0; 
    map.m_block_bar[y][x] = 1 ; 
    for(j = 0 ; j = 0 ; j --) 
    { 
      if(map.m_block_bar[j][i] != 5) 
      { 
        map.m_block_bar[idx--][i] = map.m_block_bar[j][i]; 
      } 
    } 
    while(idx >= 0) 
    { 
      map.m_block_bar[idx--][i] = 0; 
    } 
  } 
  return 1; 
} 
 
//下面该函数功能是实现方块旋转,可以说是整个【俄罗斯方块】的难点所在,也是其核心部分 
//方块用以数组block【4】表示,其余3个方格都将围绕block【1】旋转,方块由于有不对称方块 
//存在,我原本是要分7种,但是后面代码量太大了,所以我将方块根据样式归为了四种,分别是: 
// 
//e_LINE 线形   就是一条线的那个,这个是对称的方块,只需分两个方向分别为横向和纵向,方向 
//        用m_direct保持,其他的方块一样 
// 
//e_TANCK 坦克形 这个是方块是对称的,分四种方向,根据m_direct对4进行求余的方法可以大大缩减 
//        代码量,对于下面两种方块也是利用了求余的方式化简许多,才使得代码不会那么冗余, 
//        这是后面我才想到的方法。 
// 
//e_STAIR 楼梯形 这个方块相对前面两种来说有点难度,主要是因为它不是对称的,但是相对下面的这种 
//        来说比较简单,原本我没用对m_direct求余的方法时,我将它分为了e_STAIR_BACK和e_STAIR_FRONT 
//        两类来讨论的,后面发现代码可以缩减才将其归为一类只要记住block【0】和block【1】的位置不会 
//        变化,变化的是block【2】和block【3】,block【2】相对block【1】上移或下移,x坐标与block【1】 
//        相同,block【3】.y一直在block【1】下面一行,相对其左右变化 
// 
//e_CORNER 角形 这个方块个人觉得是最难旋转的方块,与上面一种异样,原本我将它分为e_CORNER_FRONT , e_CORNER_BACK 
//        两类,每类有四个方向的变化,后来根据求余可以将同一个方向的变化变为一种,只是block【3】号方块要 
//        根据m_direct方向来进行调整 
 
int Block::rotate() 
{ 
      switch (m_style) 
      { 
        case e_LINE: 
        { 
          switch(m_direct) 
          { 
            case 0://横向转为纵向 
            { 
              for(int i = 0 ; i <4 ; i ++) 
                { 
                  m_block[i].x = m_block[1].x; 
                  m_block[i].y = m_block[1].y + (1-i)*CellWidth; 
                } 
              m_direct = 1; 
            } 
              break; 
            case 1://纵向转为横向 
            { 
              for(int i = 0 ; i <4 ; i ++) 
              { 
                  m_block[i].y = m_block[1].y; 
                  m_block[i].x = m_block[1].x + (1-i)*CellWidth; 
              } 
              m_direct = 0; 
            } 
              break; 
          } 
        } 
          break; 
        //下面为楼梯风格的方块,由于其不是对称的分类为正反两种,正反种风格各有两种变化, 
        //m_direct% == 0是正反两面的同种变化 
        case e_STAIR: 
        { 
          int flag; 
          flag = m_direct <2 &#63; 1 : -1; 
          m_block[0].x = m_block[1].x + flag*CellWidth; 
          m_block[0].y = m_block[1].y; 
          m_block[2].x = m_block[1].x; 
          m_block[3].y = m_block[1].y + CellWidth; 
          if(m_direct%2 == 0) 
          { 
            m_block[2].y = m_block[1].y - CellWidth; 
            m_block[3].x = m_block[1].x + flag*CellWidth; 
            m_direct++; 
          } 
          else 
          { 
            m_block[2].y = m_block[1].y + CellWidth; 
            m_block[3].x = m_block[1].x - flag*CellWidth; 
            if(m_direct <2) m_direct = 0; 
            else       m_direct = 2; 
          } 
        } 
          break; 
        //角形方块,与楼梯形方块一样非对称,有正反俩个种,每种有四种变化, 
        //下面根据m_direct%4的值将这些变化归类解决,对于正,反面对应的相同 
        //变化的方向,只有block【3】方格位置不一样,可以看我画的图对比即可了解 
        case e_CORNER: 
        { 
          switch (m_direct%4) 
          { 
            case 0: 
            { 
              m_block[0].x = m_block[1].x+CellWidth; 
              m_block[0].y = m_block[2].y = m_block[1].y; 
              m_block[2].x = m_block[1].x-CellWidth; 
              m_block[3].x = m_block[1].x-CellWidth; 
              if(m_direct>=4) m_block[3].y = m_block[1].y-CellWidth; 
              else       m_block[3].y = m_block[1].y+CellWidth; 
              m_direct ++; 
            } 
              break; 
            case 1: 
            { 
              m_block[0].x = m_block[2].x = m_block[1].x; 
              m_block[0].y = m_block[1].y+CellWidth; 
              m_block[2].y = m_block[1].y-CellWidth; 
              if(m_direct>=4)   m_block[3].x = m_block[1].x+CellWidth; 
              else       m_block[3].x = m_block[1].x-CellWidth; 
              m_block[3].y = m_block[1].y-CellWidth; 
              m_direct ++; 
            } 
              break; 
            case 2: 
            { 
              m_block[0].x = m_block[1].x-CellWidth; 
              m_block[0].y = m_block[2].y = m_block[1].y; 
              m_block[2].x = m_block[1].x+CellWidth; 
              m_block[3].x = m_block[1].x+CellWidth; 
              if (m_direct>=4)  m_block[3].y = m_block[1].y+CellWidth; 
              else       m_block[3].y = m_block[1].y-CellWidth; 
 
              m_direct ++; 
            } 
              break; 
            case 3: 
            { 
              m_block[0].x = m_block[2].x = m_block[1].x; 
              m_block[0].y = m_block[1].y-CellWidth; 
              m_block[2].y = m_block[1].y+CellWidth; 
              if(m_direct>=4)  { m_block[3].x = m_block[1].x-CellWidth; m_direct = 4;} 
              else       { m_block[3].x = m_block[1].x+CellWidth; m_direct = 0;} 
              m_block[3].y = m_block[1].y+CellWidth; 
            } 
              break; 
            default: 
              break; 
          } 
 
        } 
          break; 
        case e_TANCK://坦克形方块,与线形方块一样是对称的,分四种变化 
        { 
          switch (m_direct%2) 
          { 
            case 0: 
            { 
              m_block[0].x = m_block[2].x = m_block[1].x; 
              m_block[0].y = m_block[1].y - CellWidth; 
              m_block[2].y = m_block[1].y + CellWidth; 
              int flag = m_direct == 0 &#63; 1 : -1; 
              m_block[3].x = m_block[1].x + flag*CellWidth; 
              m_block[3].y = m_block[1].y; 
              m_direct++; 
            } 
              break; 
            case 1: 
            { 
              m_block[0].y = m_block[2].y = m_block[1].y; 
              m_block[0].x = m_block[1].x - CellWidth; 
              m_block[2].x = m_block[1].x + CellWidth; 
              m_block[3].x = m_block[1].x; 
              int flag = m_direct == 3 &#63; -1:1; 
              m_block[3].y = m_block[1].y + flag*CellWidth; 
              if(m_direct == 3) m_direct = 0; 
              else m_direct++; 
 
            } 
              break; 
            default: 
              break; 
          } 
 
        } 
          break; 
        case e_TIAN: 
        { 
          m_block[0].y = m_block[1].y; 
          m_block[0].x = m_block[1].x + CellWidth; 
          m_block[2].x = m_block[1].x; 
          m_block[2].y = m_block[1].y + CellWidth; 
          m_block[3].x = m_block[1].x + CellWidth; 
          m_block[3].y = m_block[1].y + CellWidth; 
        } 
          break; 
 
        default: 
          break; 
      } 
 
        return 0; 
} 
int Block::show_block(HDC hdc,const POINT& GameLeftTop) 
{ 
  for (int i = 0 ; i <4 ; i ++ ) 
  { 
    if(m_block[i].y >= GameLeftTop.y) 
      Rectangle(hdc,m_block[i].x,m_block[i].y,m_block[i]. 
           x+CellWidth,m_block[i].y+CellWidth); 
    if(i==0)//测试所用,完成后将会被注释掉 
    {MoveToEx(hdc,m_block[i].x,m_block[i].y,NULL); 
    LineTo(hdc,m_block[i].x+CellWidth,m_block[i].y+CellWidth);} 
 
  } 
  return 1; 
} 
int Block::show_next_block(HDC hdc) 
{ 
   for (int i = 0 ; i <4 ; i ++ ) 
  { 
 
    Rectangle(hdc,m_block[i].x,m_block[i].y,m_block[i]. 
           x+CellWidth,m_block[i].y+CellWidth); 
  } 
  return 1; 
} 
Block block , next_block , try_block; 
map_floor map;int d = 0; 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
   HDC     hdc ; 
   PAINTSTRUCT ps ; 
   //游戏客户区 
   static RECT GameClient; 
   //一个方格的像素为CellWidth = 20 游戏区宽 12 个方格 高 18 个方格 
   const int  Width = 240 ,Height = 360; 
   static POINT LeftTopScrCdnt;//游戏区得左上角坐标 
 
   switch (message) 
   { 
   case WM_CREATE: 
     SetTimer(hwnd,ID_TIMER,500,NULL); 
     return 0 ; 
   case WM_SIZE: 
     GetClientRect(hwnd,&GameClient); 
     LeftTopScrCdnt.x = (GameClient.right-GameClient.left)/2 - Width/2; 
     LeftTopScrCdnt.y = GameClient.top + 50; 
     GameClient.left  = LeftTopScrCdnt.x; 
     GameClient.top  = LeftTopScrCdnt.y; 
     GameClient.right = LeftTopScrCdnt.x + Width; 
     GameClient.bottom = LeftTopScrCdnt.y + Height; 
     //创建下一个将要出现的方块 
     next_block.create_block(GameClient.right+2*CellWidth,(GameClient.bottom+GameClient.top)/2-3*CellWidth); 
     block.move_to((GameClient.right+GameClient.left)/2,GameClient.top-CellWidth); 
 
     break; 
   case WM_TIMER: 
     block.move_down(GameClient); 
     if(!block.check_block(map,LeftTopScrCdnt))//检测方块的碰撞,如果则说明方块到底底部,将其上移然后打印进地图 
     { 
       block.move_up(GameClient); 
       if(!block.check_block(map,LeftTopScrCdnt) || 
         block.get_block_height() <= LeftTopScrCdnt.y )//检测游戏是否结束 
         { 
           KillTimer(hwnd,ID_TIMER); 
           d = 4; 
         } 
       block.print_to_map(map,LeftTopScrCdnt); 
       SendMessage(hwnd,WM_KEYDOWN,VK_ESCAPE,0); 
     } 
     InvalidateRect(hwnd,NULL,true); 
     break; 
   case WM_PAINT: 
     hdc = BeginPaint (hwnd, &ps) ; 
     MoveToEx(hdc,LeftTopScrCdnt.x,LeftTopScrCdnt.y,NULL); 
     Rectangle(hdc,GameClient.left,GameClient.top,GameClient.right,GameClient.bottom);//游戏区边框 
     SelectObject(hdc,GetStockObject(BLACK_BRUSH)); 
     map.show_block_bar(hdc,LeftTopScrCdnt); 
     block.show_block(hdc,LeftTopScrCdnt); 
     next_block.show_next_block(hdc); 
     EndPaint (hwnd, &ps); 
     break; 
   case WM_KEYDOWN: 
     InvalidateRect(hwnd,NULL,true); 
     switch (wParam) 
     { 
      case VK_SPACE: 
      { 
        try_block = block; 
        try_block.rotate(); 
        if(try_block.check_block(map ,LeftTopScrCdnt)) 
          block = try_block; 
        break; 
      } 
      case VK_LEFT: 
      { 
        block.move_left(GameClient); 
        if(!block.check_block(map ,LeftTopScrCdnt)) 
          block.move_right(GameClient); 
      } 
        break; 
      case VK_RIGHT: 
      { 
        block.move_right(GameClient); 
        if (!block.check_block(map ,LeftTopScrCdnt)) 
          block.move_left(GameClient); 
      } 
        break; 
      case VK_DOWN: 
      { 
//        block.move_down(GameClient); 
         SendMessage(hwnd,WM_TIMER,0,0); 
      } 
        break; 
 
      case VK_ESCAPE://测试用,完成后将会被注释掉 
      { 
        block = next_block; 
        next_block.create_block(GameClient.right+2*CellWidth,(GameClient.bottom+GameClient.top)/2-3*CellWidth); 
        block.move_to((GameClient.right+GameClient.left)/2,GameClient.top-CellWidth); 
      } 
        break; 
      default: 
        break; 
     } 
     break; 
   case WM_DESTROY: 
     PostQuitMessage (0) ; 
     return 0 ; 
   } 
   return DefWindowProc (hwnd, message, wParam, lParam) ; 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • 信息安全等级保护是指对国家秘密信息、法人和其他组织及公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的信息安全产品实 ... [详细]
  • 无线认证设置故障排除方法及注意事项
    本文介绍了解决无线认证设置故障的方法和注意事项,包括检查无线路由器工作状态、关闭手机休眠状态下的网络设置、重启路由器、更改认证类型、恢复出厂设置和手机网络设置等。通过这些方法,可以解决无线认证设置可能出现的问题,确保无线网络正常连接和上网。同时,还提供了一些注意事项,以便用户在进行无线认证设置时能够正确操作。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
author-avatar
高高G0623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有