【游戏】基于matlab中国象棋【含Matlab源码 489期】

举报
海神之光 发表于 2022/05/29 23:00:57 2022/05/29
【摘要】 一、获取代码方式 获取代码方式1: 完整代码已上传我的资源:【游戏】基于matlab中国象棋【含Matlab源码 489期】 获取代码方式2: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获...

一、获取代码方式

获取代码方式1:
完整代码已上传我的资源:【游戏】基于matlab中国象棋【含Matlab源码 489期】

获取代码方式2:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

备注:
订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

二、部分源代码

function chess1()
% chess - Chinese chess for two players
%
% Jianjiang Feng
% 2008-01
clc
close all
h=zeros(2,16);%改进,储存棋子的句柄
% Constant values

% nSize = 60;

nRowNum = 8;
nColNum = 9;
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_cid = 0;
hText = zeros(2,16);

figure(1);
hold on
axis([-offset_x nColNum+offset_x -offset_y nRowNum+offset_y])
s = title('红');
axis equal
set(1,'name','中国象棋',...
    'menubar','figure',...
    'toolbar','none',...
    'WindowButtonDownFcn',@OnWindowButtonDown);

set(s,'string','红','color','r','fontsize',20);
InitializeChessPosition;
DrawBoard;
DrawAllChess;

% 改进
set(gca,'xtick',[])
set(gca,'ytick',[])
set(gca,'xcolor','w','ycolor','w')

    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
   end

    %-------------------
    function InitializeChessPosition()
    chess_x(:,1:9) = [zeros(1,9);9*ones(1,9)];
    chess_x(:,10:11) = [2 2;7 7];
    chess_x(:,12:16) = [3*ones(1,5); 6*ones(1,5)];
    chess_y(:,1:9) = [0:8;0:8];
    chess_y(:,10) = [1;1];
    chess_y(:,11) = [7;7];
    chess_y(:,12:16) = [0:2:8;0:2:8];
    
    pos_chess = zeros(nRowNum+1,nColNum+1);
    pos_chess(:,1) = [1:9]';
    pos_chess(:,nColNum+1) = [1:9]'+16;
    pos_chess(2,3) = 10;
    pos_chess(2,nColNum-1) = 10+16;
    pos_chess(8,3) = 11;
    pos_chess(8,nColNum-1) = 11+16;
    pos_chess(1:2:9,4) = [12:16];
    pos_chess(1:2:9,nColNum-2) = [12:16]+16;
    end

    %-------------------
    function OnWindowButtonDown(src,evnt)
    pt = get(gca,'CurrentPoint');
    x = round(pt(1,1));
    y = round(pt(1,2));
    if x<0 || x>nColNum || y<0 || y>nRowNum %判断是否在棋盘外
        return
    end
    cc = pos_chess(y+1,x+1);%如果在棋盘内,则给cc赋值
    if cc~=0
        ct = ceil(cc/16);
        cc = mod(cc,16);
        if cc == 0
            cc = 16;
        end
    end
    
    if cur_cid==0
        if cc~=0% chess clicked
            if ct==cur_turn
                cur_cid = cc;
%                 set(h(cur_turn,cur_cid),'color','g')
%                 set(hText(cur_turn,cur_cid),'Color','k');
            end
        end
    else% have current chess
        if cc~=0% chess clicked
            if cc==cur_cid && ct==cur_turn% no change
                return
            end
            if ct==cur_turn% change chess
%                 set(hText(cur_turn,cur_cid),'Color','none');
                cur_cid = cc;
                set(hText(cur_turn,cur_cid),'Color','k');
            else
                % kill
                if CanMove(x,y)==1
                    KillChess(ct,cc);
                end
            end
        else% no chess clicked, go there
            if CanMove(x,y)==1
                MoveChess(x,y);
                ChangeTurn();
            end
        end
    end
    end
    
    %-------------------
	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

三、运行结果

在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/114643547

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。