用VS软件开发“中国象棋“游戏<笔记摘录>

news2024/11/26 4:21:04

 整体架构如上

1.很直观地去看这个中国象棋的界面,数一下它有多少行和多少列.

10行,9列:要注意这里数的是安放象棋的位置,有10行9列

这里我们首先想到的必然是二维数组,每一个行列交叉的点都设置成二维数组a[i][j]这样的格式,以此来确定棋盘上面每一个棋子的位置和走向.

我们把上面安放棋子的二维数组定义成一个地图,也就是map[i][j]的格式,但同时要注意,每一个象棋棋子都有行,列,颜色,是否过河和名称(也就是什么棋子)几种定义区分.

那么这里我们就需要把棋子定义成一个结构.如下:

struct  Chesscoordinate//棋子综合信息
{
    int x;
    int y;
    DWORD type;  //颜色
    bool river;//是否过河
    int id;
};

当定义了棋子综合信息,我们是不是需要每一个信息都拓展一下?

x代表的是在棋盘上面的列,也就是竖行,y代表的是棋子在棋盘上面的行,也就是横线,而type代表的棋子的颜色,棋子颜色可以分为黑色和红色两种;river设置成bool型的,只需要判断棋子是否过河就可以了.最后id定义的是棋子上面的名称,比如将,帅等.

接下来我们就来VS当中进行棋子的程序定义拓展:

#define distance  35//窗口线与棋盘边界线的距离
#define   longth  65//棋盘方格的长
#define   high   61//棋盘方格的宽

distance longth 和high我们都把其设置成宏,这个就要回溯到棋盘上面,把棋盘假设成一个xy的二维坐标,那么要定义每一个棋子的位置,或者说是每一行与每一列的交叉点,就要用到上面三个宏定义.

比如左上角第一个棋子的坐标可以表示为:

map[0][0].x=distance;

map[0][0].y=distance

而第一行第二个棋子的坐标可以表示为:

map[1][0].x=distance+longth;

map[1][0].y=distance

依次类推......

int  xx(int a)//数组下标转换成坐标
{
    a = distance + longth * a;
    return a;
}
int  yy(int a)
{
    a = distance + high * a;
    return a;
}

我们可以推断出每一个棋子的坐标,都可以通过上面几个宏定义以及棋子的实际行列表示出来,

enum pieces
{
    SPACE = -1,
    車, 馬, 象, 士, 将, 炮, 卒,
    车, 马, 相, 仕, 帥, 砲, 兵,
    BEGIN, END,

};
enum pieces redchess[] = { 車,馬,象,士,将,炮,卒, };
enum pieces blackchess[] = { 车,马,相,仕,帥,砲,兵, };
enum pieces state = BEGIN;
struct move {  //鼠标选中的棋子
    int beginx;
    int beginy;
    int endx;
    int endy;
    int state;
}moving = { -1,-1,-1,-1,BEGIN };
const char* chessname[] = { "車","馬","象","士","将","炮","卒","车","马","相","仕","帥","砲","兵", };

这里我们把棋子的id设置成一个联合结构数组,因为里面的棋子的id都基本不同,同时我们考虑到了棋子要进行运动,把棋子的开始状态设置为BEGIN

而新建一个move的结构,表示鼠标选中棋子的基本信息.begin的行列和结束的行列和运行状态.

最后回到棋子id上面,我们是不是需要把这些id都设置到棋子或者棋盘上面啊,采用常量字符数组的形式,把棋盘上面所有的棋子都表示出来.

而把刚才的map[i][j]二维数组同样定义成一个二维结构数组.如下:

struct Chesscoordinate  map[9][10];//坐标
struct Chesscoordinate  AImap[9][10];//坐标

同时,我们设置了AImap[i][j]的二维结构数组,看看是否下面在进行棋子移动的时候,我们会用到.

这里i=9,j=10是根据我们上面看中国象棋棋盘得到的数据.

2.我们要开始加载图片信息了,把我们已经有的棋盘素材放在同文件下面,然后采用下面程序,就可以在窗口当中显示出中国棋盘的背景图.

