📄 blackjack.m
字号:
function [P,bet] = playhand(hand,P,D,bet)% Play player's handwhile value(P) < 21 % 0 = stand % 1 = hit % 2 = double down if any(mod(P,13)==1) & valuehard(P)<=10 strat = soft(value(P)-11,value(D(1))); else strat = hard(value(P),value(D(1))); end if length(P) > 2 & strat == 2 strat = 1; end if ~isempty(hand) show(hand,P) show('Dealer',D) strat = bjbuttonclick('hit',strat+1,length(P)>2); end switch strat case 0 break case 1 P = [P deal]; case 2 % Double down. % Double bet and get one more card bet = 2*bet; P = [P deal]; break otherwise break endend% ------------------------function s = payoff(who,P,D,split,bet)% Payoffdetail = ~isempty(who);fs = 20;valP = value(P);valD = value(D);if valP == 21 & length(P) == 2 & ... ~(valD == 21 & length(D) == 2) & ~split s = 1.5*bet; if detail, str = ['BLACKJACK: +' int2str(s)]; endelseif valP > 21 s = -bet; if detail, str = ['BUST: ' int2str(s)]; endelseif valD > 21 s = bet; str = ['WIN: +' int2str(s)]; if detail text(min(1.5*length(D)-4.5,2.75),-2.5,'BUST','fontsize',fs) endelseif valD > valP s = -bet; if detail, str = ['LOSE: ' int2str(s)]; endelseif valD < valP s = bet; if detail, str = ['WIN: +' int2str(s)]; endelse s = 0; if detail, str = 'PUSH'; endendif detail x = min(1.5*length(P)-4.5,2.75); if isequal(who,'Player') y = 2.5; else y = 0; end text(x,y,str,'fontsize',fs)end% ------------------------function show(who,H)% Displays one handswitch who case 'Player', y = 2.5; case 'Split', y = 0; case 'Dealer', y = -2.5;endx = -4;for j = 1:length(H) card(x,y,H(j),length(H)) x = x + 1.5;end% ------------------------function card(x,y,v,gray)% card(x,y,v) plots v-th card at position (x,y).z = exp((0:16)/16*pi/2*i)/16;edge = [z+1/2+7*i/8 i*z-1/2+7*i/8 -z-1/2-7*i/8 -i*z+1/2-7*i/8 9/16+7*i/8];pips = {'A','2','3','4','5','6','7','8','9','10','J','Q','K'};if v <= 0 % Hole card patch(real(edge)+x,imag(edge)+y,[0 0 2/3])else fs = 20; s = ceil(v/13); v = mod(v-1,13)+1; x1 = x; if v==10, x1 = x1-.2; end offwhite = [1 1 1]; if y == 0 & gray == 1, offwhite = [.75 .75 .75]; end patch(real(edge)+x,imag(edge)+y,offwhite) switch s case {1,4}, redblack = [0 0 0]; case {2,3}, redblack = [2/3 0 0]; end if ispc % PC has symbol font with card suits. text(x1-.2,y,pips{v},'fontname','courier','fontsize',fs, ... 'fontweight','bold','color',redblack) text(x,y+.025,char(166+s),'fontname','symbol','fontsize',fs, ... 'color',redblack) else text(x1-.1,y,pips{v},'fontname','courier','fontsize',fs, ... 'fontweight','bold','color',redblack) endend% ------------------------function val = bjbuttonclick(kase,basic,disable)bjb = bjbuttons(kase);if nargin == 3 & disable set(bjb(3),'enable','off')endif nargin >= 2 set(bjb(basic),'fore','red')endwhile all(cell2mat(get(bjb,'val')) == 0) drawnowendval = find(cell2mat(get(bjb,'val')))-1;% ------------------------function bjb = bjbuttons(kase)bjb = findobj(gcf,'style','toggle');if isempty(bjb) for b = 3:-1:1 bjb(b,1) = uicontrol('units','normal','style','toggle', ... 'pos',[.95-.18*b .02 .16 .08],'fontweight','bold'); endendset(bjb,'fore','black')switch kase case {1,2} switch kase case 1 fs = 12; y = .02; dy = .08; case 2 fs = 10; y = .01; dy = .06; end for b = 1:3 set(bjb(b),'pos',[.95-.18*b y .16 dy]) end set(bjb,'val',0,'vis','on','enable','on','fontsize',fs) set(bjb(1),'string','Close') set(bjb(2),'string','Play') set(bjb(3),'string','Simulate') set(bjb(kase+1),'fore','red') case 'detail' set(bjb(1:2),'vis','on') set(bjb(3),'vis','off') for b = 1:3 set(bjb(b),'pos',[.95-.18*b .02 .16 .08]) end set(bjb,'val',0,'fontsize',12) case 'off' set(bjb,'vis','off') case 'split' set(bjb,'val',0,'fontsize',12) set(bjb(1),'string','Keep') set(bjb(2),'string','Split') case 'hit' set(bjb,'val',0,'vis','on','fontsize',12) set(bjb(1),'string','Stand') set(bjb(2),'string','Hit') set(bjb(3),'string','Double')end% ------------------------function strat = hard(p,d)% Strategy for hands without aces.% strategy = hard(player's_total,dealer's_upcard)% 0 = stand% 1 = hit% 2 = double downpersistent HARDif isempty(HARD) n = NaN; % Not possible % Dealer shows: % 2 3 4 5 6 7 8 9 T A HARD = [ ... 1 n n n n n n n n n n 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 4 1 1 1 1 1 1 1 1 1 1 5 1 1 1 1 1 1 1 1 1 1 6 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 8 1 1 1 1 1 1 1 1 1 1 9 2 2 2 2 2 1 1 1 1 1 10 2 2 2 2 2 2 2 2 1 1 11 2 2 2 2 2 2 2 2 2 2 12 1 1 0 0 0 1 1 1 1 1 13 0 0 0 0 0 1 1 1 1 1 14 0 0 0 0 0 1 1 1 1 1 15 0 0 0 0 0 1 1 1 1 1 16 0 0 0 0 0 1 1 1 1 1 17 0 0 0 0 0 0 0 0 0 0 18 0 0 0 0 0 0 0 0 0 0 19 0 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0];endstrat = HARD(p,d);% ------------------------function strat = soft(p,d)% Strategy array for hands with aces.% strategy = soft(player's_total,dealer's_upcard)% 0 = stand% 1 = hit% 2 = double downpersistent SOFTif isempty(SOFT) n = NaN; % Not possible % Dealer shows: % 2 3 4 5 6 7 8 9 T A SOFT = [ ... 1 n n n n n n n n n n 2 1 1 2 2 2 1 1 1 1 1 3 1 1 2 2 2 1 1 1 1 1 4 1 1 2 2 2 1 1 1 1 1 5 1 1 2 2 2 1 1 1 1 1 6 2 2 2 2 2 1 1 1 1 1 7 0 2 2 2 2 0 0 1 1 0 8 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0];endstrat = SOFT(p,d);% ------------------------function strat = pair(p,d)% Strategy for splitting pairs% strategy = pair(paired_card,dealer's_upcard)% 0 = keep pair% 1 = split pairpersistent PAIRif isempty(PAIR) n = NaN; % Not possible % Dealer shows: % 2 3 4 5 6 7 8 9 T A PAIR = [ ... 1 n n n n n n n n n n 2 1 1 1 1 1 1 0 0 0 0 3 1 1 1 1 1 1 0 0 0 0 4 0 0 0 1 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 6 1 1 1 1 1 1 0 0 0 0 7 1 1 1 1 1 1 1 0 0 0 8 1 1 1 1 1 1 1 1 1 1 9 1 1 1 1 1 0 1 1 0 0 10 0 0 0 0 0 0 0 0 0 0 11 1 1 1 1 1 1 1 1 1 1];endstrat = PAIR(p,d);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -