/定义全局变量*/
int i,j,Temp,Temp1,Temp2; //temp,temp1,temp2用于记住和转换方块变量的值
//标记游戏屏幕的图案:2,1,0分别表示该位置为游戏边框、方块、无图案;初始化为无图案
int a[80][80]={0};
int b4; //标记4个“口 ”方块,1表示有方块,0表示无方块
struct Tetris //声明俄罗斯方块的结构体
{
int x; //中心方块的 x轴坐标
int y; //中心方块的 y轴坐标
int flag; //标记方块类型的序号
int next; //下一个俄罗斯方块类型的序号
int speed; //方块的移动速度
int number; //产生俄罗斯方块的个数
int score; //游戏的分数
int level; //游戏的等级
};
HANDLE hOut; //控制台句柄
/宏定义**/
#define FrameX 13 //游戏窗口左上角的X轴坐标为 13
#define FrameY 3 //游戏窗口左上角的Y轴坐标为 3
#define Frame_height 20 //游戏窗口的高度为20
#define Frame_width 18 //游戏窗口的宽度为18
#ifndef _MAIN_H
#define _MAIN_H
int color(int c);
void gotoxy(int x, int y); //光标移动到指定位置
void DrwaGameFrame(); //绘制游戏边框
void Flag(struct Tetris * tetris); //随机产生方块类型的序号
void MakeTetris(struct Tetris * tetris); //制作俄罗斯方块
void PrintTetris(struct Tetris * tetris); //打印俄罗斯方块
void CleanTetris(struct Tetris *tetris); //清除俄罗斯方块的痕迹
int ifMove(struct Tetris * tetris); //判断是否可以移动,返回值为 1 时可以移动,否则不能移动
void Del_Fullline(struct Tetris * tetris); //判断是否满行,并删除满行的俄罗斯方块
void Gameplay(); //开始游戏
void regulation(); //游戏规则
void explation(); //按键说明
void welcome(); //欢迎界面
void Replay(); //重新开始游戏
void title(); //欢迎界面上方的标题
void flower(); //欢迎界面上的字符画装饰
void close(); //关闭游戏
#endif
int main(void)
{
title();
flower();
welcome();
return 0;
}
void gotoxy(int x, int y)
{
COORD pos={0.0};
pos.X = x; //横坐标
pos.Y= y; //纵坐标
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
int color(int c)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c); //更改文字颜色
return 0;
}
void title()
{
color(15);
gotoxy(24,3); //亮白色
printf(“趣 味 俄 罗 斯 方 块\n”); //输出标题
color(11); //亮蓝色
gotoxy(18,5);
printf(“■”);
gotoxy(18,6);
printf(“■■”);
gotoxy(18,7);
printf(“■”);
color(14); //黄色
gotoxy(26,6);
printf("■■");
gotoxy(28,7);
printf("■■");
color(10); //绿色
gotoxy(36,6);
printf("■■");
gotoxy(36,7);
printf("■■");
color(13); //粉色
gotoxy(45,5);
printf("■");
gotoxy(45,6);
printf("■");
gotoxy(45,7);
printf("■");
gotoxy(45,8);
printf("■");
color(12); //亮红色
gotoxy(56,6);
printf("■");
gotoxy(52,7);
printf("■■■");
}
void flower()
{
gotoxy(66,11);
color(12);
printf("(_)");
gotoxy(64,12);
printf("(_)");
gotoxy(68,12);
printf("(_)");
gotoxy(66,13);
printf("(_)");
gotoxy(67,12);
color(6);
printf("@");
gotoxy(72,10);
color(13);
printf("(_)");
gotoxy(76,10);
printf("(_)");
gotoxy(74,9);
printf("(_)");
gotoxy(74,11);
printf("(_)");
gotoxy(75,10);
color(6);
printf("@");
gotoxy(71,12);
printf("|");
gotoxy(72,11);
printf("/");
gotoxy(70,13);
printf("\\|");
gotoxy(70,14);
printf("`|/");
gotoxy(70,15);
printf("\\|");
gotoxy(71,16);
printf("| /");
gotoxy(71,17);
printf("|");
gotoxy(67,17);
color(10);
printf("\\\\\\\\");
gotoxy(73,17);
printf("//");
gotoxy(67,18);
color(2);
printf("^^^^^^^^");
gotoxy(65,19);
color(5);
printf("明 日 科 技");
gotoxy(68,20);
printf("朱小磊");
}
void welcome()
{
int n;
int i,j;
for(i=9; i<=20; i++){
for(j=15; j<=60; j++){
gotoxy(j,i);
if(i == 9 || i == 20)
printf("=");
else if(j == 15 || j == 59)
printf("||");
}
}
color(12);
gotoxy(25,12);
printf(“1.开始游戏”);
gotoxy(40,12);
printf(“2.按键说明”);
gotoxy(25,17);
printf(“3.游戏规则”);
gotoxy(40,17);
printf(“4.退出”);
gotoxy(21,22);
color(3);
printf(“请选择[1 2 3 4]:[ ]\b\b”);
color(14);
scanf("%d", &n);
switch(n)
{
case 1:
system(“cls”);
DrwaGameFrame();
Gameplay();
break;
case 2:
explation();
break;
case 3:
regulation();
break;
case 4:
close();
break;
}
}
//制作游戏窗口
void DrwaGameFrame()
{
gotoxy(FrameX+Frame_width-7,FrameY-2);
color(11);
printf(“趣味俄罗斯方块”);
gotoxy(FrameX+2Frame_width+3,FrameY+7);
color(2);
printf("
");
gotoxy(FrameX+2
Frame_width+13,FrameY+7);
color(13);
printf(“下一块方块”);
gotoxy(FrameX+2
Frame_width+3,FrameY+13);
color(2);
printf("
");
gotoxy(FrameX+2
Frame_width+3,FrameY+17);
color(14);
printf(“上箭头:旋转”);
gotoxy(FrameX+2
Frame_width+3,FrameY+19);
printf(“空格:暂停游戏”);
gotoxy(FrameX+2
Frame_width+3,FrameY+15);
printf(“Esc;退出游戏”);
gotoxy(FrameX,FrameY);
color(12);
printf("『");
gotoxy(FrameX+2Frame_width-2,FrameY);
printf("﹃");
gotoxy(FrameX,FrameY+Frame_height);
printf("﹄");
gotoxy(FrameX+2
Frame_width-2,FrameY+Frame_height);
printf("』");
a[FrameX][FrameY+Frame_height]=2;
a[FrameX+2Frame_width-2][FrameY+Frame_height]=2;
for(i=2;i<2
Frame_width-2;i+=2){
gotoxy(FrameX+i,FrameY);
printf("");
}
for(i=2;i<2*Frame_width;i+=2){
gotoxy(FrameX+i,FrameY+Frame_height);
printf("
");
a[FrameX+i][FrameY+Frame_height]=2; //标记下横框为游戏边框,防止方块出界;
}
for(i=1;i<Frame_height;i++){
gotoxy(FrameX,FrameY+i);
printf("||");
a[FrameX][FrameY+i]=2; //标记左竖框为游戏边框,防止方块出界
}
for(i=1;i<Frame_height;i++){
gotoxy(FrameX+2Frame_width-2,FrameY+i);
printf("||");
a[FrameX+2
Frame_width-2][FrameY+i]=2; //标记右竖框为游戏边框,防止方块出界
}
}
void MakeTetris(struct Tetris tetris) //制作俄罗斯方块
{
a[tetris->x][tetris->y]=b[0]; //中心方块位置的图形状态
switch(tetris->flag)
{
case 1://田子方块
{
color(10);
a[tetris->x][tetris->y-1]=b1;
a[tetris->x+2][tetris->y-1]=b2;
a[tetris->x+2][tetris->y]=b3;
break;
}
case 2://直线方块
{
color(13);
a[tetris->x-2][tetris->y]=b1;
a[tetris->x+2][tetris->y]=b2;
a[tetris->x+4][tetris->y]=b3;
break;
}
case 3://直线方块
{
color(13);
a[tetris->x][tetris->y-1]=b1;
a[tetris->x][tetris->y-2]=b2;
a[tetris->x][tetris->y+1]=b3;
break;
}
case 4://梯字方块
{
color(11);
a[tetris->x-2][tetris->y]=b1;
a[tetris->x+2][tetris->y]=b2;
a[tetris->x][tetris->y+1]=b3;
break;
}
case 5://顺时针 90 T 字方块
{
color(11);
a[tetris->x][tetris->y-1]=b1;
a[tetris->x][tetris->y+1]=b2;
a[tetris->x-2][tetris->y]=b3;
break;
}
case 6://瞬时针 180 T 字方块
{
color(11);
a[tetris->x][tetris->y-1]=b1;
a[tetris->x-2][tetris->y]=b2;
a[tetris->x+2][tetris->y]=b3;
break;
}
case 7://顺时针旋转 270 T 字方块
{
color(11);
a[tetris->x][tetris->y-1]=b1;
a[tetris->x][tetris->y+1]=b2;
a[tetris->x+2][tetris->y]=b3;
break;
}
case 8:// Z 字方块
{
color(14);
a[tetris->x][tetris->y+1]=b1;
a[tetris->x-2][tetris->y]=b2;
a[tetris->x+2][tetris->y+1]=b3;
break;
}
case 9://顺时针 Z 字方块
{
color(14);
a[tetris->x][tetris->y-1]=b1;
a[tetris->x-2][tetris->y]=b2;
a[tetris->x-2][tetris->y+1]=b3;
break;
}
case 10://反 Z 字方块
{
color(14);
a[tetris->x][tetris->y-1]=b1;
a[tetris->x-2][tetris->y-1]=b2;
a[tetris->x+2][tetris->y]=b3;
break;
}
case 11://顺时针反 Z 字方块
{
color(14);
a[tetris->x][tetris->y+1]=b1;
a[tetris->x-2][tetris->y-1]=b2;
a[tetris->x-2][tetris->y]=b3;
break;
}
case 12:// 7 字方块
{
color(12);
a[tetris->x][tetris->y-1]=b1;
a[tetris->x][tetris->y+1]=b2;
a[tetris->x-2][tetris->y-1]=b3;
break;
}
case 13://顺时针 90 7 字方块
{
color(12);
a[tetris->x-2][tetris->y]=b1;
a[tetris->x+2][tetris->y-1]=b2;
a[tetris->x+2][tetris->y]=b3;
break;
}
case 14://顺时针 180 7 字 方块
{
color(12);
a[tetris->x][tetris->y-1]=b1;
a[tetris->x][tetris->y+1]=b2;
a[tetris->x+2][tetris->y+1]=b3;
break;
}
case 15://顺时针 270 7 字方块
{
color(12);
a[tetris->x-2][tetris->y]=b1;
a[tetris->x-2][tetris->y+1]=b2;
a[tetris->x+2][tetris->y]=b3;
break;
}
case 16://反 7 字方块
{
color(12);
a[tetris->x][tetris->y+1]=b1;
a[tetris->x][tetris->y-1]=b2;
a[tetris->x+2][tetris->y-1]=b3;
break;
}
case 17://顺时针 90 反 7 字方块
{
color(12);
a[tetris->x-2][tetris->y]=b1;
a[tetris->x+2][tetris->y+1]=b2;
a[tetris->x+2][tetris->y]=b3;
break;
}
case 18://顺时针 180 反 7字 方块
{
color(12);
a[tetris->x][tetris->y-1]=b1;
a[tetris->x][tetris->y+1]=b2;
a[tetris->x-2][tetris->y+1]=b3;
break;
}
case 19: //顺时针 270 反 7 字方块
{
color(12);
a[tetris->x-2][tetris->y]=b1;
a[tetris->x-2][tetris->y-1]=b2;
a[tetris->x+2][tetris->y]=b3;
}
}
}
void PrintTetris(struct Tetris tetris)//打印俄罗斯方块
{
for(i=0;i<4;i++){
b[i]=1;
}
MakeTetris(tetris);// 制作俄罗斯方块
for(i=tetris->x-2; i<=tetris->x+4; i+=2){
for(j=tetris->y-2; j<=tetris->y+1; j++){
if(a[i][j] == 1 && j>FrameY){
gotoxy(i,j);
printf(“■”);
}
}
}
//打印菜单信息
gotoxy(FrameX+2
Frame_width+3,FrameY+1);
color(4);
printf(“level : “);
color(12);
printf(”%d”,tetris->level);
gotoxy(FrameX+2
Frame_width+3,FrameY+3);
color(4);
printf(“score : “);
color(12);
printf(”%d”,tetris->score);
gotoxy(FrameX+2Frame_width+3,FrameY+5);
color(4);
printf(“speed : “);
color(12);
printf(”%dms”,tetris->speed);
}
int ifMove(struct Tetris tetris)
{
if(a[tetris->x][tetris->y] != 0)//当中心方块位置上有图案时,返回值为 0,不可移动
{
return 0;
}else
{
if(
(tetris->flag==1 && ( a[tetris->x][tetris->y-1]==0 &&
a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]0)) ||
(tetris->flag
2 && ( a[tetris->x-2][tetris->y]==0 &&
a[tetris->x+2][tetris->y]==0 && a[tetris->x+4][tetris->y]0)) ||
(tetris->flag
3 && ( a[tetris->x][tetris->y-1]==0 &&
a[tetris->x][tetris->y-2]==0 && a[tetris->x][tetris->y+1]0)) ||
(tetris->flag
4 && ( a[tetris->x-2][tetris->y]==0 &&
a[tetris->x+2][tetris->y]==0 && a[tetris->x][tetris->y+1]0)) ||
(tetris->flag
5 && ( a[tetris->x][tetris->y-1]==0 &&
a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y]0)) ||
(tetris->flag
6 && ( a[tetris->x][tetris->y-1]==0 &&
a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y]0)) ||
(tetris->flag
7 && ( a[tetris->x][tetris->y-1]==0 &&
a[tetris->x][tetris->y+1]==0 && a[tetris->x][tetris->y-1]0)) ||
(tetris->flag
8 && ( a[tetris->x][tetris->y+1]==0 &&
a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y+1]0)) ||
(tetris->flag
9 && ( a[tetris->x][tetris->y-1]==0 &&
a[tetris->x-2][tetris->y]==0 && a[tetris->x-2][tetris->y+1]0)) ||
(tetris->flag
10 && ( a[tetris->x][tetris->y-1]==0 &&
a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]0)) ||
(tetris->flag
11 && ( a[tetris->x][tetris->y+1]==0 &&
a[tetris->x-2][tetris->y-1]==0 && a[tetris->x-2][tetris->y]0)) ||
(tetris->flag
12 && ( a[tetris->x][tetris->y-1]==0 &&
a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y-1]0)) ||
(tetris->flag
15 && ( a[tetris->x-2][tetris->y]==0 &&
a[tetris->x-2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]0)) ||
(tetris->flag
14 && ( a[tetris->x][tetris->y-1]==0 &&
a[tetris->x][tetris->y+1]==0 && a[tetris->x+2][tetris->y+1]0)) ||
(tetris->flag
13 && ( a[tetris->x-2][tetris->y]==0 &&
a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]0)) ||
(tetris->flag
16 && ( a[tetris->x][tetris->y+1]==0 &&
a[tetris->x][tetris->y-1]==0 && a[tetris->x+2][tetris->y-1]0)) ||
(tetris->flag
19 && ( a[tetris->x-2][tetris->y]==0 &&
a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]0)) ||
(tetris->flag
18 && ( a[tetris->x][tetris->y-1]==0 &&
a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y+1]0)) ||
(tetris->flag
17 && ( a[tetris->x-2][tetris->y]==0 &&
a[tetris->x+2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0)))
{
return 1;
}
}
return 0;
}
void CleanTetris(struct Tetris tetris)//擦除俄罗斯方块
{
for(i=0; i<4; i++)
{
b[i]=0;
}
MakeTetris(tetris);
for(i=tetris->x-2;i<=tetris->x+4;i+=2){
for(j=tetris->y-2; j<= tetris->y+1; j++){
if(a[i][j] == 0 && j > FrameY){
gotoxy(i,j);
printf(" ");
}
}
}
}
void Del_Fullline(struct Tetris tetris)//当每行有Frame_width-2个方块时,则满行消除
{
int k,del_rows=0; //分别用来记录某行方块的个数和删除方块的行数的变量
for(j=FrameY+Frame_height-1; j>=FrameY+1; j–){
k=0;
for(i=FrameX+2; i<FrameX+2
Frame_width-2; i+=2){
if(a[i][j] == 1)
{
k++; //记录此行方块的个数
if(k == Frame_width-2){
for(k=FrameX+2;k<FrameX+2
Frame_width-2; k+=2){
a[k][j]=0;
gotoxy(k,j);
printf(" ");
}
for(k=j-1; k>FrameY; k–){
for(i=FrameX+2; i<FrameX+2
Frame_width-2; i+=2){
if(a[i][k] ==1)
{
a[i][k]=0;
gotoxy(i,k);
printf(" ");
a[i][k+1]=1;
gotoxy(i,k+1);
printf(“■”);
}
}
}
j++; //方块下移后判断删除行是否满行;
del_rows++; //记录删除方块的行数
}
}
}
}
tetris->score+=100
del_rows;
if(del_rows>0 && ( tetris->score%1000 == 0 || tetris->score/1000 > tetris->level-1)){
tetris->speed -= 20;
tetris->level++;
}
}
void Flag(struct Tetris *tetris) //随机产生俄罗斯方块的类型序号
{
tetris->number++;
srand(time(NULL)); //初始化随机数
if(tetris->number == 1)
{
tetris->flag = rand()%19+1;
}
tetris->next = rand()%19+1;
}
void Gameplay()
{
int n;
struct Tetris t, tetris=&t; //定义结构指针并指向结构体变量
char ch; //接受键盘输入的变量
tetris->number = 0; //初始化俄罗斯方块为0个
tetris->speed = 300;
tetris->score = 0;
tetris->level = 1;
while(1) //循环产生方块,直至游戏结束
{
Flag(tetris); //得到产生俄罗斯方块类型的序号
Temp = tetris->flag; //记住当前俄罗斯方块序号
tetris->x = FrameX+2
Frame_width+6; //获得预览界面方块的 X 坐标
tetris->y = FrameY+10; //获得预览界面方块的 Y 坐标
tetris->flag = tetris->next;
PrintTetris(tetris); //获得下一个俄罗斯方块的序号
tetris->x = FrameX+Frame_width; //获得游戏窗口中心方块 X 坐标
tetris->y = FrameY-1; //获得游戏窗口中心方块 Y 坐标
tetris->flag = Temp;
while(1)
{
label:PrintTetris(tetris); //调用打印俄罗斯方块的函数
Sleep(tetris->speed);
CleanTetris(tetris);
Temp1=tetris->x;
Temp2=tetris->flag;
if(kbhit())
{
ch=getch();
if(ch75)
{
tetris->x-=2;
}
if(ch
77)
{
tetris->x+=2;
}
if(ch==80)
{
if(ifMove(tetris) != 0)
{
tetris->y+=2;
}
if(ifMove(tetris)0)
{
tetris->y=FrameY+Frame_height-2;
}
}
if(ch
72)
{
if(tetris->flag>=2 && tetris->flag <=3)
{
tetris->flag++;
tetris->flag%=2;
tetris->flag+=2;
}
if(tetris->flag>=4 && tetris->flag <= 7)
{
tetris->flag++;
tetris->flag%=4;
tetris->flag+=4;
}
if(tetris->flag>=8 && tetris->flag <= 11)
{
tetris->flag++;
tetris->flag%=4;
tetris->flag+=8;
}
if(tetris->flag>=12 && tetris->flag <= 15)
{
tetris->flag++;
tetris->flag%=4;
tetris->flag+=12;
}
if(tetris->flag>=16 && tetris->flag <= 19)
{
tetris->flag++;
tetris->flag%=4;
tetris->flag+=16;
}
}
if(ch==32)
{
PrintTetris(tetris);
while(1)
{
if(kbhit())
{
ch = getch();
if(ch == 32)
{
goto label;
}
}
}
}
if(ch == 27)
{
system("cls");
memset(a,0,6400*sizeof(int));
welcome();
}
if(ifMove(tetris)==0)
{
tetris->x = Temp1;
tetris->flag = Temp2;
}
else
{
goto label;
}
}
tetris->y++;
if(ifMove(tetris)==0)
{
tetris->y--;
PrintTetris(tetris);
Del_Fullline(tetris);
break;
}
}
for(i=tetris->y-2; iy+2;i++)
{
if(iFrameY)
{
system(“cls”);
gotoxy(29,7);
printf(" \n");
color(12);
printf("\t\t\t■■■■ ■ ■ ■■ \n");
printf("\t\t\t■ ■■ ■ ■ ■ \n");
printf("\t\t\t■■■ ■ ■ ■ ■ ■ \n");
printf("\t\t\t■ ■ ■■ ■ ■ \n");
printf("\t\t\t■■■■ ■ ■ ■■ \n");
gotoxy(17,18);
color(14);
printf("我要重新玩一局--------- 1 ");
gotoxy(44,18);
printf(“不玩了,退出游戏------- 2 “);
int n;
gotoxy(32,20);
printf(“选择[1/2]”);
color(11);
scanf(”%d,&n”);
switch(n)
{
case 1:
system(“cls”);
Replay(tetris);
break;
case 2:
close();
break;
}
}
}
tetris->flag = tetris->next;
tetris->x = FrameX+2Frame_width+6;
tetris->y = FrameY+10;
CleanTetris(tetris);
}
}
void Replay()
{
system(“cls”);
memset(a,0,6400
sizeof(int));
DrwaGameFrame();
Gameplay();
}
void explation()
{
int i,j = 1;
system(“cls”);
color(13);
gotoxy(32,3);
printf(“按键说明”);
color(2);
for(i=6; i<=16; i++)
{
for(j=15; j<=60; j++)
{
gotoxy(j,i);
if(i
6 || i == 16)
printf("=");
else if(j15 || j == 59)
printf("||");
}
}
color(13);
gotoxy(18,7);
printf(“tip1: 玩家可以通过 左右 方向键来移动方块”);
color(10);
gotoxy(18,9);
printf(“tip2: 通过 上 方向键使得方块旋转”);
gotoxy(18,11);
printf(“tip3: 通过 下 方向键使得方块加速”);
gotoxy(18,13);
printf(“tip4: 通过空格键暂停游戏,再按空格键继续”);
gotoxy(18,15);
printf(“tip5: 按ESC退出游戏”);
getch(); //按任意键返回
system(“cls”);
main();
}
void regulation()
{
int i,j = 1;
system(“cls”);
color(13);
gotoxy(34,3);
printf(“游戏规则”);
color(2);
for(i=6;i<=18;i++)
{
for(j=12; j<=70; j++){
gotoxy(j,i);
if(i
6 || i == 18)
printf("=");
else if(j==12 || j ==69)
printf("||");
}
}
color(12);
gotoxy(16,7);
printf(“tip1: 不同形状的小方块从屏幕上方落下,玩家通过调整”);
gotoxy(22,9);
printf(“方块的位置和方向,使得他们在屏幕底部拼出完整的”);
gotoxy(22,11);
printf(“一行或者几行”);
color(14);
gotoxy(16,13);
printf(“tip2: 每消除一行, 积分增加 100 分”);
color(11);
gotoxy(16,15);
printf(“tip3: 每累计1000分,会提升一个等级”);
color(10);
gotoxy(16,17);
printf(“tip4: 提升等级会使得方块下落速度加快, 游戏难度加大”);
getch();
system(“cls”);
welcome();
}
void close()
{
exit(0);
}
# 欢迎使用Markdown编辑器
你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
## 新的改变
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
1. **全新的界面设计** ,将会带来全新的写作体验;
2. 在创作中心设置你喜爱的代码高亮样式,Markdown **将代码片显示选择的高亮样式** 进行展示;
3. 增加了 **图片拖拽** 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
4. 全新的 **KaTeX数学公式** 语法;
5. 增加了支持**甘特图的mermaid语法[^1]** 功能;
6. 增加了 **多屏幕编辑** Markdown文章功能;
7. 增加了 **焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置** 等功能,功能按钮位于编辑区域与预览区域中间;
8. 增加了 **检查列表** 功能。
[^1]: [mermaid语法说明](https://mermaidjs.github.io/)
## 功能快捷键
撤销:<kbd>Ctrl/Command</kbd> + <kbd>Z</kbd>
重做:<kbd>Ctrl/Command</kbd> + <kbd>Y</kbd>
加粗:<kbd>Ctrl/Command</kbd> + <kbd>B</kbd>
斜体:<kbd>Ctrl/Command</kbd> + <kbd>I</kbd>
标题:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>H</kbd>
无序列表:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>U</kbd>
有序列表:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>O</kbd>
检查列表:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>C</kbd>
插入代码:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>K</kbd>
插入链接:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>L</kbd>
插入图片:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>G</kbd>
查找:<kbd>Ctrl/Command</kbd> + <kbd>F</kbd>
替换:<kbd>Ctrl/Command</kbd> + <kbd>G</kbd>
## 合理的创建标题,有助于目录的生成
直接输入1次<kbd>#</kbd>,并按下<kbd>space</kbd>后,将生成1级标题。
输入2次<kbd>#</kbd>,并按下<kbd>space</kbd>后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用`TOC`语法后生成一个完美的目录。
## 如何改变文本的样式
*强调文本* _强调文本_
**加粗文本** __加粗文本__
==标记文本==
~~删除文本~~
> 引用文本
H~2~O is是液体。
2^10^ 运算结果是 1024.
## 插入链接与图片
链接: [link](https://www.csdn.net/).
图片: ![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw)
带尺寸的图片: ![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw =30x30)
居中的图片: ![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw#pic_center)
居中并且带尺寸的图片: ![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw#pic_center =30x30)
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
## 如何插入一段漂亮的代码片
去[博客设置](https://mp.csdn.net/console/configBlog)页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 `代码片`.
```javascript
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
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
如何创建一个注脚
一个具有注脚的文本。1
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎
来源:oschina
链接:https://my.oschina.net/u/4275462/blog/4305060