void begining()
{
    loadimage(&img, "D:/program/Project3-chess successful/1.png");
    initgraph(img.getwidth(), img.getheight(), 1); //初始化图形系统
    putimage(0, 0, &img);//输出开始界面;

至于,loadimage()和initgraph()函数以及putimage()函数三者的基本理解和解释,建议去搜索,都有比较详细的解释.这里我们解释一下initgraph()函数的基本含义:

这个函数用于初始化绘图环境。

HWND initgraph(
    int width,
    int height,
    int flag = NULL
);

参数:

width   绘图环境的宽度。

height   绘图环境的高度。

flag  绘图环境的样式,默认为 NULL。

上面程序的基本思路也就不言而喻:先加载或者找到我们素材的地址,然后定义出素材的宽和长度,然后再输出这个棋盘背景.

当输出完背景之后,我们是不是要先把所有的棋子放在初始位置,也就是初始化棋盘?

void  coord()//棋子信息赋值
{
    loadimage(&img, "D:/program/Project3-chess successful/1.png");
    putimage(0, 0, &img);//输出棋盘

    for (int i = 0; i <= 8; i++)
    {

        for (int j = 0; j <= 9; j++)//遍历二维数组
        {
            enum pieces chessid = SPACE;//先把全部位置的id赋值为SAPCE
            DWORD  chesstype;//定义颜色中间变量
            if (j <= 4)
            {
                chesstype = BLACK;//黑方
                if (j == 0)
                {
                    if (i <= 4)
                    {
                        chessid = blackchess[i];//
                    }
                    else
                    {
                        chessid = blackchess[8 - i];
                    }

                }
                if (j == 2 && (i == 1 || i == 7))
                {
                    chessid = blackchess[5];

                }

                if (j == 3 && (i == 0 || i == 2 || i == 4 || i == 4 || i == 6 || i == 8))
                {
                    chessid = blackchess[6];
                }

            }
            else
            {
                chesstype = RED;//红方
                if (j == 6 && (i == 0 || i == 2 || i == 4 || i == 6 || i == 8))
                {
                    chessid = redchess[6];
                }
                if (j == 7 && (i == 1 || i == 7))
                {
                    chessid = redchess[5];

                }

                if (j == 9)
                {

                    if (i <= 4)
                    {
                        chessid = redchess[i];
                    }
                    else
                    {
                        chessid = redchess[8 - i];
                    }
                }

            }//依次赋值
            map[i][j].id = chessid;
            map[i][j].river = false;
            map[i][j].type = chesstype;
            map[i][j].x = distance + longth * i;
            map[i][j].y = distance + high * j;

        }
    }
    for (int i = 0; i <= 8; i++)
    {
        for (int j = 0; j <= 9; j++)
        {
            if (map[i][j].id == SPACE)
            {
                map[i][j].type = YELLOW;
            }
        }
    }

}

看上述程序:

首先先加载出棋盘背景,然后把棋盘上面行和列交叉的位置都设置为SPACE,可以理解为初始化棋盘.然后如果j<=4,也就是楚河的一侧,我们定义棋子type全部都为黑色,而棋子的id要根据行列的位置来确定,首先看第一行,前5列数据,是不是应该是"車,馬,象,士,将"而后四列数据,是不是应该是前面去除将的反序,而观察一下,如果把前面定义成i列,后面对应相等的字符则是8-i列.那么我们就定义完了第一行的数据.

而炮和兵的数据,以及红方的数据是不是同上述思路一样.

然后就开始定义每一个棋子初始化的状态,回溯到棋子的基本信息结构当中,有x,y,river,type和id,我们要依次对其进行定义,

注意在初始状态的时候,棋子的river都为false,因为都没有过楚河

定义完棋子的位置,那么剩下没有棋子的位置,我们是不是要把刚开始初始化的状态都修改为棋盘的背景颜色啊.上述定义完,再次输出棋盘

void  qiban()
{
    loadimage(&img, "D:/program/Project3-chess successful/1.png");
    initgraph(img.getwidth(), img.getheight(), 1);
    putimage(0, 0, &img);//输出棋盘
}

这个时候就已经初始化了中国象棋的棋盘.

接下来是不是要把每一个棋子都定义到棋盘上面.开始绘画棋子

void getbackground() //画棋子
{
    int x_start, y_start;
    x_start = distance;
    y_start = distance;

    settextstyle(30, 0, "黑体");//棋子大小颜色
    setbkmode(0);
    for (int i = 0; i <= 8; i++)
    {

        for (int j = 0; j <= 9; j++)
        {

            if (map[i][j].id != SPACE)//在棋盘上输出
            {
                setfillcolor(RGB(253, 216, 161));
                //    setlinestyle(BLACK);
                settextcolor(map[i][j].type);
                fillcircle(map[i][j].x, map[i][j].y, 24);
                fillcircle(map[i][j].x, map[i][j].y, 18);
                outtextxy(map[i][j].x - 13, map[i][j].y - 13, chessname[map[i][j].id]);

            }
        }
    }

}

如果上面棋盘行列之间的id不是SPACE,那自然就是我们定义的棋子应该安置的位置.从第0行第0列开始,依次进行定义:

画一个棋子,两个圆环,其颜色要画成背景颜色,而棋子上面的文本颜色要根据实际行列定义的type,设置成黑色和红色,

最后便是采用outtextxy()把每一个棋子的字符输入进行.注意此处根据棋盘x和y的地址均减13,是根据实际调试来进行,并不是确定常量.

写到这里,是不是就把棋子和棋盘都初始化好了?yes,of course.

3.棋盘棋子都初始化好了,那么接下来我们是不是就可以开始移动棋盘上面的棋子,进行下棋了?

这里有一个有意思的思考:我刚开始认为吃掉棋子和走到空白的地方是两种不同的情况,后面仔细思考了一下,是同一状态,只需要把原来的修改为结束的就可以了,而原来的只需要位置只需要修改颜色和id为空也就没了,不管他end地址有没有棋子.

void movechess(int a, int b, int c, int d)//移动棋子,改变其坐标
{

    map[c][d].id = map[a][b].id;
    map[c][d].river = map[a][b].river;
    map[c][d].type = map[a][b].type;
    map[c][d].x = xx(c);
    map[c][d].y = yy(d);
    map[a][b].id = SPACE;
    map[a][b].type = YELLOW;


}
int  xx(int a)//数组下标转换成坐标
{
    a = distance + longth * a;
    return a;
}
int  yy(int a)
{
    a = distance + high * a;
    return a;
}

把[a][b]位置的棋子信息,全部给了[c][d]位置处的棋子,而[a][b]棋子此处的信息要记得修改id和type,id设置为空,而颜色设置成背景颜色.而xx(c),yy(d)就成了棋子移动到下一个点的坐标

void MouseControl()//获取鼠标点击信息并完响应
{
    //getbackground();
    if (MouseHit())
    {

        float beginrow, beginrol, endrow, endrol;//第一次按下时的坐标
        int intbeginrow, intbeginrol, intendrow, intendrol;//第二次按下时的坐标
        MOUSEMSG msg = GetMouseMsg();/*这个函数用于获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待。*/
        if (msg.uMsg == WM_LBUTTONDOWN)//按下鼠标左键时
        {
            //获取鼠标点击的数组的下标
        //    printf("(%d,%d)", msg.x, msg.y);
            //回溯转换成行列
            beginrow = (float)(msg.x - distance) / longth;
            beginrol = (float)(msg.y - distance) / high;

            intbeginrow = round(beginrow);
            intbeginrol = round(beginrol);

            if (moving.state == BEGIN)
            {
                moving.state = END;
                moving.beginx = intbeginrow;
                moving.beginy = intbeginrol;
                //    printf("(%d,%d)  \n", moving.beginx, moving.beginy);
            }
            else if (moving.state == END)
            {

                moving.state = BEGIN;
                moving.endx = intbeginrow;
                moving.endy = intbeginrol;

                execute(moving.beginx, moving.beginy, moving.endx, moving.endy);


            }


        }

    }

}

 上面这一段我其实有一点不清晰,我所理解的应该是定义了两个状态,如果状态是开始的时候,那状态改为结束,然后把第一次点击的数据给了开始的数据,如果状态是结束,把状态修改为开始,把第一次点击的数据给了结束的坐标.

关键:

            intbeginrow = round(beginrow);
            intbeginrol = round(beginrol);

判断输赢:

int  win()
{
    int redgeneral = 0;
    int blackgeneral = 0;
    for (int i = 0; i <= 8; i++)
    {
        for (int j = 0; j <= 9; j++)
        {
            if (map[i][j].id == blackchess[4])
            {
                blackgeneral++;
            }
            else if (map[i][j].id == redchess[4])
            {
                redgeneral++;
            }
            else
            {
                blackgeneral = blackgeneral;
                redgeneral = redgeneral;
            }
        }
    }

    //printf("%d %d\n", blackgeneral, redgeneral);

    if (blackgeneral == 0)//红方胜
    {
        return 0;

    }
    else if (redgeneral == 0)//黑方胜
    {

        return 1;
    }
    else//打平
    {
        return 2;
    }


}

给将和帅都定义了初始值,相当于如果将死了,那就是帅赢,相反同理,而如果两者都存在,也就是1+1,那自然就是平手,return 2;

下面就是判断每一种棋子是否按游戏规则进行移动:

bool jiang(int a, int b, int  c, int d)//判断是否只移动了一格(将军、兵的规则)
{

    float h;
    h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    if (b < 4 && c > 2 && c < 6 && d < 3)
    {
        if (h == 1 && map[c][d].type != map[a][b].type)
            return true;
        else
            return false;
    }
    if (b > 4 && c > 2 && c < 6 && d >6)
    {
        if (h == 1 && map[c][d].type != map[a][b].type)
            return true;
        else
            return false;
    }
    else
    {
        return false;
    }

}
bool bing(int a, int b, int c, int d)
{
    float h;
    h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    if (map[a][b].type == BLACK)
    {
        if (map[a][b].river == false)
        {
            if (d == b + 1 && h == 1 && map[c][d].type != map[a][b].type)
            {
                return true;

            }
            else
            {
                return false;
            }
        }
        else
        {
            if (d >= b && h == 1 && map[c][d].type != map[a][b].type)
            {
                return true;

            }
            else
            {
                return false;
            }
        }
    }
    else if (map[a][b].type == RED)
    {
        if (map[a][b].river == false)
        {
            if (d == b - 1 && h == 1 && map[c][d].type != map[a][b].type)
            {
                return true;

            }
            else
            {
                return false;
            }
        }
        else
        {
            if (d <= b && h == 1 && map[c][d].type != map[a][b].type)
            {
                return true;

            }
            else
            {
                return false;
            }
        }
    }
    else
    {
        return false;
    }
}
bool pao(int a, int b, int c, int d)//炮的移动
{
    if (c == a && d != b)
    {
        int time = 0;
        int max = d > b ? d : b;
        int min = b < d ? b : d;
        for (int i = min; i <= max; i++)
        {
            if (map[c][i].id != SPACE)
            {
                time++;
            }

        }
        //    printf("%d\n", time);
        if (map[c][d].id == SPACE)
        {
            if (time == 1)
                return  true;
            else
                return false;
        }
        if (map[c][d].id != SPACE)
        {

            if (time != 3)
            {
                return false;
            }
            else
            {
                if (map[c][d].type == map[a][b].type)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }


        }

    }
    else if (d == b && c != a)
    {
        int time = 0;
        int max = a > c ? a : c;
        int min = c < a ? c : a;
        for (int i = min; i <= max; i++)
        {
            if (map[i][d].id != SPACE)
            {
                time++;
            }
        }
        //    printf("%d\n", time);
        if (map[c][d].id == SPACE)
        {
            if (time == 1)
                return  true;
            else
                return false;
        }
        if (map[c][d].id != SPACE)
        {

            if (time != 3)
            {
                return false;
            }
            else
            {
                if (map[c][d].type == map[a][b].type)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }


        }
    }
    else
    {
        return false;
    }
}
bool che(int a, int b, int c, int d)
{

    if (c == a && d != b)//是否为直线
    {

        int time = 0;
        int max = d > b ? d : b;
        int min = b < d ? b : d;
        for (int i = min; i <= max; i++)//遍历路径
        {


            if (map[c][i].id != SPACE)
            {
                time++;
            }


        }
        //    printf("%d", time);
        if (time == 1)//车移动不吃棋子
        {
            return true;

        }
        if (time == 2)//车移动并且吃目的坐标的棋子
        {
            if (map[c][d].type == map[a][b].type)//如果是目的坐标是自己的棋子,则返回false
            {
                return false;
            }
            if (map[c][d].type == YELLOW)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        else
        {
            return false;
        }
    }
    else    if (d == b && c != a)
    {
        int time = 0;
        int max = c > a ? c : a;
        int min = a < c ? a : c;
        for (int i = min; i <= max; i++)//遍历路径
        {
            if (map[i][d].id != SPACE)
            {
                time++;
            }

        }
        //    printf("%d", time);
        if (time == 1)//车是否车跳棋
        {
            return true;
        }
        else if (time == 2)
        {
            if (map[c][d].type == map[a][b].type)
            {
                return false;
            }
            if (map[c][d].type == YELLOW)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        else
        {
            return false;
        }
    }
    else
    {
        return 0;
    }
}
bool ma(int a, int b, int c, int d)
{
    float h;
    h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    //    printf("%f", h);
    if (h <= 2 || h >= 2.5)//根号8=2.8.根号5=2.2
    {
        //    printf("太远了!\n");
        return  false;
    }
    else
    {
        int xx, yy, max, min;//关键点的坐标和中间值
        max = abs(d - b) > abs(c - a) ? abs(d - b) : abs(c - a);
        min = abs(c - a) < abs(d - b) ? abs(c - a) : abs(d - b);
        //printf("max\min:(%d,%d)", max, min);
        if (max == abs(d - b))
        {
            yy = b + (d - b) / 2;
            xx = a;
        }
        else
        {
            xx = a + (c - a) / 2;
            yy = b;
        }
        //    printf("xx\yy:(%d,%d)\n", xx, yy);
        if (map[xx][yy].id == SPACE)
        {
            if (map[c][d].type != map[a][b].type)
            {
                //    printf("目的坐标(%d,%d)\n", c, d);
                //    printf("那是你自己的棋子!\n");
                return true;
            }
            else
            {
                //    printf("那是你的棋子!\n");
                return false;
            }

        }
        else
        {
            //    printf("关键位置有棋子!\n");
            return false;
        }
    }
}
bool xiang(int a, int b, int c, int d)
{

    float h;
    h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    if (b <= 4)
    {
        if (d > 4)
        {
            return false;
        }
        else
        {
            if (h < 2.4 || h>2.9)
            {
                return false;
            }
            else
            {
                int xx = (a + c) / 2;
                int yy = (b + d) / 2;
                if (map[xx][yy].id == SPACE)
                {
                    if (map[c][d].type == map[a][b].type)
                    {
                        return false;
                    }
                    else
                    {
                        return true;

                    }
                }
                else
                {
                    return false;
                }
            }
        }

    }
    else
    {
        if (d < 5)
        {
            return false;
        }
        else
        {
            if (h < 2.4 || h>2.9)
            {
                return false;
            }
            else
            {
                int xx = (a + c) / 2;
                int yy = (b + d) / 2;
                if (map[xx][yy].id == SPACE)
                {
                    if (map[c][d].type == map[a][b].type)
                    {
                        return false;
                    }
                    else
                    {
                        return true;

                    }
                }
                else
                {
                    return false;
                }
            }
        }
    }


}
bool shi(int a, int b, int c, int d)
{
    float h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    //  printf("%f", h)

    if (b < 5)
    {
        if (c >= 3 && c <= 5 && d <= 2)
        {

            if (1.2 < h && h < 1.5)
            {
                if (map[c][d].type != map[a][b].type)
                    return true;
                else
                    return false;

            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    else if (b > 5)
    {
        if (c >= 3 && c <= 5 && d >= 7)
        {

            if (1.2 < h && h < 1.5)
            {
                if (map[c][d].type != map[a][b].type)
                    return true;
                else
                    return false;

            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    else
        return false;
}

上述全都是bool型,用以表示判断是否正确就行

接下来是行棋子,如果遵守规则,也就是上面的bool输出true,则移动,否则输出"你不能这样做!"

void execute(int a, int b, int c, int d)//行棋
{
    if (map[a][b].id == blackchess[4])//黑方将
    {
        if (jiang(a, b, c, d))
        {

            movechess(a, b, c, d);

        }
        else
        {
            printf("你不能这样做\n");
        }

    }
    else if (map[a][b].id == redchess[4])//红方将
    {

        if (jiang(a, b, c, d))
        {
            movechess(a, b, c, d);
        }
        else
        {
            printf("你不能这样做!\n");
        }
    }

    else if (map[a][b].id == blackchess[6])//黑方兵
    {
        if (map[a][b].river == false)
        {
            if (bing(a, b, c, d))
            {
                movechess(a, b, c, d);

                if (d > 4)
                {
                    map[c][d].river = true;
                }
            }
            else
            {
                printf("你不可以这样做!\n");
            }
        }
        else
        {
            if (bing(a, b, c, d) && d >= b)
            {
                movechess(a, b, c, d);

            }
            else
            {
                printf("你不可以这样做\n");
            }
        }
    }
    else if (map[a][b].id == redchess[6])//红方兵
    {
        if (map[a][b].river == false)
        {
            if (bing(a, b, c, d))
            {
                movechess(a, b, c, d);

                if (d < 5)
                {
                    map[c][d].river = true;
                }
            }
            else
            {
                printf("你不可以这样做!\n");
            }
        }
        else
        {
            if (bing(a, b, c, d) && d <= b)
            {
                movechess(a, b, c, d);

            }
            else
            {
                printf("你不可以这样做!\n");
            }
        }
    }
    else if (map[a][b].id == blackchess[5] || map[a][b].id == redchess[5])
    {
        if (pao(a, b, c, d))
        {
            movechess(a, b, c, d);

        }
        else
        {
            printf("你不能这样做!\n");
        }

    }
    else if (map[a][b].id == blackchess[0] || map[a][b].id == redchess[0])
    {
        if (che(a, b, c, d))
        {
            movechess(a, b, c, d);

        }
        else
        {
            printf("你不可以这样做!\n");
        }
    }
    else if (map[a][b].id == blackchess[1] || map[a][b].id == redchess[1])
    {


        if (ma(a, b, c, d))
        {
            movechess(a, b, c, d);


        }
        else
        {
            printf("你不能这样做!\n");
        }

    }
    else if (map[a][b].id == blackchess[2] || map[a][b].id == redchess[2])
    {
        if (xiang(a, b, c, d))
        {
            movechess(a, b, c, d);

        }
        else
            printf("你不能这样做!\n");

    }
    else if (map[a][b].id == blackchess[3])
    {
        if (shi(a, b, c, d))
        {
            movechess(a, b, c, d);

        }
        else
            printf("你不能这样做!");
    }
    else if (map[a][b].id == redchess[3])
    {
        if (shi(a, b, c, d))
        {
            movechess(a, b, c, d);

        }
        else
            printf("你不能这样做!");
    }
}

定义完上面所有的函数,最后就是主函数,运行就可以了

int main()
{
    begining();
    while (1)//当正确的时候
    {
        coord();//输出棋盘
        win();
        BeginBatchDraw();
        /*这个函数用于开始批量绘图。执行后
        任何绘图操作都将暂时不输出到绘图窗口上,直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出。*/
        //运行BeginBatchDraw后,所有的绘图都不再显示在屏幕上,而是在内存中进行
        //封装的双缓存,避免闪屏
        /*那如果我们能让打印的过程不显示出来,只显示打印完后的显示缓冲区不就行了吗*/
        while (win() == 2)//平局状态,是不是还需要继续运行下去?
        {
            win();
            putimage(0, 0, &img);
            getbackground();//输出棋子
            MouseControl();//鼠标更改数据
            FlushBatchDraw();/*这个函数用于执行未完成的绘制任务。*/

        }

        putimage(0, 0, &img);
        getbackground();//输出棋子
        MouseControl();//鼠标更改数据
        FlushBatchDraw();/*这个函数用于执行未完成的绘制任务。*/
        if (win() == 0)
        {
            printf("红方胜!\n");
        }
        else if (win() == 1)
        {
            printf("黑方胜!\n");

        }
    }
    getchar();

    return 0;
}

总代码:

#include<stdio.h>
#include<graphics.h>
#include<math.h>
void execute(int a, int b, int c, int d);
bool jiang(int a, int b, int  c, int d);
bool pao(int a, int b, int c, int d);
bool ma(int a, int b, int c, int d);
IMAGE img;
#define distance  35//窗口线与棋盘边界线的距离
#define   longth  65//棋盘方格的长
#define   high   61//棋盘方格的宽
struct movecoordinate
{
    long x;
    long y;
};
struct  Chesscoordinate//棋子综合信息
{
    int x;
    int y;
    DWORD type;  //颜色
    bool river;//是否过河
    int id;
};
enum pieces
{
    SPACE = -1,
    車, 馬, 象, 士, 将, 炮, 卒,
    车, 马, 相, 仕, 帥, 砲, 兵,
    BEGIN, END,

};
enum pieces redchess[] = { 車,馬,象,士,将,炮,卒, };
enum pieces blackchess[] = { 车,马,相,仕,帥,砲,兵, };
enum pieces state = BEGIN;
struct move {  //鼠标选中的棋子
    int beginx;
    int beginy;
    int endx;
    int endy;
    int state;
}moving = { -1,-1,-1,-1,BEGIN };
const char* chessname[] = { "車","馬","象","士","将","炮","卒","车","马","相","仕","帥","砲","兵", };
struct Chesscoordinate  map[9][10];//坐标
struct Chesscoordinate  AImap[9][10];//坐标
movecoordinate begin = { -1,-1 }, end = { -1,-1 };
int  xx(int a)//数组下标转换成坐标
{
    a = distance + longth * a;
    return a;
}
int  yy(int a)
{
    a = distance + high * a;
    return a;
}
void begining()
{
    loadimage(&img, "D:/program/Project3-chess successful/1.png");
    initgraph(img.getwidth(), img.getheight(), 1); //初始化图形系统
    putimage(0, 0, &img);//输出开始界面;

}
void  qiban()
{
    loadimage(&img, "D:/program/Project3-chess successful/1.png");
    initgraph(img.getwidth(), img.getheight(), 1);
    putimage(0, 0, &img);//输出棋盘
}
void  coord()//棋子信息赋值
{
    loadimage(&img, "D:/program/Project3-chess successful/1.png");
    putimage(0, 0, &img);//输出棋盘

    for (int i = 0; i <= 8; i++)
    {

        for (int j = 0; j <= 9; j++)//遍历二维数组
        {
            enum pieces chessid = SPACE;//先把全部位置的id赋值为SAPCE
            DWORD  chesstype;//定义颜色中间变量
            if (j <= 4)
            {
                chesstype = BLACK;//黑方
                if (j == 0)
                {
                    if (i <= 4)
                    {
                        chessid = blackchess[i];//
                    }
                    else
                    {
                        chessid = blackchess[8 - i];
                    }

                }
                if (j == 2 && (i == 1 || i == 7))
                {
                    chessid = blackchess[5];

                }

                if (j == 3 && (i == 0 || i == 2 || i == 4 || i == 4 || i == 6 || i == 8))
                {
                    chessid = blackchess[6];
                }

            }
            else
            {
                chesstype = RED;//红方
                if (j == 6 && (i == 0 || i == 2 || i == 4 || i == 6 || i == 8))
                {
                    chessid = redchess[6];
                }
                if (j == 7 && (i == 1 || i == 7))
                {
                    chessid = redchess[5];

                }

                if (j == 9)
                {

                    if (i <= 4)
                    {
                        chessid = redchess[i];
                    }
                    else
                    {
                        chessid = redchess[8 - i];
                    }
                }

            }//依次赋值
            map[i][j].id = chessid;
            map[i][j].river = false;
            map[i][j].type = chesstype;
            map[i][j].x = distance + longth * i;
            map[i][j].y = distance + high * j;

        }
    }
    for (int i = 0; i <= 8; i++)
    {
        for (int j = 0; j <= 9; j++)
        {
            if (map[i][j].id == SPACE)
            {
                map[i][j].type = YELLOW;
            }
        }
    }

}
void getbackground() //画棋子
{
    int x_start, y_start;
    x_start = distance;
    y_start = distance;

    settextstyle(30, 0, "黑体");//棋子大小颜色
    setbkmode(0);
    for (int i = 0; i <= 8; i++)
    {

        for (int j = 0; j <= 9; j++)
        {

            if (map[i][j].id != SPACE)//在棋盘上输出
            {
                setfillcolor(RGB(253, 216, 161));
                //    setlinestyle(BLACK);
                settextcolor(map[i][j].type);
                fillcircle(map[i][j].x, map[i][j].y, 24);
                fillcircle(map[i][j].x, map[i][j].y, 18);
                outtextxy(map[i][j].x - 13, map[i][j].y - 13, chessname[map[i][j].id]);

            }
        }
    }

}
void movechess(int a, int b, int c, int d)//移动棋子,改变其坐标
{

    map[c][d].id = map[a][b].id;
    map[c][d].river = map[a][b].river;
    map[c][d].type = map[a][b].type;
    map[c][d].x = xx(c);
    map[c][d].y = yy(d);
    map[a][b].id = SPACE;
    map[a][b].type = YELLOW;


}

void MouseControl()//获取鼠标点击信息并完响应
{
    //getbackground();
    if (MouseHit())
    {

        float beginrow, beginrol, endrow, endrol;//第一次按下时的坐标
        int intbeginrow, intbeginrol, intendrow, intendrol;//第二次按下时的坐标
        MOUSEMSG msg = GetMouseMsg();/*这个函数用于获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待。*/
        if (msg.uMsg == WM_LBUTTONDOWN)//按下鼠标左键时
        {
            //获取鼠标点击的数组的下标
        //    printf("(%d,%d)", msg.x, msg.y);
            //回溯转换成行列
            beginrow = (float)(msg.x - distance) / longth;
            beginrol = (float)(msg.y - distance) / high;

            intbeginrow = round(beginrow);
            intbeginrol = round(beginrol);

            if (moving.state == BEGIN)
            {
                moving.state = END;
                moving.beginx = intbeginrow;
                moving.beginy = intbeginrol;
                //    printf("(%d,%d)  \n", moving.beginx, moving.beginy);
            }
            else if (moving.state == END)
            {

                moving.state = BEGIN;
                moving.endx = intbeginrow;
                moving.endy = intbeginrol;

                execute(moving.beginx, moving.beginy, moving.endx, moving.endy);


            }


        }

    }

}


int  win()
{
    int redgeneral = 0;
    int blackgeneral = 0;
    for (int i = 0; i <= 8; i++)
    {
        for (int j = 0; j <= 9; j++)
        {
            if (map[i][j].id == blackchess[4])
            {
                blackgeneral++;
            }
            else if (map[i][j].id == redchess[4])
            {
                redgeneral++;
            }
            else
            {
                blackgeneral = blackgeneral;
                redgeneral = redgeneral;
            }
        }
    }

    //printf("%d %d\n", blackgeneral, redgeneral);

    if (blackgeneral == 0)//红方胜
    {
        return 0;

    }
    else if (redgeneral == 0)//黑方胜
    {

        return 1;
    }
    else//打平
    {
        return 2;
    }


}
bool jiang(int a, int b, int  c, int d)//判断是否只移动了一格(将军、兵的规则)
{

    float h;
    h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    if (b < 4 && c > 2 && c < 6 && d < 3)
    {
        if (h == 1 && map[c][d].type != map[a][b].type)
            return true;
        else
            return false;
    }
    if (b > 4 && c > 2 && c < 6 && d >6)
    {
        if (h == 1 && map[c][d].type != map[a][b].type)
            return true;
        else
            return false;
    }
    else
    {
        return false;
    }

}
bool bing(int a, int b, int c, int d)
{
    float h;
    h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    if (map[a][b].type == BLACK)
    {
        if (map[a][b].river == false)
        {
            if (d == b + 1 && h == 1 && map[c][d].type != map[a][b].type)
            {
                return true;

            }
            else
            {
                return false;
            }
        }
        else
        {
            if (d >= b && h == 1 && map[c][d].type != map[a][b].type)
            {
                return true;

            }
            else
            {
                return false;
            }
        }
    }
    else if (map[a][b].type == RED)
    {
        if (map[a][b].river == false)
        {
            if (d == b - 1 && h == 1 && map[c][d].type != map[a][b].type)
            {
                return true;

            }
            else
            {
                return false;
            }
        }
        else
        {
            if (d <= b && h == 1 && map[c][d].type != map[a][b].type)
            {
                return true;

            }
            else
            {
                return false;
            }
        }
    }
    else
    {
        return false;
    }
}
bool pao(int a, int b, int c, int d)//炮的移动
{
    if (c == a && d != b)
    {
        int time = 0;
        int max = d > b ? d : b;
        int min = b < d ? b : d;
        for (int i = min; i <= max; i++)
        {
            if (map[c][i].id != SPACE)
            {
                time++;
            }

        }
        //    printf("%d\n", time);
        if (map[c][d].id == SPACE)
        {
            if (time == 1)
                return  true;
            else
                return false;
        }
        if (map[c][d].id != SPACE)
        {

            if (time != 3)
            {
                return false;
            }
            else
            {
                if (map[c][d].type == map[a][b].type)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }


        }

    }
    else if (d == b && c != a)
    {
        int time = 0;
        int max = a > c ? a : c;
        int min = c < a ? c : a;
        for (int i = min; i <= max; i++)
        {
            if (map[i][d].id != SPACE)
            {
                time++;
            }
        }
        //    printf("%d\n", time);
        if (map[c][d].id == SPACE)
        {
            if (time == 1)
                return  true;
            else
                return false;
        }
        if (map[c][d].id != SPACE)
        {

            if (time != 3)
            {
                return false;
            }
            else
            {
                if (map[c][d].type == map[a][b].type)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }


        }
    }
    else
    {
        return false;
    }
}
bool che(int a, int b, int c, int d)
{

    if (c == a && d != b)//是否为直线
    {

        int time = 0;
        int max = d > b ? d : b;
        int min = b < d ? b : d;
        for (int i = min; i <= max; i++)//遍历路径
        {


            if (map[c][i].id != SPACE)
            {
                time++;
            }


        }
        //    printf("%d", time);
        if (time == 1)//车移动不吃棋子
        {
            return true;

        }
        if (time == 2)//车移动并且吃目的坐标的棋子
        {
            if (map[c][d].type == map[a][b].type)//如果是目的坐标是自己的棋子,则返回false
            {
                return false;
            }
            if (map[c][d].type == YELLOW)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        else
        {
            return false;
        }
    }
    else    if (d == b && c != a)
    {
        int time = 0;
        int max = c > a ? c : a;
        int min = a < c ? a : c;
        for (int i = min; i <= max; i++)//遍历路径
        {
            if (map[i][d].id != SPACE)
            {
                time++;
            }

        }
        //    printf("%d", time);
        if (time == 1)//车是否车跳棋
        {
            return true;
        }
        else if (time == 2)
        {
            if (map[c][d].type == map[a][b].type)
            {
                return false;
            }
            if (map[c][d].type == YELLOW)
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        else
        {
            return false;
        }
    }
    else
    {
        return 0;
    }
}
bool ma(int a, int b, int c, int d)
{
    float h;
    h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    //    printf("%f", h);
    if (h <= 2 || h >= 2.5)//根号8=2.8.根号5=2.2
    {
        //    printf("太远了!\n");
        return  false;
    }
    else
    {
        int xx, yy, max, min;//关键点的坐标和中间值
        max = abs(d - b) > abs(c - a) ? abs(d - b) : abs(c - a);
        min = abs(c - a) < abs(d - b) ? abs(c - a) : abs(d - b);
        //printf("max\min:(%d,%d)", max, min);
        if (max == abs(d - b))
        {
            yy = b + (d - b) / 2;
            xx = a;
        }
        else
        {
            xx = a + (c - a) / 2;
            yy = b;
        }
        //    printf("xx\yy:(%d,%d)\n", xx, yy);
        if (map[xx][yy].id == SPACE)
        {
            if (map[c][d].type != map[a][b].type)
            {
                //    printf("目的坐标(%d,%d)\n", c, d);
                //    printf("那是你自己的棋子!\n");
                return true;
            }
            else
            {
                //    printf("那是你的棋子!\n");
                return false;
            }

        }
        else
        {
            //    printf("关键位置有棋子!\n");
            return false;
        }
    }
}
bool xiang(int a, int b, int c, int d)
{

    float h;
    h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    if (b <= 4)
    {
        if (d > 4)
        {
            return false;
        }
        else
        {
            if (h < 2.4 || h>2.9)
            {
                return false;
            }
            else
            {
                int xx = (a + c) / 2;
                int yy = (b + d) / 2;
                if (map[xx][yy].id == SPACE)
                {
                    if (map[c][d].type == map[a][b].type)
                    {
                        return false;
                    }
                    else
                    {
                        return true;

                    }
                }
                else
                {
                    return false;
                }
            }
        }

    }
    else
    {
        if (d < 5)
        {
            return false;
        }
        else
        {
            if (h < 2.4 || h>2.9)
            {
                return false;
            }
            else
            {
                int xx = (a + c) / 2;
                int yy = (b + d) / 2;
                if (map[xx][yy].id == SPACE)
                {
                    if (map[c][d].type == map[a][b].type)
                    {
                        return false;
                    }
                    else
                    {
                        return true;

                    }
                }
                else
                {
                    return false;
                }
            }
        }
    }


}
bool shi(int a, int b, int c, int d)
{
    float h = sqrt(abs(d - b) * abs(d - b) + abs(c - a) * abs(c - a));
    //  printf("%f", h)

    if (b < 5)
    {
        if (c >= 3 && c <= 5 && d <= 2)
        {

            if (1.2 < h && h < 1.5)
            {
                if (map[c][d].type != map[a][b].type)
                    return true;
                else
                    return false;

            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    else if (b > 5)
    {
        if (c >= 3 && c <= 5 && d >= 7)
        {

            if (1.2 < h && h < 1.5)
            {
                if (map[c][d].type != map[a][b].type)
                    return true;
                else
                    return false;

            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    else
        return false;
}
void execute(int a, int b, int c, int d)//行棋
{
    if (map[a][b].id == blackchess[4])//黑方将
    {
        if (jiang(a, b, c, d))
        {

            movechess(a, b, c, d);

        }
        else
        {
            printf("你不能这样做\n");
        }

    }
    else if (map[a][b].id == redchess[4])//红方将
    {

        if (jiang(a, b, c, d))
        {
            movechess(a, b, c, d);
        }
        else
        {
            printf("你不能这样做!\n");
        }
    }

    else if (map[a][b].id == blackchess[6])//黑方兵
    {
        if (map[a][b].river == false)
        {
            if (bing(a, b, c, d))
            {
                movechess(a, b, c, d);

                if (d > 4)
                {
                    map[c][d].river = true;
                }
            }
            else
            {
                printf("你不可以这样做!\n");
            }
        }
        else
        {
            if (bing(a, b, c, d) && d >= b)
            {
                movechess(a, b, c, d);

            }
            else
            {
                printf("你不可以这样做\n");
            }
        }
    }
    else if (map[a][b].id == redchess[6])//红方兵
    {
        if (map[a][b].river == false)
        {
            if (bing(a, b, c, d))
            {
                movechess(a, b, c, d);

                if (d < 5)
                {
                    map[c][d].river = true;
                }
            }
            else
            {
                printf("你不可以这样做!\n");
            }
        }
        else
        {
            if (bing(a, b, c, d) && d <= b)
            {
                movechess(a, b, c, d);

            }
            else
            {
                printf("你不可以这样做!\n");
            }
        }
    }
    else if (map[a][b].id == blackchess[5] || map[a][b].id == redchess[5])
    {
        if (pao(a, b, c, d))
        {
            movechess(a, b, c, d);

        }
        else
        {
            printf("你不能这样做!\n");
        }

    }
    else if (map[a][b].id == blackchess[0] || map[a][b].id == redchess[0])
    {
        if (che(a, b, c, d))
        {
            movechess(a, b, c, d);

        }
        else
        {
            printf("你不可以这样做!\n");
        }
    }
    else if (map[a][b].id == blackchess[1] || map[a][b].id == redchess[1])
    {


        if (ma(a, b, c, d))
        {
            movechess(a, b, c, d);


        }
        else
        {
            printf("你不能这样做!\n");
        }

    }
    else if (map[a][b].id == blackchess[2] || map[a][b].id == redchess[2])
    {
        if (xiang(a, b, c, d))
        {
            movechess(a, b, c, d);

        }
        else
            printf("你不能这样做!\n");

    }
    else if (map[a][b].id == blackchess[3])
    {
        if (shi(a, b, c, d))
        {
            movechess(a, b, c, d);

        }
        else
            printf("你不能这样做!");
    }
    else if (map[a][b].id == redchess[3])
    {
        if (shi(a, b, c, d))
        {
            movechess(a, b, c, d);

        }
        else
            printf("你不能这样做!");
    }
}
int main()
{
    begining();
    while (1)//当正确的时候
    {
        coord();//输出棋盘
        win();
        BeginBatchDraw();
        /*这个函数用于开始批量绘图。执行后
        任何绘图操作都将暂时不输出到绘图窗口上,直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出。*/
        //运行BeginBatchDraw后,所有的绘图都不再显示在屏幕上,而是在内存中进行
        //封装的双缓存,避免闪屏
        /*那如果我们能让打印的过程不显示出来,只显示打印完后的显示缓冲区不就行了吗*/
        while (win() == 2)//平局状态,是不是还需要继续运行下去?
        {
            win();
            putimage(0, 0, &img);
            getbackground();//输出棋子
            MouseControl();//鼠标更改数据
            FlushBatchDraw();/*这个函数用于执行未完成的绘制任务。*/

        }

        putimage(0, 0, &img);
        getbackground();//输出棋子
        MouseControl();//鼠标更改数据
        FlushBatchDraw();/*这个函数用于执行未完成的绘制任务。*/
        if (win() == 0)
        {
            printf("红方胜!\n");
        }
        else if (win() == 1)
        {
            printf("黑方胜!\n");

        }
    }
    getchar();

    return 0;
}

总代码参考于:

(1条消息) 基于c语言的象棋游戏_m0_59564114的博客-CSDN博客_c语言象棋游戏代码

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

01 导论【计量经济学及stata应用】

配套教材&#xff1a;《计量经济学及stata应用.陈强.2015.高等教育出版社》 官方课程链接&#xff1a;http://www.econometrics-stata.com/ 官方公众微信号&#xff1a;econometrics-stata 写博客的初衷就是为了督促自己把所学的知识进行整理和完善&#xff0c;我将于接下来的时…

性能测试-CPU性能分析,用户态us高,初步定位到代码行

监控工具安装 Grafana:安装请看我上一篇文章性能测试-JMeter influxdb grafana性能测试监控平台-食用指南_Tommy.IT的博客-CSDN博客JMeter测试脚本跑起来&#xff0c;在influxdb服务看看数据里面的数据&#xff0c;原来influxdb的jmeter库里面没有表&#xff0c;当JMeter脚本运…

PyCharm+PyQT5之三界面与逻辑的分离

之二的例程已经实现了界面与逻辑的分离,所建立的 Dialog Mainwindow 或者 widgets 等,界面改变其主调程序(暂且这样叫)更改,或者不需要大规模更改, 主调函数的程序是这样的 import sys import FistUI from PyQt5.QtWidgets import QApplication, QMainWindow,QDialog if __nam…

KubeSphere 多行日志采集方案深度探索

作者&#xff1a;大飞哥&#xff0c;视源电子运维工程师&#xff0c;KubeSphere 用户委员会广州站站长 采集落盘日志 日志采集&#xff0c;通常使用 EFK 架构&#xff0c;即 ElasticSearch,Filebeat,Kibana&#xff0c;这是在主机日志采集上非常成熟的方案&#xff0c;但在容器…

React Server Component: 混合式渲染

作者&#xff1a;谢奇璇 React 官方对 Server Comopnent 是这样介绍的: zero-bundle-size React Server Components。 这是一种实验性探索&#xff0c;但相信该探索是个未来 React 发展的方向&#xff0c;与 React Server Component 相关的周边生态正在积极的建设当中。 术语…

R语言主成分分析可视化(颜值高,很详细)

文章目录PCA特征值可视化提取变量结果变量结果可视化变量和主成分的cos2可视化变量对主成分的贡献可视化Dimension description提取样本结果样本结果可视化样本的cos2可视化样本对主成分的贡献可视化biplot参考资料网络上很多R语言教程都是基于R语言实战进行修改&#xff0c;今…

Mysql密码忘记后怎么重置密码,mysql8之后有改动

mysql8之前的修改方式&#xff1a; 1.管理员身份打开cmd&#xff1a;然后关闭mysql&#xff0c;停止MySQL服务&#xff0c;输入 net stop mysql 停止服务 2.切换到MySQL的bin文件下&#xff0c;输入mysqld --console --skip-grant-tables --shared-memory。 3上个窗口保留不要…

四种类型自编码器AutoEncoder理解及代码实现

自编码器&#xff08;AE&#xff09; 自编码器的结构和思想 结构 自编码器是一种无监督的数据压缩和数据特征表达方法。自编码器是神经网络的一种&#xff0c;经过训练后的能尝试将输入复制到输出。自编码器由编码器和解码器组成。如下图所示&#xff1a; 自编码器指的是试图…

电脑键盘功能基础知识,快速入门,抓住这份详细教程

在互联网生活发达的今天&#xff0c;电脑已经成为了学习工作的必备工具。而用来操作电脑的关键&#xff0c;就是我们经常使用的键盘和鼠标。最近有不少的小伙伴来私信小编&#xff0c;希望小编做一个电脑键盘功能基础知识介绍的详细教程。这不&#xff0c;小编应大家要求&#…

视频编解码 - RTP 与 RTCP

目录 RTP 实时传输协议 RTCP协议 将H264 RTP打包 RTP 实时传输协议 音视频数据传输&#xff0c;先将原始数据经过编码压缩后&#xff0c;将码流打包成一个个RTP包&#xff0c;再将码流传输到接收端。 打包的作用 接收端要正确地使用这些音视频编码数据&#xff0c;不仅仅需…

深度学习之路=====12=====>>MNasNet(tensorflow2)

简介 原文&#xff1a; MnasNet: Platform-Aware Neural Architecture Search for Mobile 来源: CVPR2019 作者&#xff1a; Google (Mingxing Tan, Bo Chen, Ruoming Pang, Vijay Vasudevan, Mark Sandler, Andrew Howard, Quoc V. Le) 摘要: 使用神经结构搜索(neural archit…

界面控件DevExpress WPF的主题设计器,可轻松完成应用主题研发

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF的The…

一文详解|高校到底如何开展数据分类分级?

数据安全是高校的生命线&#xff0c;在数据安全合规要求不断升级的大背景下&#xff0c;加强数据有效保护&#xff0c;确保数据安全共享应用&#xff0c;已成为高校信息化建设的前线。 安全高楼平地起&#xff0c;作为数据安全建设的基础工作&#xff0c;通过数据分类分级&…

1541_AURIX_TriCore内核架构_内核调试控制器CDC

全部学习汇总&#xff1a; GitHub - GreyZhang/g_tricore_architecture: some learning note about tricore architecture. 这一份笔记可能会是我近段时间来最后的一份内核学习笔记了。我看了下内核手册分为上下两部分&#xff0c;而下卷主要的内容其实是讲解指令集&#xff0c…

如何用CSS画一个三角形?

hello&#xff0c;大家好&#xff0c;最近在看前端的八股&#xff0c;里面有这样一道题&#xff0c;如何用CSS画出三角形&#xff1f;我想以这个题为例&#xff0c;仔细讲一下这个题的技巧&#xff0c;以及对这道题拓展一下&#xff0c;即如何画出圆形和椭圆形&#xff1f; 首…

GFS分布式

GFS是什么&#xff1f; 1.1 简单介绍 这个问题说大也大&#xff0c;说小也小。GFS是Google File System的缩写&#xff0c;字面意义上就是Google的文件系统&#xff0c;技术层面上来讲&#xff0c;GFS是Google在2003年前后创建的可扩展分布式文件系统 &#xff0c;用来满足 Goo…

SpringBoot 接收客户端提交数据/参数会使用到相关注解

目录 一.基本介绍 二.接收参数相关注解应用实例 1.需求: 2.应用实例演示 2.1演示PathVariable 使用 2.2.演示RequestHeader 使用 2.3演示RequestParam 使用 2.4演示CookieValue 使用 2.5演示RequestBody 使用 2.6演示RequestAttribute&#xff0c;SessionAttribute 使…

C语言基础知识

目录 第一章 C语言概述 第二章 数据类型 运算符 表达式 第三章 简单的C程序设计 第四章 选择循环结构 第五章 数组 ​第六章 函数 第七章 编译预处理 第八章 指针 第九章 结构体与共用体 第一章 C语言概述 C语言的特点&#xff1a; 语言简洁、紧凑&#xff1b;使用…

安卓实训作孽之Linux命令手册

文章目录前言演示效果项目地址实现UI进度条实现读取文件获取路径进度条刷新总结前言 开局之前先吐槽一句&#xff0c;NC学校&#xff0c;以及NC老师&#xff0c;还要搞两个作品&#xff0c;上午上课下午实训真牛皮&#xff08;XS&#xff09;。好了废话不多说我们开始吧&#…

进阶自动化测试,你一定要知道的...

自动化测试指软件测试的自动化&#xff0c;在预设状态下运行应用程序或系统&#xff0c;预设条件包括正常和异常&#xff0c;最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 自动化测试框架一般可以分为两个层次&#xff0c;上层是管理整个自动化测试的开发&a…