C++语言VC6.0环境下俄罗斯方块游戏的实现

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的在这里插入代码片#include <windows.h>
#include <stdio.h>
#include <time.h>

#define CELL 20
#define ROWS 25
#define COLS 15
//升级所需分数值
#define SCORE_LEVEL_INC 80
#define ID_TIMER 1

/////////////////全局变量/////////////////////////////
HWND hwnd; //保存窗口句柄

int score=0; //分数
int level=0; //级数
int interval_unit=25; //随级数递增的时间间隔增量
int interval_base=300; //时间间隔基量
int old_interval; //保存当前的时间间隔,用于加速操作

int cur_left,cur_top; //记录方块当前的位置
int width_block,height_block; //方块的宽带和高度

bool isPause=false; //暂停标识
UINT timer_id=0; //保存计时器ID

static byte *block=NULL; //方块,方块为随机大小,采用动态分配内存方式,所以这里是指针变量
byte g_panel[ROWS][COLS]={0};
////////////////////////////////////////////////////
LRESULT CALLBACK WndProc ( HWND,UINT,WPARAM,LPARAM );
void DrawPanel ( HDC hdc ); //绘制表格
void RefreshPanel ( HDC hdc ); //刷新面板
void DoDownShift ( HDC hdc ); //下移
void DoLeftShift ( HDC hdc ); //左移
void DoRightShift ( HDC hdc ); //右移
void DoAccelerate ( HDC hdc ); //加速
void DoRedirection ( HDC hdc ); //改变方向
void ClearRow ( HDC hdc ); //消行
bool ExportBlock(); //输出方块,
//该函数会直接修改全局变量block,width_block,height_block,
//cur_left和cur_top
bool IsTouchBottom ( HDC hdc ); //判断是否到达底部

int main()
{
HINSTANCE hInstance=GetModuleHandle ( NULL );
TCHAR szAppName[]=TEXT ( “teris” );
MSG msg;
WNDCLASS wc;

wc.style=CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon ( NULL,IDI_APPLICATION );
wc.hCursor=LoadCursor ( NULL,IDC_ARROW );
wc.hbrBackground= ( HBRUSH ) GetStockObject ( WHITE_BRUSH );
wc.lpszMenuName=NULL;
wc.lpszClassName=szAppName;
if ( !RegisterClass ( &wc ) )
{
    printf ( "RegisterClass occur errors!" );
    return 0;
}
hwnd=CreateWindow ( szAppName,TEXT ( "Teris Demo" ),
                    WS_OVERLAPPEDWINDOW,
                    0,0,0,0,
                    NULL,
                    NULL,
                    hInstance,
                    NULL );
ShowWindow ( hwnd,SW_SHOW );
UpdateWindow ( hwnd );
while ( GetMessage ( &msg,NULL,0,0 ) )
{
    TranslateMessage ( &msg );
    DispatchMessage ( &msg );
}
return msg.wParam;

}

void DrawPanel ( HDC hdc ) //绘制游戏面板
{
int x,y;
RECT rect;

for ( y=0; y<ROWS; y++ )
{
    for ( x=0; x<COLS; x++ )
    {
        //计算方块的边框范围
        rect.top=y*CELL+1;
        rect.bottom= ( y+1 ) *CELL-1;
        rect.left=x*CELL+1;
        rect.right= ( x+1 ) *CELL-1;
        FrameRect ( hdc,&rect, ( HBRUSH ) GetStockObject ( BLACK_BRUSH ) );
    }
}

}

void DoDownShift ( HDC hdc ) //下移
{
if ( NULL==block ) return;

//判断是否到达底部
if ( IsTouchBottom ( hdc ) )    //到底部
{
    //消行处理
    ClearRow ( hdc );
    ExportBlock();      //输出下一个方块
}

cur_top++;
RefreshPanel ( hdc );

}

void DoLeftShift ( HDC hdc ) //左移
{
int x,y;
if ( NULL==block ) return;

if ( 0==cur_left ) return;
if ( cur_top<0 ) return; //方块没有完整显示前,不能左移
for ( y=0; y<height_block; y++ )
{
    for ( x=0; x<width_block; x++ )          //从左边开始扫描,获取该行最左边的实心方格块
    {
        if ( * ( block+y*width_block+x ) )
        {
            //判断当前方格在面板上面左边一个方格是否为实心,是就代表不能再左移
            if ( g_panel[cur_top+y][cur_left+x-1] ) return;

            break;      //只判断最左边的一个实心方格,之后直接扫描下一行
        }
    }
}
cur_left--;
RefreshPanel ( hdc );

}

