大富翁游戏出场顺序与获奖关系

  • 对于大富翁游戏的简单建模
  • 主程序
  • 得到所有玩家的幸运星列表
  • 规则判断与执行
  • 支付玩家过路费&得到玩家到达地点
  • 选择是否购买该地
  • 找到破产的玩家
  • 处理位置点
  • 获胜者分布
  • 获胜者资金分布

对于大富翁游戏的简单建模

昨天晚上和朋友们一起玩大富翁游戏,玩了几局总是输,我怀疑先出发的玩家大概率是赢家。于是和一朋友利用matlab对游戏进行仿真。游戏规则已经简化,但基本符合我们的游戏规则。下面是代码部分。
主程序。

主程序

clear;clc;
dbstop if error
%% 模拟大富翁
tic
ITER = 2000;
winer = cell(ITER,11);
for TIMES = 1:ITER% 定义地图D.placedata = [2400,200,1200,6000,11000,1000,1200;3000,300,1600,7000,13000,1500,1500;2600,300,1600,7000,13000,1500,1300;2800,300,1600,7000,13000,1500,1400;2600,300,1600,7000,13000,1500,1300;3200,400,2000,8000,16000,2000,1600;3600,400,2000,8000,16000,2000,1800;2200,200,1200,6000,11000,1000,1100;3400,400,2000,8000,16000,2000,1700;2200,200,1200,6000,11000,1000,1100;2400,200,1200,6000,11000,1000,1200;3200,400,2000,8000,16000,2000,1600;2800,300,1600,7000,13000,1500,1400;3400,400,2000,8000,16000,2000,1700;3000,300,1600,7000,13000,1500,1500;3600,400,2000,8000,16000,2000,1800;2000,3000,6000,9000,12000,+inf,1000;2000,3000,6000,9000,12000,+inf,1000;2000,3000,6000,9000,12000,+inf,1000;2000,3000,6000,9000,12000,+inf,1000;];% 0表示起始地,+2000,1-16表示地点索引,17-20表示连锁地点,-1表示机会和命运,-2表示获得一枚幸运星,-3表示什么也不做D.map = [0,1,17,2,-1,3,4,-1,5,-2,-1,6,7,18,8,-3,-1,9,10,11,12,19,-1,20,-3,13,14,-1,15,16];% 第一列为目前所在地,第二列为目前所有金钱,第三列为目前持有空地,目前持有一星地,二星地,三星地,现状态 0为正常,1为跳过% 第八列为幸运星个数 第九列为在抵押房产,第十列为是否已经遍历,第十一列为玩家索引D.N = 4;%N个玩家D.starts = 7;%幸运星个数为7D.people = cell(D.N,11);%初始化目前所在地for i = 1:size(D.people,1)D.people{i,1} = 1;D.people{i,2} = 15000;D.people{i,7} = 0;D.people{i,10} = 0;D.people{i,11} = i;endturns = 0;while true%一局%循环遍历每个玩家player = 1;while true%一轮if size(D.people,1)==1breakendD.people{player,10} = 1;%如果要跳过,则跳过if D.people{player,7}==1D.people{player,7} = 0;if sum(cell2mat(D.people(:,10))) ~= size(D.people,1)player = find(cell2mat(D.people(:,10)) == 0);player = player(1);continueelsebreakendend%随机抛色子dian = randperm(6,1);[D.people{player,1},tf] = chulidian(D.people{player,1}+dian);%得到现在地点是什么内容if tf == 1 %如果经历了原点D.people{player,2} = D.people{player,2}+2000;endcontent = D.map(D.people{player,1});%         D = contentcheck(D);if content == 0elseif content == -2D.people{player,8} = D.people{player,8}+1;D = xingyunxingcheck(D,player);elseif content == -1D = destinyandchance(D,player);elseif content == -3else[D,tf] = paycheck(D,player);if tf ~= 1%如果没有破产则进行购买检测D = buycheck(D,player);%                 else%如果破产则找到下一个玩家%                     if sum(cell2mat(D.people(:,10))) ~= size(D.people,1)%                         player = find(cell2mat(D.people(:,10)) == 0);%                         player = player(1);%                     else%                         break%                     endendend
%             disp(sum(cell2mat(D.people(:,10))))
%             disp(size(D.people,1))
%             disp('-----------------------------------')if sum(cell2mat(D.people(:,10))) ~= size(D.people,1)player = find(cell2mat(D.people(:,10)) == 0);player = player(1);elsebreakendend%         for i = 1:size(D.people,1)%             if isempty(D.people(i,1))%                 D.people(i,:) = [];%             end%         end%将所有玩家的被访问信息置零for i = 1:size(D.people,1)D.people{i,10} = 0;endturns = turns+1;if size(D.people,1) == 1breakendendwiner(TIMES,:) = D.people;clear Ddisp(TIMES)
end
%% 结果分析
%检查最后获胜玩家和投色子的先后顺序的关系
win = zeros(ITER,1);
money = zeros(ITER,1);
for i = 1:size(winer,1)win(i) = winer{i,11};money(i) = winer{i,2};
end
figure(1)
histogram(win)
figure(2)
histogram(money)
toc%%xlswrite('wind.xls', win);
xlswrite('money.xls', money);

得到所有玩家的幸运星列表

function Dout = xingyunxingcheck(D,player)
%得到所有玩家的幸运星列表
startslist = cell2mat(D.people(:,8));
% 如果幸运星被分配完,则选取最多的几位玩家随机在自己地盘上盖房子
if sum(startslist)==D.starts%统计该玩家有多少块地以及可以建房屋的地di = D.people(player,3:5);%统计这些地建一所房屋需要花费多少钱,优先建造有2所房屋的地方for i = 3:-1:1if isempty(di(i))continueelsehouseidx = cell2mat(di(i));houseconprice = D.placedata(houseidx,6);houseconprice(houseconprice==+inf) = [];if isempty(houseconprice)continueelse%取最大的一个建造价格,造房子[house,houseidx] = find(houseconprice==max(houseconprice));house = house(1);houseidx = houseidx(1);D.people{player,i}(houseidx) = [];D.people{player,i+1}(end+1) = house;breakendendend%将所有玩家幸运星清零for i = 1:size(D.people,1)D.people{i,8} = 0;endendDout = D;

规则判断与执行

function Dout = destinyandchance(D,player)
object = [1,1,2,2,3,3,4,4,5,6,7,8,9,10,11,11];
len = length(object);
r = randperm(len,1);
event = object(r);
if event == 1%减一个幸运星D.people{player,8} = D.people{player,8}-1;
elseif event == 2%加一个幸运星D.people{player,8} = D.people{player,8}+1;D = xingyunxingcheck(D,player);
elseif event == 3%让该玩家与另一玩家减500tempplayer = randperm(size(D.people,1),1);while tempplayer == playertempplayer = randperm(size(D.people,1),1);end%找到tempplayer的初始编号startind = D.people{tempplayer,11};D.people{player,2} = D.people{player,2}-500;D.people{tempplayer,2} = D.people{tempplayer,2}-500;D = breakcheck(D,player);[~,row] = ismember(startind,cell2mat(D.people(:,11)));D = breakcheck(D,row);
elseif event == 4%让该玩家减750D.people{player,2} = D.people{player,2}-750;D = breakcheck(D,player);
elseif event == 5%让该玩家减100D.people{player,2} = D.people{player,2}-100;D = breakcheck(D,player);
elseif event == 6%让该玩家减200D.people{player,2} = D.people{player,2}-200;D = breakcheck(D,player);
elseif event == 7%让该玩家减500D.people{player,2} = D.people{player,2}-500;D = breakcheck(D,player);
elseif event == 8%让该玩家加1850D.people{player,2} = D.people{player,2}-1850;
elseif event == 9%让该玩家加1000D.people{player,2} = D.people{player,2}-1850;
elseif event == 10%加3000停一轮D.people{player,2} = D.people{player,2}+3000;D.people{player,7} = 1;
elseif event == 11%2/3 stop 1/3 nothingif rand()<2/3D.people{player,7} = 1;end
end
Dout = D;

支付玩家过路费&得到玩家到达地点

