import win.ui;
import win.inputBox;
import fsys.table;
import 游戏数据;
import 游戏存档;
/*DSG{{*/
var winform = win.form(text="我是大富翁";right=399;bottom=247;max=false;min=false)
winform.add(
button={cls="button";text="开始游戏";left=128;top=112;right=274;bottom=145;z=2};
button2={cls="button";text="重新开始";left=128;top=160;right=274;bottom=193;z=4};
static={cls="static";text="我是大富翁";left=0;top=30;right=400;bottom=104;align="center";center=1;font=LOGFONT(h=-48);transparent=1;z=1};
static2={cls="static";text="提示:认真工作,健康生活!!!";left=16;top=224;right=386;bottom=240;transparent=1;z=3}
)
/*}}*/
// 检测存档
if(io.exist("/存档.txt")){
winform.button.text = "继续游戏";
}
else {
winform.button.text = "开始游戏";
}
// 游戏按钮
winform.button.oncommand = function(id,event){
if(winform.button.text = "开始游戏"){
// 角色名输入
var 输入窗口 = win.inputBox(winform.hwnd)
输入窗口.text = "我是大富翁"
输入窗口.info.text = "请在下面输入您的名字:"
var 姓名 = 输入窗口.doModal();
// 角色名验证
if(姓名 = "" or 姓名 = null){
winform.msgboxErr("未输入姓名!!!")
return ;
}
// 保存初始信息
var 存档函数 = 游戏存档.存档("\存档.txt","topsflo")
var 存档 = {}
存档.姓名 = 姓名;
存档.金钱 = 游戏数据.初始金钱
存档.仓库容量 = 游戏数据.初始仓库容量
存档.当前容量 = 游戏数据.初始仓库容量
存档.仓库商品 = {}
存档.市场信息 = 游戏数据.商品信息
存档.年 = 1;
存档.月 = 1;
存档.日 = 1;
存档.借款 =0;
存档函数.存档(存档)
}
游戏数据.结束判断 = false
winform.close()
}
winform.button2.oncommand = function(id,event){
io.remove("\存档.txt")
winform.button.text = "开始游戏"
winform.button.oncommand()
}
winform.show();
win.loopMessage();
return winform;
主界面
import win.ui;
import win.ui.grid;
import win.ui.menu;
import 游戏数据;
import 游戏存档;
/*DSG{{*/
mainForm = win.form(text="我是大富翁";right=757;bottom=467;max=false;min=false)
mainForm.add(
button={cls="button";text="刷新日期";left=64;top=416;right=176;bottom=448;z=3};
button2={cls="button";text="仓库购买";left=237;top=416;right=349;bottom=448;z=10};
button3={cls="button";text="银行借款";left=411;top=416;right=523;bottom=448;z=11};
groupbox={cls="groupbox";text="市场商品";left=64;top=56;right=344;bottom=304;edge=1;z=1};
仓库列表={cls="listview";left=424;top=80;right=688;bottom=296;edge=1;z=5};
仓库显示={cls="groupbox";text="我的仓库 容量:20";left=416;top=56;right=696;bottom=304;edge=1;z=4};
借款={cls="static";text="200";left=456;top=35;right=688;bottom=51;align="right";center=1;transparent=1;z=13};
姓名={cls="static";text="姓名:张三";left=72;top=16;right=328;bottom=32;transparent=1;z=7};
市场列表={cls="listview";left=72;top=80;right=336;bottom=296;edge=1;gridLines=1;msel=false;z=2};
日志={cls="edit";text="游戏信息:";left=64;top=312;right=696;bottom=400;edge=1;multiline=1;readonly=1;z=9};
日期={cls="static";text="2022年12月31日";left=336;top=16;right=432;bottom=32;align="center";center=1;transparent=1;z=6};
等级={cls="static";text="等级:";left=72;top=35;right=328;bottom=51;transparent=1;z=12};
金钱={cls="static";text="200";left=456;top=16;right=688;bottom=32;align="right";center=1;transparent=1;z=8}
)
/*}}*/
// 游戏登录
mainForm.loadForm("\dlg\登录窗口.aardio").doModal()
if(游戏数据.结束判断){
mainForm.close()
}
// 市场列表
var grid = win.ui.grid(mainForm.市场列表);//创建数据视图
grid.setReadonlyColumns(1,2,3);//可选设置禁止编辑的列
grid.setColumns({"商品名称";"商品价格";"商品数量"}) //可选自定义显示列名
// 库存列表
var grid2 = win.ui.grid(mainForm.仓库列表);//创建数据视图
grid2.setReadonlyColumns(1,2,3);//可选设置禁止编辑的列
grid2.setColumns({"商品名称";"商品价格";"商品数量"}) //可选自定义显示列名
// 变量
var 存档操作 = 游戏存档.存档("\存档.txt","topsflo")
var 姓名;
var 等级;
var 金钱;
var 仓库容量;
var 当前容量;
var 仓库商品;
var 年;
var 月;
var 日;
var 借款;
var 商品信息;
var 市场商品;
var 商品品种 = 5
var 签名信息;
// 自定义函数
加载存档 = function(){
var 存档 = 存档操作.读档()
if(!存档){
mainForm.msgboxErr("游戏数据损坏,请删档后重来!!!")
mainForm.close()
}
姓名 = 存档.姓名
金钱 = 存档.金钱
仓库容量 = 存档.仓库容量
当前容量 = 存档.当前容量
仓库商品 = 存档.仓库商品
商品信息 = 存档.市场信息
年 = 存档.年
月 = 存档.月
日 = 存档.日
借款 = 存档.借款
}
保存存档 = function(){
var 存档 = {}
存档.姓名 = 姓名
存档.金钱 = 金钱
存档.仓库容量 = 仓库容量
存档.当前容量 = 当前容量
存档.仓库商品 = 仓库商品
存档.市场信息 = 商品信息
存档.年 = 年
存档.月 = 月
存档.日 = 日
存档.借款 = 借款
存档操作.存档(存档)
}
游戏信息 = function(内容,状态){
if(状态 = "初始"){
mainForm.日志.text = 内容 + '\r\n'
}
else {
mainForm.日志.log( 内容,'\r\n' )
}
}
生成商品 = function(){
市场商品 = {fields={"商品名称";"商品价格";"商品数量"}}
var 随机数组 = {}
// 随机生产序号
while(true){
var 商品等级 = 5 + 等级
if(商品等级 > #商品信息){ 商品等级 = #商品信息 }
var 随机数 = math.random(1,商品等级)
if(table.find(随机数组,随机数)=null){ 随机数组[#随机数组+1] = 随机数 }
if(#随机数组 = 商品等级){ break }
}
// 生成商品信息
// 随机时间
var 随机事件 = math.random(1,20)
var 随机序号 = math.random(1,商品品种)
for(i=1;商品品种;1){
var 商品名称 = 商品信息[随机数组][1]
var 最小值_下限 = 商品信息[随机数组][2] * 90
var 最小值_上限 = 商品信息[随机数组][2] * 95
var 最大值_下限 = 商品信息[随机数组][2] * 110
var 最大值_上限 = 商品信息[随机数组][2] * 115
var 最小值 = math.floor(math.random(最小值_下限,最小值_上限)/100)
var 最大值 = math.floor(math.random(最大值_下限,最大值_上限)/100)
var 商品价格 = 0;
var 涨跌随机 = math.random(1,2)
//import console;
//console.dump(最小值,最大值,涨跌随机)
if(涨跌随机 = 1){ //跌
商品价格 = 最小值
}
else {
商品价格 = 最大值
}
var 商品数量 = math.random(10,30)
商品信息[随机数组][2] = 商品价格
if(i = 随机序号 and 随机事件 = 1){
商品价格 = math.floor(商品价格*0.5)
游戏信息("受不可控影响["+商品名称+"]价格大幅下降!!!")
}
elseif(i = 随机序号 and 随机事件 = 2){
商品价格 = math.floor(商品价格*1.5)
游戏信息("受不可控影响["+商品名称+"]价格大幅上升!!!")
}
if(商品价格 < 20 ){ 商品价格 = math.floor(math.random(20,25)) }
市场商品[#市场商品+1] = {商品名称 = 商品名称,商品价格 = 商品价格,商品数量 = 商品数量}
}
//console.log('\n')
grid.setTable( 市场商品 )
}
显示数据 = function(){
等级 = math.floor(仓库容量/10)
mainForm.姓名.text = "姓名:"+姓名
mainForm.等级.text = "等级: "+等级
mainForm.日期.text = 年+"年"+月+"月"+日+"日"
mainForm.金钱.text = "现金: "+金钱
mainForm.借款.text = "借款: " +借款
mainForm.仓库显示.text = "我的仓库 容量:" + 当前容量+"/"+仓库容量
var 仓库显示 = {fields={"商品名称";"商品价格";"商品数量"}}
for(i=1;#仓库商品;1){
仓库显示 = 仓库商品
}
grid2.setTable( 仓库显示 )
}
破产判断 = function(){
if(金钱 <= 0 and #仓库商品 = 0){
var 结果 = mainForm.msgboxTest("很遗憾,你破产了.是否重来?")
if(结果){
io.remove("\存档.txt")
mainForm.show(false)
mainForm.loadForm("\dlg\登录窗口.aardio").doModal()
mainForm.show(true)
main()
}
else {
mainForm.close()
}
}
}
更新日期 = function(){
日 += 1
if(日 > 30 ){
日 = 1
月 += 1
if(月>12){
月 = 1
年 += 1
}
}
// 收取银行利息
if(借款 > 0){
var 利息 = math.ceil(借款*0.01)
金钱 -= 利息
游戏信息("银行向你收取了["+利息+"]利息!!!")
破产判断()
}
// 收取月租费用及归还银行借款
if(日 = 30){
var 费用 = 年*月*100
金钱 -= 费用
游戏信息("月底了,向你征收了["+费用+"]月租!!!")
if(借款 >0 ){
金钱 -= 借款
游戏信息("月底了,银行收走了["+借款+"]借款!!!")
借款 = 0
}
破产判断()
}
显示数据()
}
// 弹出菜单
mainForm.popmenu = win.ui.popmenu(mainForm);
mainForm.popmenu.add('购买商品',function(id){
var 行号 = mainForm.市场列表.selIndex
var 商品名称 = mainForm.市场列表.getItemText(行号,1)
var 商品价格 = mainForm.市场列表.getItemText(行号,2)
var 商品数量 = mainForm.市场列表.getItemText(行号,3)
var inputbox = win.inputBox(mainForm.hwnd)
inputbox.text = "当前购买商品<" + 商品名称 + "> 商店价格<" + 商品价格 + "> 商店数量<" + 商品数量 + ">"
inputbox.info.text = "购买数量:"
inputbox.input.text = ""
var 购买数量 = tonumber(inputbox.doModal());
select(购买数量) {
case 1;tonumber(商品数量){
购买数量 = math.floor(购买数量)
if(购买数量 > tonumber(当前容量)){
游戏信息("玩家仓库容量不足,请调整购买数量!!!")
}
elseif(tonumber(金钱) < 购买数量 * tonumber(商品价格)){
游戏信息("玩家金钱不足,请调整购买数量!!!")
}
else {
var 花费 = 购买数量 * tonumber(商品价格)
金钱 -= 花费
当前容量 -= 购买数量
// 判断当前商品是否拥有库存
var 库存行号 = mainForm.仓库列表.findItem(商品名称)
if(库存行号 != 0){
var 库存价格 = mainForm.仓库列表.getItemText(库存行号,2)
var 库存数量 = mainForm.仓库列表.getItemText(库存行号,3)
商品价格 = (花费 + tonumber(库存价格)*tonumber(库存数量))/(tonumber(库存数量)+购买数量)
var 总数量 = 购买数量 + tonumber(库存数量)
仓库商品[库存行号] = {商品名称 = 商品名称,商品价格 = 商品价格,商品数量 = 总数量}
}
else {
仓库商品[#仓库商品+1] = {商品名称 = 商品名称,商品价格 = 商品价格,商品数量 = 购买数量}
}
// 更新信息
游戏信息("玩家购买了["+商品名称+"]*"+购买数量+",花费了"+花费)
var 剩余数量 = tonumber(商品数量) - 购买数量
mainForm.市场列表.setItemText(剩余数量,行号,3)
显示数据()
}
};
case null,"" { // 未输入或取消
};
else {//输入错误或当前库存不足
游戏信息("输入错误!!!")
};
}
} )
mainForm.popmenu.add('出售商品',function(id){
// 商店内容
var 行号 = mainForm.市场列表.selIndex
var 商品名称 = mainForm.市场列表.getItemText(行号,1)
var 商品价格 = mainForm.市场列表.getItemText(行号,2)
var 商品数量 = mainForm.市场列表.getItemText(行号,3)
// 库存内容
var 库存行号 = mainForm.仓库列表.findItem(商品名称)
var 库存价格 = mainForm.仓库列表.getItemText(库存行号,2)
var 库存数量 = mainForm.仓库列表.getItemText(库存行号,3)
var inputbox = win.inputBox(mainForm.hwnd)
inputbox.text = "当前出售商品<" + 商品名称 + "> 拥有数量<" + 库存数量 + ">"
inputbox.info.text = "出售数量:"
inputbox.input.text = 库存数量
var 出售数量 = tonumber(inputbox.doModal());
select(出售数量) {
case 1;tonumber(库存数量){
出售数量 = math.floor(出售数量)
if(出售数量 > tonumber(库存数量)){
游戏信息("玩家拥有商品数量不足,请调整购买数量!!!")
}
else {
var 收入 = 出售数量 * tonumber(商品价格)
var 税收 = math.floor(收入 * 0.03)
金钱 += 收入
金钱 -= 税收
当前容量 += 出售数量
if(出售数量 = tonumber(库存数量)){
// 刷新库存商品缓存
if(库存行号 = #仓库商品){
仓库商品[库存行号] = null
}
else {
var 索引 = 0;
仓库商品 = {}
for itemIndex in mainForm.仓库列表.each(){
var 行号 = itemIndex
if(行号 != 库存行号){
索引 += 1
var 仓库名称 = mainForm.仓库列表.getItemText(行号,1)
var 仓库价格 = mainForm.仓库列表.getItemText(行号,2)
var 仓库数量 = mainForm.仓库列表.getItemText(行号,3)
仓库商品[索引] = {商品名称 = 仓库名称,商品价格 = 仓库价格,商品数量 = 仓库数量}
}
}
}
}
else {
库存数量 = tonumber(库存数量) - 出售数量
仓库商品[库存行号] = {商品名称 = 商品名称,商品价格 = 库存价格,商品数量 = 库存数量}
}
// 更新信息
游戏信息("玩家出售了["+商品名称+"]*"+出售数量+",获得收入"+收入)
游戏信息("系统向你征收了3%商业税,你向系统支付了["+税收+"]")
显示数据()
var 剩余数量 = tonumber(商品数量) + 出售数量
mainForm.市场列表.setItemText(剩余数量,行号,3)
}
};
case null,"" { // 未输入或取消
};
else {//输入错误或当前库存不足
游戏信息("输入错误!!!")
};
}
} )
// 刷新日期
mainForm.button.oncommand = function(id,event){
游戏信息("今日信息:","初始")
生成商品()
更新日期()
保存存档()
}
// 仓库购买
mainForm.button2.oncommand = function(id,event){
var 购买价格 = math.ceil(仓库容量/10)*1000
var inputbox = win.inputBox(mainForm.hwnd)
inputbox.text = "当前仓库容量:" + 仓库容量 + " 仓库价格:"+购买价格+"X1"
inputbox.info.text = "购买数量(请输入1-10):"
inputbox.input.text = ""
var 购买数量 = tonumber(inputbox.doModal());
select(购买数量) {
case 1; 10{
购买数量 = math.floor(购买数量)
var 花费 = 购买数量 * 购买价格
if (金钱 < 花费){游戏信息("当前金额不足!!!")}
金钱 -= 花费
仓库容量 += 购买数量
当前容量 += 购买数量
// 更新信息
游戏信息("玩家购买了[仓库容量]*"+购买数量+",花费了"+花费)
显示数据()
};
case null,"" { // 未输入或取消
};
else {//输入错误或当前库存不足
游戏信息("输入错误!!!")
};
};
}
// 银行借款
mainForm.button3.oncommand = function(id,event){
if(借款 != 0){
// 存在未归还借款不能再借,月底自动还款
游戏信息("当前存在未归还借款,请下月再来!!!")
return ;
}
var inputbox = win.inputBox(mainForm.hwnd)
inputbox.text = "当前银行借款:" + 借款 + " 银行日利息:1%,月底自动收回欠款."
inputbox.info.text = "借款金钱(最大金额 年X10000):"
inputbox.input.text = 年*10000
var 借款金额 = tonumber(inputbox.doModal());
select(借款金额) {
case 1; tonumber(年)*10000{
借款金额 = math.floor(借款金额)
金钱 += 借款金额
借款 += 借款金额
// 更新信息
游戏信息("玩家向银行借了["+借款金额+"],每日扣息5%,月底自动归还本金!!!")
显示数据()
};
case null,"" { // 未输入或取消
};
else {//输入错误或当前库存不足
};
};
}
// 弹出菜单
mainForm.市场列表.onnotify = function(id,code,ptr){
select(code) {
case 0xFFFFFFFB/*_NM_RCLICK*/ {
var 行号 = mainForm.市场列表.selIndex
var 名称 = mainForm.市场列表.getItemText(行号,1)
if(行号 != 0){
mainForm.市场列表.setSelected(行号)
// 禁用出售未拥有的商品
var 结果 = mainForm.仓库列表.findItem(名称)
if(结果 = 0){
mainForm.popmenu.enable(2,false)
}
else {
mainForm.popmenu.enable(2,true)
}
mainForm.popmenu.popup();//弹出菜单
}
}
}
}
// 初始运行
main = function(){
加载存档()
显示数据()
生成商品()
if(mainForm.日期.text = "1年1月1日"){
游戏信息("欢迎富翁["+姓名+"]进入游戏"+'\r\n'+"友情提示:刷新日期后自动保存存档.","初始")
}
else {
游戏信息("欢迎富翁["+姓名+"]进入游戏,祝你生活愉快,家庭幸福!!!"+'\r\n'+"友情提示:刷新日期后自动保存存档.","初始")
}
}
main()
mainForm.show();
return win.loopMessage();
【库】游戏存档
import crypt.bin;
import crypt.aes;
import web.json;
import util.table;
namespace 游戏存档;
class 存档{
ctor(存档路径,存档密码){
this.路径 = 存档路径
this.密码 = 存档密码
};
读档 = function(){
if(!..io.exist(this.路径)){ // 若不存在返回空值
return null;
}
// 文件读取
var 编码内容 = ..string.load(this.路径)
// 编码解密
var 加密内容 = ..crypt.bin.decodeBase64(编码内容)
// AES解密
var 加密容器 = ..crypt.aes()
加密容器.setPassword(this.密码) // 设置秘密
var 解密内容 = 加密容器.decrypt(加密内容)
if(!解密内容){ // 解密失败返回空值
return null;
}
// type.table
var 表 = ..web.json.tryParse(解密内容)
if(!表){
var 数据 = ..web.json.stringify(eval(解密内容))
表 = ..web.json.tryParse(数据)
}
return 表;
}
存档 = function(存档){
if(!..io.exist(this.路径)){ // 判断文件是否存在
// 创建文件
var 文件 = ..io.open(this.路径,"w")
// 关闭文件
文件.close()
}
// AES加密
var 加密容器 = ..crypt.aes()
加密容器.setPassword(this.密码) // 设置秘密
var 加密内容 = 加密容器.encrypt(..util.table.stringify(存档))
// Base64编码
var 编码内容 = ..crypt.bin.encodeBase64(加密内容)
// 文件保存
..string.save(this.路径,编码内容) //若append=true,则追加到文件末尾
}
}
/*intellisense()
游戏存档 = 游戏存档的加密读取与保存
游戏存档.存档("文件路径","加密密码") = 设置存档的路径与密码
游戏存档.存档()= !存档.
!存档.读档() = 返回存档内容,若读取失败返回空;
!存档.存档(存档) = 保存存档,存档格式为表;
end intellisense*/
【库】游戏数据
设置游戏初始数据
namespace 游戏数据{
结束判断 = true;
存档 = {}
初始金钱 = 500;
初始仓库容量 = 10;
商品信息 = {
{"奶油草莓",50},
{"湖西槟榔";80},
{"黄米手环";320},
{"狗熊冰箱";1300},
{"葡萄手机";5200},
{"哈喽摩托";20000},
{"婚嫁五金";80000},
{"平民汽车";160000},
{"中产汽车";640000},
{"土豪汽车";2540000},
{"平价飞机";10000000},
{"豪华游轮";40000000},
{"土豪手表";160000000},
{"世界名画";640000000}
}
}
/**intellisense(游戏数据)
游戏数据 = 游戏一些内置常量数据
游戏数据.结束判断 = 是否关闭登录窗口
游戏数据.初始金钱 = 初始金钱
游戏数据.初始仓库容量 = 初始容量
游戏数据.商品信息 = 商品信息
end intellisense**/