void DoRightShift ( HDC hdc ) //右移
{
int x,y;
if ( NULL==block ) return;

if ( COLS-width_block==cur_left ) return;
if ( cur_top<0 ) return;     //方块完整显示前不能右移
for ( y=0; y<height_block; y++ )
{
    for ( x=width_block-1; x>=0; x-- )   //从右边开始扫描,获取该行最右边的实心方格块
    {
        if ( * ( block+y*width_block+x ) )
        {
            //判断当前方格在面板上右边一个方格是否为实心,是就代表不能再右移
            if ( g_panel[cur_top+y][cur_left+x+1] ) return;

            break;      //只判断最右边的一个实心方格
        }
    }
}
cur_left++;
RefreshPanel ( hdc );

}

void DoRedirection ( HDC hdc ) //改变方向
{
int i,j;
byte * temp=NULL;
if ( NULL==block ) return;
if ( cur_top<0 ) return; //方块完整显示前不能转向

temp= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
for ( i=0; i<width_block; i++ )
{
    for ( j=0; j<height_block; j++ )
    {
        //temp[i][j]=block[height_block-j-1][i];
        * ( temp+i*height_block+j ) =* ( block+ ( height_block-j-1 ) *width_block+i );
    }
}

//给方块重新定位
int incHeight=width_block-height_block;
int incWidth=height_block-width_block;
int temp_cur_top=cur_top-incHeight/2;
int temp_cur_left=cur_left-incWidth/2;

//system("cls");
//printf("temp_top=%d, temp_left=%d",temp_cur_top,temp_cur_left);

//判断当前空间是否足够让方块改变方向
int max_len=max ( width_block,height_block );
//防止下标访问越界
if ( temp_cur_top+max_len-1>=ROWS||temp_cur_left<0||temp_cur_left+max_len-1>=COLS )
{
    free ( temp );      //退出前必须先释放内存
    return;
}
for ( i=0; i<max_len; i++ )
{
    for ( j=0; j<max_len; j++ )
    {
        //转向所需的空间内有已被占用的实心方格存在,即转向失败
        if ( g_panel[temp_cur_top+i][temp_cur_left+j] )
        {
            free ( temp );      //退出前必须先释放内存
            return;
        }
    }
}

//把临时变量的值赋给block,只能赋值,而不能赋指针值
for ( i=0; i<height_block; i++ )
{
    for ( j=0; j<width_block; j++ )
    {
        //block[i][j]=temp[i][j];
        * ( block+i*width_block+j ) =* ( temp+i*width_block+j );
    }
}

//全局变量重新被赋值
cur_top=temp_cur_top;
cur_left=temp_cur_left;
//交换
i=width_block;
width_block=height_block;
height_block=i;

free ( temp );      //释放为临时变量分配的内存
RefreshPanel ( hdc );

}

void DoAccelerate ( HDC hdc ) //加速
{
if ( NULL==block ) return;

if ( IsTouchBottom ( hdc ) )
{
    //消行处理
    ClearRow ( hdc );
    ExportBlock();
}
cur_top++;
RefreshPanel ( hdc );

}

bool IsTouchBottom ( HDC hdc )
{
int x,y;
int i,j;

if ( NULL==block ) return false;
if ( ROWS==cur_top+height_block )
{
    //固定方块
    for ( i=0; i<height_block; i++ )
    {
        for ( j=0; j<width_block; j++ )
        {
            if ( * ( block+i*width_block+j ) ) g_panel[cur_top+i][cur_left+j]=1;
        }
    }
    return true;
}
for ( y=height_block-1; y>=0; y-- )          //从底行开始扫描
{
    //判断第一个实心方块在面板上邻接的下方方格是否为实心,是就代表已经到达底部
    for ( x=0; x<width_block; x++ )
    {
        if ( * ( block+y*width_block+x ) )
        {
            if ( cur_top+y+1<0 ) return false;
            if ( g_panel[cur_top+y+1][cur_left+x] )
            {
                //判断是否gameover
                if ( cur_top<=0 )
                {
                    if ( timer_id )
                    {
                        KillTimer ( hwnd,ID_TIMER );
                        timer_id=0;
                    }
                    MessageBox ( hwnd,TEXT ( "游戏结束" ),TEXT ( "MSG" ),MB_OK|MB_ICONEXCLAMATION );
                    SendMessage ( hwnd,WM_CLOSE,0,0 );
                }
                //
                //固定方块
                for ( i=0; i<height_block; i++ )
                {
                    for ( j=0; j<width_block; j++ )
                    {
                        if ( * ( block+i*width_block+j ) ) g_panel[cur_top+i][cur_left+j]=1;
                    }
                }
                return true;
            }
        }
    }
}
return false;

}

