最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Matlab實現(xiàn)中國象棋的示例代碼

 更新時間:2022年02月08日 10:30:43   作者:abcwsp  
中國象棋是起源于中國的一種棋,屬于二人對抗性游戲的一種,在中國有著悠久的歷史。由于用具簡單,趣味性強,成為流行極為廣泛的棋藝活動。本文將利用Matlab實現(xiàn)這一游戲,需要的可以參考一下

設置變量

nRowNum = 8; % 畫布行數(shù)
nColNum = 9; % 畫布列數(shù)
offset_x = 0;% 紅車坐標起點
offset_y = 0;% 紅車坐標起點
chess_name = {{'帥','仕','相','馬','車','炮','兵'},{'將','仕','象','馬','車','炮','卒'}};
chess_type = [5 4 3 2 1 2 3 4 5 6 6 7 7 7 7 7]; % 存儲下棋類型
colors = 'rk';
% global variables
chess_x = -ones(2,16);
chess_y = -ones(2,16);
pos_chess = zeros(nRowNum+1,nColNum+1);% 存儲棋子位置
cur_turn = 1; % cur_turn為紅色表示1
cur_cid = 0;
hText = zeros(2,16);

繪圖

繪制棋盤

function DrawBoard()
    for k = 1:2
        for r = 1:nRowNum+1
            x = [(k-1)*5 4+(k-1)*5];
            y = [(r-1) (r-1)];
            plot(x,y,'b-')
        end
        for c = 1:nColNum+1
            x = [(c-1) (c-1)];
            y = [0 nRowNum];
            plot(x,y,'b-')
        end
        x = [0 2] + (k-1)*7;
        y = [3 5];
        plot(x,y,'b-')
        x = [0 2] + (k-1)*7;
        y = [5 3];
        plot(x,y,'b-')
    end 
    text(4.5,1.2,'楚        河                            漢        界','rotation',90)
    end 

繪制棋子

    function DrawAllChess()
    for k = 1:2
        for i = 1:16
            if i>9
                plot(chess_x(k,i),chess_y(k,i),'d','MarkerSize',15)
            end
            h(k,i)=plot(chess_x(k,i),chess_y(k,i),'MarkerSize',70,'Color',colors(k),'marker','.');%改進
            hText(k,i) = text(chess_x(k,i)-0.35,chess_y(k,i),['\fontsize{20}' chess_name{k}{chess_type(i)}],'color','w');
        end
    end
    DrawStart
    DrawEnd
    DrawHelp
   end

棋子移動規(guī)則

判斷是否可以移動