function [Dout,tf] = paycheck(D,player)
%支付玩家过路费
%得到玩家到达地点
dian = D.map(D.people{player,1});
%判断地点的归属
tempplayer = 0;
for i = 1:size(D.people,1)for j = 3:6if ismember(dian,D.people{i,j})tempplayer = i;breakendendif tempplayer ~=0breakend
end
if tempplayer ~= 0 %支付玩家乾D.people{tempplayer,2} = D.people{tempplayer,2}+D.placedata(dian,j-1);D.people{player,2} = D.people{player,2}-D.placedata(dian,j-1);[D,tf] = breakcheck(D,player);
elsetf = 0;
end
Dout = D;

选择是否购买该地

function Dout = buycheck(D,player)
%选择是否购买该地
%得到该土地购买价格
dian = D.map(D.people{player,1});
price = D.placedata(dian,1);
%得到该玩家剩余乾数量
res = D.people{player,2};
%如果剩余乾数量大于土地购买价格则购买土地
%判断地点的归属
tempplayer = 0;
for i = 1:size(D.people,1)for j = 3:6if ismember(dian,D.people{i,j})tempplayer = i;breakendendif tempplayer ~=0breakend
end
%如果没有人拥有这件地产则选择够不够买
if tempplayer == 0 if price<resD.people{player,2} = D.people{player,2}-price;D.people{player,3}(end+1) = dian;end
end
%如果土地是自己的则选择是不是购买绿房子
if tempplayer == playerif j ~= 6upgradeprice = D.placedata(dian,6);upgradeprice(upgradeprice==+inf) = [];if ~isempty(upgradeprice)if upgradeprice<res%升级房屋D.people{player,j}(D.people{player,j}==dian) = [];D.people{player,j+1}(end+1) = dian;endendend
end
Dout = D;

找到破产的玩家

function [Dout,tf] = breakcheck(D,player)
tf = 0;
%找到破产的玩家
own = D.people{player,2};
if own<0%得到该玩家欠债数%清算该玩家的房产house = D.people(player,3:6);%先卖房屋数量少的房产for i = 1:4payoff = 0;h = house{i};if ~isempty(h)%将抵押费从小到大排序hmortgage = D.placedata(h,7);hmortgage(hmortgage == +inf) = [];[val,ind] = sort(hmortgage,'ascend');hmortgage = val;j = 1;while true%首先卖掉所有房子own = own+(i-1)*0.5*D.placedata(ind(j),6);%将该房产绿色房子数量减至0D.people{player,i+2}(ind(j)) = [];D.people{player,3}(end+1) = h(ind(j));if own < 0%卖掉该房屋own = own+D.placedata(ind(j),7);D.people{player,3}(end) = [];D.people{player,9}(end+1) = h(ind(j));endif own >0payoff = 1;breakendhmortgage(j) = [];if isempty(hmortgage)breakelse[val,ind] = sort(hmortgage,'ascend');hmortgage = val;endendif payoff == 1breakendendendif payoff == 1D.people{player,2} = own;elseD.people(player,:) = [];tf = 1;endend
Dout = D;

处理位置点

function [dian,tf] = chulidian(data)
if sum(data>30)>0tf = 1;
elsetf = 0;
enddata(data>30) = data(data>30)-30;dian = data;
end

获胜者分布

获胜者资金分布

附加 朋友文章