void ClearRow ( HDC hdc ) //消行
{
int i,j,k;
int count=0; //消行次数
bool isFilled;
//消行处理
for ( i=ROWS-1; i>=0; i-- )
{
isFilled=true;
for ( j=0; j<COLS; j++ )
{
if ( !g_panel[i][j] )
{
isFilled=false;
break;
}
}
if ( isFilled )
{
for ( j=0; j<COLS; j++ )
{
g_panel[i][j]=0;
}
//所有方块往下移
for ( k=i-1; k>=0; k-- )
{
for ( j=0; j<COLS; j++ )
{
g_panel[k+1][j]=g_panel[k][j];
}
}
i=i+1;
count++;
}
}

//最高级别为9级,所以分数极限为(9+1)*SCORE_LEVEL_INC-1
if ( score>=10*SCORE_LEVEL_INC-1 ) return;

//加分规则:消除行数,1行加10分,2行加15分,3行加20分,4行加30分
switch ( count )
{
case 1:
    score+=10;
    break;
case 2:
    score+=15;
    break;
case 3:
    score+=20;
    break;
case 4:
    score+=30;
    break;
}

int temp_level=score/SCORE_LEVEL_INC;
if ( temp_level>level )
{
    level=temp_level;
    //撤销当前计时器,然后重设
    if ( timer_id ) KillTimer ( hwnd,ID_TIMER );
    timer_id=SetTimer ( hwnd,ID_TIMER,interval_base-level*interval_unit,NULL );
}

system ( "cls" );
printf ( "score: %d, level: %d ",score,level );

}

void RefreshPanel ( HDC hdc ) //刷新面板
{
int x,y;
RECT rect;
HBRUSH h_bSolid= ( HBRUSH ) GetStockObject ( GRAY_BRUSH ),
h_bEmpty= ( HBRUSH ) GetStockObject ( WHITE_BRUSH );
if ( NULL==block ) return;

//先刷屏
for ( y=0; y<ROWS; y++ )
{
    for ( x=0; x<COLS; x++ )
    {
        //为避免刷掉方块的边框,rect范围必须比边框范围小1
        rect.top=y*CELL+2;
        rect.bottom= ( y+1 ) *CELL-2;
        rect.left=x*CELL+2;
        rect.right= ( x+1 ) *CELL-2;
        if ( g_panel[y][x] )
            FillRect ( hdc,&rect,h_bSolid );
        else
            FillRect ( hdc,&rect,h_bEmpty );
    }
}
//再定位方块
for ( y=0; y<height_block; y++ )
{
    for ( x=0; x<width_block; x++ )
    {
        if ( * ( block+y*width_block+x ) )          //实心
        {
            rect.top= ( y+cur_top ) *CELL+2;
            rect.bottom= ( y+cur_top+1 ) *CELL-2;
            rect.left= ( x+cur_left ) *CELL+2;
            rect.right= ( x+cur_left+1 ) *CELL-2;
            FillRect ( hdc,&rect,h_bSolid );
        }
    }
}

}