function flag = CanMove(x,y)
    flag = 1;
    oldx = chess_x(cur_turn,cur_cid);
    oldy = chess_y(cur_turn,cur_cid);
    switch chess_type(cur_cid)
        case 1% 將
            % move 1 step
            if ~(x==oldx && abs(y-oldy)==1) && ~(y==oldy && abs(x-oldx)==1)
                flag = 0;
                return
            end
            % out area
            if cur_turn==1
                if ~(x>=0 && x<=2 && y>=3 && y<=5)
                    flag = 0;
                    return
                end
            else
                if ~(x>=7 && x<=9 && y>=3 && y<=5)
                    flag = 0;
                    return
                end
            end
        case 2% 士
            % move 1 step
            if ~(abs(x-oldx)==1 && abs(y-oldy)==1)
                flag = 0;
                return
            end
            % out area
            if cur_turn==1
                if ~(x>=0 && x<=2 && y>=3 && y<=5)
                    flag = 0;
                    return
                end
            else
                if ~(x>=7 && x<=9 && y>=3 && y<=5)
                    flag = 0;
                    return
                end
            end
        case 3% 象
            % move 1 step
            if ~(abs(x-oldx)==2 && abs(y-oldy)==2)
                flag = 0;
                return
            end
            % out area
            if cur_turn==1
                if ~(x>=0 && x<=4)
                    flag = 0;
                    return
                end
            else
                if ~(x>=5 && x<=9)
                    flag = 0;
                    return
                end
            end
            % in the way
            mx = (x+oldx)/2;
            my = (y+oldy)/2;
            if pos_chess(my+1,mx+1)~=0
                flag = 0;
                return
            end
        case 4% 馬
            % move 1 step
            if ~(abs(x-oldx)==1 && abs(y-oldy)==2) && ~(abs(x-oldx)==2 && abs(y-oldy)==1)
                flag = 0;
                return
            end
            % in the way
            if abs(y-oldy)==2
                mx = oldx;
                my = (y+oldy)/2;
            else
                mx = (x+oldx)/2;
                my = oldy;
            end
            if pos_chess(my+1,mx+1)~=0
                flag = 0;
                return
            end
        case 5% 車
            if ~(x==oldx && y~=oldy) && ~(x~=oldx && y==oldy)
                flag = 0;
                return
            end
            % no chess in the way
            if x==oldx
                inc = 1;
                if oldy>y
                    inc = -1;
                end
                if ~isempty(find(pos_chess(oldy+1+inc:inc:y+1-inc,x+1)~=0))
                    flag = 0;
                    return
                end
            else
                inc = 1;
                if oldx>x
                    inc = -1;
                end
                if ~isempty(find(pos_chess(y+1,oldx+1+inc:inc:x+1-inc)~=0))
                    flag = 0;
                    return
                end
            end
        case 6% 炮
            if ~(x==oldx && y~=oldy) && ~(x~=oldx && y==oldy)
                flag = 0;
                return
            end
            % no chess in the way
            if x==oldx
                inc = 1;
                if oldy>y
                    inc = -1;
                end
                if pos_chess(y+1,x+1)~=0
                    if ~(length(find(pos_chess(oldy+1+inc:inc:y+1-inc,x+1)~=0))==1)
                        flag = 0;
                        return
                    end
                else
                    if ~(isempty(find(pos_chess(oldy+1+inc:inc:y+1-inc,x+1)~=0)))
                        flag = 0;
                        return
                    end
                end
            else
                inc = 1;
                if oldx>x
                    inc = -1;
                end
                if pos_chess(y+1,x+1)~=0
                    if ~(length(find(pos_chess(y+1,oldx+1+inc:inc:x+1-inc)~=0))==1)
                        flag = 0;
                        return
                    end
                else
                    if ~(isempty(find(pos_chess(y+1,oldx+1+inc:inc:x+1-inc)~=0)))
                        flag = 0;
                        return
                    end
                end
            end
        case 7% 兵
            if cur_turn==1
                if oldx<=4
                    if ~(y==oldy&&x-oldx==1)
                        flag = 0;
                        return
                    end
                else% pass river
                    if ~(y==oldy&&x-oldx==1) && ~(abs(y-oldy)==1&&x==oldx)
                        flag = 0;
                        return
                    end
                end
            else
                if oldx>=5
                    if ~(y==oldy&&x-oldx==-1)
                        flag = 0;
                        return
                    end
                else% pass river
                    if ~(y==oldy&&x-oldx==-1) && ~(abs(y-oldy)==1&&x==oldx)
                        flag = 0;
                        return
                    end
                end
            end
    end
    end

移動棋子

    function MoveChess(x,y)
    set(h(cur_turn,cur_cid),'xdata',x,'ydata',y)%改進,移動棋子到新位置
    set(hText(cur_turn,cur_cid),'Position',[x-0.35 y]);
    pos_chess(chess_y(cur_turn,cur_cid)+1,chess_x(cur_turn,cur_cid)+1) = 0;
    pos_chess(y+1,x+1) = cur_cid+(cur_turn-1)*16;
    chess_x(cur_turn,cur_cid) = x;
    chess_y(cur_turn,cur_cid) = y;
   
    end

吃子

    function KillChess(kt,kc)
    set(hText(kt,kc),'visible','off');%殺掉棋子
    set(h(kt,kc),'visible','off');
    MoveChess(chess_x(kt,kc),chess_y(kt,kc));
    ChangeTurn();
    sname = {'紅','黑'};
    if kc==5
        msgbox([sname{3-kt} '方獲勝!'], '象棋', 'modal');
    end
    end

