国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++ 中國象棋的實現流程詳解

C++ 中國象棋的實現流程詳解

2022-02-28 14:46MAX在碼字 C/C++

中國象棋是起源于中國的一種棋,屬于二人對抗性游戲的一種,在中國有著悠久的歷史。由于用具簡單,趣味性強,成為流行極為廣泛的棋藝活動

C++ 中國象棋的實現流程詳解

中國象棋的中國棋文化,也是中華民族的文化瑰寶,它源遠流長,趣味濃厚,基本規則簡明易懂。中國象棋在中國的群眾中基礎遠遠超過圍棋,是普及最廣的棋類項目,中國象棋已流傳到十幾個國家和地區。 中國象棋使用方形格狀棋盤,圓形棋子共有32個,紅黑二色各有16個棋子,擺放和活動在交叉點上。雙方交替行棋,先把對方的將(帥)“將死”的一方獲勝。

我們今天就來看看我們自己能不能寫出這樣一個游戲呢?

今天就不話不多說了,先說一下,今天我們做的是一個簡易版的單機中國象棋,希望大家理解,聯網對弈的話需要用到的知識過多,數據庫以及網絡協議這些大部分同學都沒有學,所以我們今天就簡單的實現《中國象棋》的簡單對弈,主要是希望同學們可以理解其中的邏輯關系,之后就可以更好的去完善

行吧,我們現在就開始吧!!!

今天先出場的就不是我們的老朋友結構體了,而是我們的新朋友枚舉類型

?
1
2
3
4
5
6
7
8
9
10
11
12
enum Pieces //棋子
{
    NONE = -1,
    車, 馬, 象, 士, 將, 砲, 卒,
    俥, 馬, 相, 仕, 帥, 炮, 兵,
    BEGIN, END,
};
//給id賦值
enum Pieces redChess[] = { 車, 馬, 象, 士, 將, 砲, 卒 };
enum Pieces blackChess[] = { 俥, 馬, 相, 仕, 帥, 炮, 兵 };
//繪制時轉化成字符串
const char* ChessName[] = { "車","馬","象","士","將","砲","卒","俥", "馬", "相", "仕", "帥", "炮", "兵" };

接下來出場的是我們的老朋友結構體

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//每一個棋子的屬性
struct Chess
{
    enum Pieces id;     //棋子名稱
    DWORD type;         //棋子類型,紅?黑?
    short x;
    short y;
    bool  isRiver;          //是否過了河
};
 
//游戲地圖
struct Chess map[ROW][COL];
 
struct State
{
    int begr;
    int begc;
    int endr;
    int endc;
    int state;
}state = {-1,-1,-1,-1,BEGIN};

我們的初始化函數,一定要想好其中的邏輯

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//初始化數據
void init()
{
    //遍歷地圖
    for (size_t i = 0; i < ROW; i++)
    {
        size_t temp = 0;
        for (size_t k = 0; k < COL; k++)
        {
            map[i][k].id = NONE;    //先把棋子置為沒有
            if (i <= 4)  //黑棋子
            {
                map[i][k].type = BLACK;
                if (i == 0) //放置第一行的棋子
                {
                //0 1 2 3 4
                if (k <= 4)
                {
                    temp = k;
                }
                // 3 2 1 0
                else
                {
                    // k == 5
                    temp = 4 - (k - 4);
                    /*
                    4 - (5-4)   //3
                    4 - (6-4)   //2
                    4 - (7-4)   //1
                    4 - (8-4)   //0
                    */
                }
                map[i][k].id = blackChess[temp];
                }
                //設置炮
                if (i == 2 && (k == 1 || k == 7))
                {
                    map[i][k].id = blackChess[5];
                }
                //設置兵
                if (i == 3 && k % 2 == 0)
                {
                    map[i][k].id = blackChess[6];
                }
            }
            else       //紅棋
            {
            map[i][k].type = RED;
            if (i == 9) //放置第一行的棋子
            {
                //0 1 2 3 4
                if (k <= 4)
                {
                    temp = k;
                }
                // 3 2 1 0
                else
                {
                    // k == 5
                    temp = 4 - (k - 4);
                    /*
                    4 - (5-4)   //3
                    4 - (6-4)   //2
                    4 - (7-4)   //1
                    4 - (8-4)   //0
                    */
                }
                map[i][k].id = redChess[temp];
            }
            //設置炮
            if (i == 7 && (k == 1 || k == 7))
            {
                map[i][k].id = redChess[5];
            }
            //設置兵
            if (i == 6 && k % 2 == 0)
            {
                map[i][k].id = redChess[6];
            }
            }
            map[i][k].isRiver = false;
            map[i][k].x = k * GRID_SIZE + INTERVAL;
            map[i][k].y = i * GRID_SIZE + INTERVAL;
        }
    }
}

接下來是我們的繪制函數

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//繪制
void draw()
{
    setfillcolor(RGB(252, 215, 162));
    setlinestyle(PS_SOLID, 2);
    //設置文字的樣式
    settextstyle(30, 0, "楷體");
    for (size_t i = 0; i < ROW; i++)
    {
        for (size_t k = 0; k < COL; k++)
        {
            if (map[i][k].id == NONE)
                continue;
            settextcolor(map[i][k].type);
            setlinecolor(map[i][k].type);
            //繪制棋子
            fillcircle(map[i][k].x, map[i][k].y, 30);
            fillcircle(map[i][k].x, map[i][k].y, 25);
            outtextxy(map[i][k].x - 15, map[i][k].y - 15, ChessName[map[i][k].id]);
        }
    }
}