bool ExportBlock() //输出方块
{
int sel;
if ( block )
{
free ( block ); //释放之前分配的内存
block=NULL;
}

sel=rand() %7;
switch ( sel )
{
case 0:     //水平条
    width_block=4;
    height_block=1;
    block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
    * ( block+0 ) =1;       //可以理解为*(block+0*width_block+0)=1,即第一行的第一个方格,下面同理
    * ( block+1 ) =1;       //*(block+0*width_block+1)=1
    * ( block+2 ) =1;       //*(block+0*width_block+2)=1
    * ( block+3 ) =1;       //*(block+0*width_block+3)=1

    cur_top=0-height_block;
    cur_left= ( COLS-width_block ) /2;
    break;
case 1:     //三角
    width_block=3;
    height_block=2;
    block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
    * ( block+0 ) =0;       //可以理解为*(block+0*width_block+0)=0,即第一行的第一个方格,下面同理
    * ( block+1 ) =1;       //*(block+0*width_block+1)=1
    * ( block+2 ) =0;       //*(block+0*width_block+2)=0
    * ( block+3 ) =1;       //*(block+1*width_block+0)=1,第二行开始
    * ( block+4 ) =1;       //*(block+1*width_block+1)=1
    * ( block+5 ) =1;       //*(block+1*width_block+2)=1

    cur_top=0-height_block;
    cur_left= ( COLS-width_block ) /2;
    break;
case 2:     //左横折
    width_block=3;
    height_block=2;
    block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
    * ( block+0 ) =1;       //可以理解为*(block+0*width_block+0)=1,下面同理
    * ( block+1 ) =0;       //*(block+0*width_block+1)=0
    * ( block+2 ) =0;       //*(block+0*width_block+2)=0
    * ( block+3 ) =1;       //*(block+1*width_block+0)=1
    * ( block+4 ) =1;       //*(block+1*width_block+1)=1
    * ( block+5 ) =1;       //*(block+1*width_block+2)=1

    cur_top=0-height_block;
    cur_left= ( COLS-width_block ) /2;
    break;
case 3:     //右横折
    width_block=3;
    height_block=2;
    block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
    * ( block+0 ) =0;       //可以理解为*(block+0*width_block+0)=0,下面同理
    * ( block+1 ) =0;       //*(block+0*width_block+1)=0
    * ( block+2 ) =1;       //*(block+0*width_block+2)=1
    * ( block+3 ) =1;       //*(block+1*width_block+0)=1
    * ( block+4 ) =1;       //*(block+1*width_block+1)=1
    * ( block+5 ) =1;       //*(block+1*width_block+2)=1

    cur_top=0-height_block;
    cur_left= ( COLS-width_block ) /2;
    break;
case 4:     //左闪电
    width_block=3;
    height_block=2;
    block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
    * ( block+0 ) =1;       //可以理解为*(block+0*width_block+0)=1,下面同理
    * ( block+1 ) =1;       //*(block+0*width_block+1)=1
    * ( block+2 ) =0;       //*(block+0*width_block+2)=0
    * ( block+3 ) =0;       //*(block+1*width_block+0)=0
    * ( block+4 ) =1;       //*(block+1*width_block+1)=1
    * ( block+5 ) =1;       //*(block+1*width_block+2)=1

    cur_top=0-height_block;
    cur_left= ( COLS-width_block ) /2;
    break;
case 5:     //右闪电
    width_block=3;
    height_block=2;
    block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
    * ( block+0 ) =0;       //可以理解为*(block+0*width_block+0)=0,下面同理
    * ( block+1 ) =1;       //*(block+0*width_block+1)=1
    * ( block+2 ) =1;       //*(block+0*width_block+2)=1
    * ( block+3 ) =1;       //*(block+1*width_block+0)=1
    * ( block+4 ) =1;       //*(block+1*width_block+1)=1
    * ( block+5 ) =0;       //*(block+1*width_block+2)=0

    cur_top=0-height_block;
    cur_left= ( COLS-width_block ) /2;
    break;
case 6:     //石头
    width_block=2;
    height_block=2;
    block= ( byte * ) malloc ( sizeof ( byte ) *width_block*height_block );
    * ( block+0 ) =1;       //可以理解为*(block+0*width_block+0)=1,下面同理
    * ( block+1 ) =1;       //*(block+0*width_block+1)=1
    * ( block+2 ) =1;       //*(block+1*width_block+0)=1
    * ( block+3 ) =1;       //*(block+1*width_block+1)=1

    cur_top=0-height_block;
    cur_left= ( COLS-width_block ) /2;
    break;
}
return block!=NULL;

}

