retn 发表于 2024-4-1 23:44:18

【aardio】《我是大富翁》文字小游戏,新手练习编程之作







偶然接触到aardio,发现它写小程序确实方便,便写点东西练练手。只是兴趣爱好,写的很菜。

登录界面
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 商品名称 = 商品信息[随机数组]

                var 最小值_下限 = 商品信息[随机数组] * 90
                var 最小值_上限 = 商品信息[随机数组] * 95

                var 最大值_下限 = 商品信息[随机数组] * 110
                var 最大值_上限 = 商品信息[随机数组] * 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)

                商品信息[随机数组] = 商品价格

                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**/

retn 发表于 2024-4-1 23:52:41

修正一下格式

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 商品名称 = 商品信息[随机数组]

      var 最小值_下限 = 商品信息[随机数组] * 90
      var 最小值_上限 = 商品信息[随机数组] * 95

      var 最大值_下限 = 商品信息[随机数组] * 110
      var 最大值_上限 = 商品信息[随机数组] * 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)

      商品信息[随机数组] = 商品价格

      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**/


Squall8965 发表于 2024-4-19 19:32:15

谢谢分享~!
页: [1]
查看完整版本: 【aardio】《我是大富翁》文字小游戏,新手练习编程之作