后面是我們的重點,鼠標控制函數,以后類似的游戲項目都會有這樣的函數,好好理解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//鼠標操作
void mouseEvent()
{
    ExMessage msg;  //定義消息結構體變量
    if(peekmessage(&msg, EM_MOUSE))
    {
        if (msg.message == WM_LBUTTONDOWN)  //鼠標左鍵按下
        {
            //通過鼠標坐標得出點擊的數組的下標
            //k * GRID_SIZE + INTERVAL = x;
            int col = (msg.x - INTERVAL) / GRID_SIZE;
            int row = (msg.y - INTERVAL) / GRID_SIZE;
 
            //下標校準
            if (msg.x > map[row][col].x + 30 && msg.y < map[row][col].y + 30)
            {
                col++;
            }
            if (msg.x < map[row][col].x + 30 && msg.y > map[row][col].y + 30)
            {
                row++;
            }
            if (msg.x > map[row][col].x + 30 && msg.y > map[row][col].y + 30)
            {
                row++;
                col++;
            }
            //printf("(%d %d)\n", row, col);
 
            if (state.state == BEGIN)
            {
                state.begr = row;
                state.begc = col;
                state.state = END;
            }
            else if (state.state == END)
            {
                state.endr = row;
                state.endc = col;
                state.state = BEGIN;
            }
            chessMove();
        }
    }
}

重點中的重點,棋子的移動函數,游戲的規則也就在這里體現出來

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
//移動棋子
void chessMove()
{
    printf("beg(%d %d) end(%d %d)\n", state.begr, state.begc, state.endr, state.endc);
    bool canMove = false;
    //什么情況下能夠移動棋子
    if (!(state.begr == state.endr && state.begc == state.endc) &&  //點擊的不是同一個棋子
        state.endr!=-1 && state.begr!=-1&&      //下標必須合法
        map[state.begr][state.begc].id != NONE//沒有棋子不能移動
        /*&&map[state.begr][state.begc].type != map[state.endr][state.endc].type*/) //不能自己吃自己
    {
 
        switch (map[state.begr][state.begc].id)
        {
        case 車:
        case 俥:
            if (state.begr == state.endr || state.begc == state.endc)
            {
                //起始點和結束點之間是否有阻礙
                if (hasBlock(&state))
                {
                    canMove = true;
                }
            
            }
            break;
        case 馬:
        case 馬:
            break;
        case 象:
        case 相:
            break;
        case 士:
        case 仕:
            break;
        case 將:
        case 帥:
            break;
        case 砲:
        case 炮:
            break;
        case 卒:
        case 兵:
            break;
        default:
            break;
        }
        if (canMove)
        {
            printf("canMove\n");
            map[state.endr][state.endc].id = map[state.begr][state.begc].id;
            map[state.begr][state.begc].id = NONE;
 
            map[state.endr][state.endc].isRiver = map[state.begr][state.begc].isRiver;
            map[state.endr][state.endc].type = map[state.begr][state.begc].type;
        }
    }
}

最后就是我們的主函數,進行調用,讓項目運行起來

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int main()
{
    //創建圖形窗口
    initgraph(740, 820,EW_SHOWCONSOLE);
    //設置背景模式
    setbkmode(TRANSPARENT);
    //貼棋盤
    IMAGE img_board;
    loadimage(&img_board, "./res/ChessBoard.png");
    
 
    init();
    //雙緩沖繪圖,防止閃屏
    BeginBatchDraw();
    while (true)
    {
        cleardevice();
        putimage(0, 0, &img_board);
        draw();
        mouseEvent();
 
        FlushBatchDraw();
    }
    EndBatchDraw();
 
 
    getchar();
    return 0;
}

這樣一個簡易版的《中國象棋》游戲項目就解決啦,重點就是邏輯,一定要想清楚,想要實現聯網的同學就要更加的去想清楚,以及去提高自己的能力,好啦,希望可以讓大家從中感受到編程的快樂吧,也希望大家可以給UP主一個關注,非常感謝大家了!!!

C++ 中國象棋的實現流程詳解

到此這篇關于C++ 中國象棋的實現流程詳解的文章就介紹到這了,更多相關C++ 中國象棋內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/weixin_45713725/article/details/121161188

延伸 · 閱讀

精彩推薦
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
主站蜘蛛池模板: 久久综合一区二区 | 日韩高清国产一区在线 | 亚洲高清视频在线 | 日韩精品在线一区二区 | 久久久久久国产精品 | 激情久久免费视频 | 国产免费黄色 | 久久爱电影| 中文字幕视频在线 | 秋霞av亚洲一区二区三 | 欧美高清一区二区 | 国产一区二区影院 | h视频免费观看 | 中文字幕 国产精品 | 九九热这里都是精品 | 国产精品99一区二区三区 | 欧美自拍视频 | 免费啪啪网站 | 中文字幕高清视频 | 久久视频一区 | 成人国产精品视频 | 国产精品中文字幕在线观看 | 欧美一级片aaa | 天天爽夜夜爽夜夜爽精品视频 | 亚洲欧美在线一区 | 久久蜜桃av一区二区天堂 | 龙珠z中文版普通话 | 欧美日韩一区二区在线 | 黄色a站| 欧美视频第一页 | 国产高清在线观看 | 在线观看一级黄色片 | 欧美一级裸体视频 | 在线小视频国产 | 成年片 | 国产精品亚洲第一区在线暖暖韩国 | 成人午夜性a一级毛片免费看 | 亚洲精品电影在线观看 | 国产精品99一区二区三区 | 色欧美片视频在线观看 | 黄色一级片免费 |