LRESULT CALLBACK WndProc ( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam )
{
HDC hdc;
PAINTSTRUCT ps;
//TCHAR szBuffer[1024];

switch ( message )
{
case WM_CREATE:
    MoveWindow ( hwnd,400,10,CELL*COLS+8,CELL*ROWS+32,FALSE );      //补齐宽度和高度
    srand ( time ( NULL ) );
    ExportBlock();

    timer_id=SetTimer ( hwnd,ID_TIMER,interval_base-level*interval_unit,NULL );
    return 0;
case WM_TIMER:
    hdc=GetDC ( hwnd );
    DoDownShift ( hdc );
    ReleaseDC ( hwnd,hdc );
    return 0;
case WM_KEYDOWN:
    hdc=GetDC ( hwnd );
    switch ( wParam )
    {
    case VK_LEFT:                           //左移
        if ( !isPause ) DoLeftShift ( hdc );
        break;
    case VK_RIGHT:                          //右移
        if ( !isPause ) DoRightShift ( hdc );
        break;
    case VK_UP:                             //转向
        if ( !isPause ) DoRedirection ( hdc );
        break;
    case VK_DOWN:                           //加速
        if ( !isPause ) DoAccelerate ( hdc );
        break;
    case VK_SPACE:      //暂停
        isPause=!isPause;
        if ( isPause )
        {
            if ( timer_id ) KillTimer ( hwnd,ID_TIMER );
            timer_id=0;
        }
        else
        {
            timer_id=SetTimer ( hwnd,ID_TIMER,interval_base-level*interval_unit,FALSE );
        }
        break;
    }
    ReleaseDC ( hwnd,hdc );
    return 0;
case WM_PAINT:
    hdc=BeginPaint ( hwnd,&ps );
    DrawPanel ( hdc );          //绘制面板
    RefreshPanel ( hdc );       //刷新
    EndPaint ( hwnd,&ps );
    return 0;
case WM_DESTROY:
    if ( block ) free ( block );
    if ( timer_id ) KillTimer ( hwnd,ID_TIMER );
    PostQuitMessage ( 0 );
    return 0;
}
return DefWindowProc ( hwnd,message,wParam,lParam );

}



## 生成一个适合你的列表

- 项目
  - 项目
    - 项目

1. 项目1
2. 项目2
3. 项目3

- [ ] 计划任务
- [x] 完成任务


## 创建一个表格
一个简单的表格是这么创建的:
项目     | Value
-------- | -----
电脑  | $1600
手机  | $12
导管  | $1

### 设定内容居中、居左、居右
使用`:---------:`居中
使用`:----------`居左
使用`----------:`居右
| 第一列       | 第二列         | 第三列        |
|:-----------:| -------------:|:-------------|
| 第一列文本居中 | 第二列文本居右  | 第三列文本居左 | 


### SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
|    TYPE   |ASCII                          |HTML                         
|----------------|-------------------------------|-----------------------------|
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190408185020472.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjgyMjExOQ==,size_16,color_FFFFFF,t_70)|Single backticks|`'Isn't this fun?'`            |'Isn't this fun?'            |
|Quotes          |`"Isn't this fun?"`            |"Isn't this fun?"            |
|Dashes          |`-- is en-dash, --- is em-dash`|-- is en-dash, --- is em-dash|


## 创建一个自定义列表
Markdown
:  Text-to-HTML conversion tool

Authors
:  John
:  Luke


## 如何创建一个注脚

一个具有注脚的文本。[^2]

[^2]: 注脚的解释


##  注释也是必不可少的

Markdown将文本转换为 HTML。

*[HTML]:   超文本标记语言


## KaTeX数学公式

您可以使用渲染LaTeX数学表达式 [KaTeX](https://khan.github.io/KaTeX/):

Gamma公式展示 $\Gamma(n) = (n-1)!\quad\forall
n\in\mathbb N$ 是通过欧拉积分

$$
\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.
$$

> 你可以找到更多关于的信息 **LaTeX** 数学表达式[here][1].


## 新的甘特图功能,丰富你的文章

```mermaid
gantt
        dateFormat  YYYY-MM-DD
        title Adding GANTT diagram functionality to mermaid
        section 现有任务
        已完成               :done,    des1, 2014-01-06,2014-01-08
        进行中               :active,  des2, 2014-01-09, 3d
        计划一               :         des3, after des2, 5d
        计划二               :         des4, after des3, 5d
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

猜你喜欢

转载自blog.csdn.net/weixin_42822119/article/details/89101813