以上就是基于Matlab實現(xiàn)中國象棋的示例代碼的詳細內容,更多關于Matlab中國象棋的資料請關注腳本之家其它相關文章!

相關文章

  • C語言巧用二分查找實現(xiàn)猜數(shù)游戲

    C語言巧用二分查找實現(xiàn)猜數(shù)游戲

    二分查找也稱折半查找(Binary?Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須采用順序存儲結構,而且表中元素按關鍵字有序排列,本篇文章教你用二分查找編寫猜數(shù)字游戲
    2022-02-02
  • C++使用OpenCV進行物體識別與檢測的三種方法

    C++使用OpenCV進行物體識別與檢測的三種方法

    物體識別與檢測是計算機視覺中的核心任務之一,它被廣泛應用于自動駕駛、安防監(jiān)控、圖像分析等領域,通過物體檢測技術,計算機能夠從圖像中識別出特定的物體或目標,本文將介紹如何使用 C++ 和 OpenCV 庫進行物體識別與檢測,需要的朋友可以參考下
    2025-04-04
  • Qt開發(fā)實現(xiàn)跨窗口信號槽通信

    Qt開發(fā)實現(xiàn)跨窗口信號槽通信

    這篇文章主要為大家詳細介紹了Qt開發(fā)實現(xiàn)跨窗口信號槽通信,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語言版實現(xiàn)鏈隊列

    C語言版實現(xiàn)鏈隊列

    這篇文章主要為大家詳細介紹了C語言版實現(xiàn)鏈隊列,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 基于Qt OpenCV的圖像灰度化像素操作詳解

    基于Qt OpenCV的圖像灰度化像素操作詳解

    這篇文章主要為大家詳細介紹了基于Qt+OpenCV的圖像灰度化像素操作:最大值法、平均法、加權平均值法,感興趣的小伙伴可以了解一下
    2022-07-07
  • C++ 基類指針和子類指針相互賦值的實現(xiàn)方法

    C++ 基類指針和子類指針相互賦值的實現(xiàn)方法

    下面小編就為大家?guī)硪黄狢++ 基類指針和子類指針相互賦值的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++關于樹的定義全面梳理

    C++關于樹的定義全面梳理

    樹是一種重要的非線性數(shù)據(jù)結構,直觀地看,它是數(shù)據(jù)元素(在樹中稱為結點)按分支關系組織起來的結構,很象自然界中的樹那樣。樹結構在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構都可用樹形象表示,本篇介紹二叉樹的遞歸與非遞歸遍歷的方法
    2022-06-06
  • Qt實現(xiàn)簡易QQ聊天界面

    Qt實現(xiàn)簡易QQ聊天界面

    這篇文章主要為大家詳細介紹了Qt實現(xiàn)簡易QQ聊天界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言 實現(xiàn)遍歷一個文件夾的所有文件

    C語言 實現(xiàn)遍歷一個文件夾的所有文件

    這篇文章主要介紹了C語言 實現(xiàn)遍歷一個文件夾的所有文件的相關資料,需要的朋友可以參考下
    2017-01-01
  • C語言超詳細講解輪轉數(shù)組

    C語言超詳細講解輪轉數(shù)組

    這篇文章主要給大家講解輪轉數(shù)組的問題,一個問題不局限于一種解法,希望你看了本文的解決方法以后可以舉一反三自己編寫,這樣你的技術水平會有質的提高
    2022-04-04

最新評論

五常市| 逊克县| 桐城市| 青铜峡市| 鹤岗市| 邛崃市| 喀喇沁旗| 鹤山市| 汾西县| 固始县| 广安市| 漠河县| 西林县| 平凉市| 大洼县| 乌海市| 鸡东县| 包头市| 崇信县| 龙陵县| 紫云| 申扎县| 尚志市| SHOW| 平定县| 瓦房店市| 鄂托克旗| 承德市| 长春市| 翁源县| 鹤岗市| 丽江市| 胶南市| 聂荣县| 菏泽市| 正宁县| 绩溪县| 营山县| 阿克苏市| 沙雅县| 鞍山市|