大富翁银行游戏盘——泰国之旅相关推荐

  1. 无盘服务器游戏盘尺寸,网吧无盘游戏服务器 案例五

    成都DIY组装网吧服务器 游戏服务器 可带120-150台电脑 DIY服务器超微 X10SRL-F 10*SATA3方案五 此配置适用于无盘网吧游戏服务器,在这里,我给客户简单介绍一下方案五的配置.此 ...

  2. 游戏AI探索之旅:从AlphaGo到MOBA游戏

    背景:7月28日,腾讯云在北京举办云+社区沙龙,邀请来自腾讯与四川云检科技的五位AI技术专家,分享他们在专业领域的AI开发经验,帮助开发者在具体行业场景中实践AI技术.本文根据王亮在[7.28日腾讯云 ...

  3. php 写一个大富翁游戏,C++大富翁代码 现在要设计一个类似“大富翁”的游戏:有一条由20个格子组成的 联合开发网 - pudn.com...

    C++大富翁代码 所属分类:Windows编程 开发工具:C/C++ 文件大小:349KB 下载次数:6 上传日期:2018-05-15 21:11:38 上 传 者:红黑二叉树 说明:  现在要设计 ...

  4. 开启我的游戏引擎学习之旅

    也不能说是在自己内心中酝酿了许久的一个计划,毕竟以我目前的能力,想要从零到一地写一个哪怕是比较简单的游戏引擎仍旧是一个十分有难度的工作.仅仅是能达到"能够熟练使用Unity进行开发" ...

  5. JAVA 实现《大富翁》游戏|CSDN创作打卡

    前言 大富翁,又名地产大亨.是一种多人策略图版游戏.参与者分得游戏金钱,凭运气(掷骰子)及交易策略,买地.建楼以赚取租金.英文原名monopoly意为"垄断",因为最后只得一个胜利 ...

  6. 手机游戏AI探索之旅:从AlphaGo到MOBA游戏

    讲师介绍 王亮,腾讯AI高级研究员.2013年加入腾讯,从事大数据预测以及游戏AI研发工作.目前主要从事MOBA类游戏AI相关的研发工作. 本次分享大纲 今天分享的课题是游戏AI探索之旅.本次分享分为 ...

  7. cs6制作拼图游戏 dreamweaver_DIY硬纸板拼图华容道游戏盘

    家里给小孩子买过大大小小的拼图,同一个图案的拼图玩的多了小孩子的兴趣也就没有了.而且,买来的拼图都有同样的问题:容易散落,容易缺失.怎么样保持小孩子对拼图的兴趣,当然是要不停地让他可以有新的图案可以玩 ...

  8. 《大富翁手机游戏开发实战》 开始发售,目录如下

    <大富翁手机游戏开发实战--基于Cocos2d-x 3.2引擎>现已登陆各大网络销售平台发售! 部分网售地址: 当当:http://product.dangdang.com/2378178 ...

  9. 《大富翁手机游戏开发实战--基于Cocos2d-x 3.2引擎》现已登陆各大网络销售平台发售

    <大富翁手机游戏开发实战--基于Cocos2d-x 3.2引擎>现已登陆各大网络销售平台发售! 部分网售地址: 当当:http://product.dangdang.com/2378178 ...

最新文章

  1. coreseek最大检索数只有1000的问题!
  2. 织梦lamp环境搭建
  3. 基本电子电路系列——MOS管
  4. 深入理解nodejs的HTTP处理流程
  5. 入门demo---Mybatis学习笔记(三)
  6. Ubuntu14.04配置python接口,测试的小问题
  7. 谈谈struts2的工作原理
  8. python调用钉钉接口_关于钉钉接口使用Python,Post 500报错
  9. Debian从光盘apt-get
  10. UI控件Telerik UI for Silverlight发布R2 2019|附下载
  11. vue项目强制清除页面缓存
  12. YouTube Java API入门
  13. 苹果计算机 win10,苹果怎么装win10苹果装win10详细教程【图文】
  14. 深度linux系统wifi信号变弱,在Deepin 20社区版下WiFi网速变慢的处理
  15. RN8209C单相电量计量芯片调试记录
  16. 硬件原理图Checklist检查表(通用版)
  17. ACM-ICPC 2018 南京赛区网络预赛(ABCDEFGHIJKL所有题题解大全)
  18. 使用Java计算文件的MD5值(含修改MD5值的方法)
  19. ElastricSearch打分简介
  20. 测试1测试1测试1测试1

热门文章

  1. android 抢红包切图,【Flutter工具】fmaker:自动生成倍率切图/自动更换App图标
  2. 计算机网络教室使用登记表,计算机教室管理制度
  3. 线路中央计算机系统(LCC)的功能有哪些,AFC系统介绍PPT主题课件.ppt
  4. facebook会入华吗?
  5. Visual Studio 2022在线安装教程
  6. sqlmap测试靶机
  7. LoRa无线技术与LoRaWAN网关模块的区别
  8. 如何解决“缺失kernelbase.dll”问题?kernelbase.dll的修复问题
  9. 【Vite】vite与js的结合
  10. python制作app windows_你想要的Python软件不支持Windows?来这里找支持版!