回精華區
作者BioStar.bbs@micro.bio.ncue.edu.tw (澎湖小雲雀) 看板: plan
標題Re: [閒聊] 避免 so/vote.c 在賭盤發錢時數值溢位
時間吟風‧眺月‧擎天崗 (2005/06/26 Sun 15:52:31) Updated: 2005/06/26
※ 引述《BioStar (澎湖小雲雀)》之銘言:
> 剛才想到......
> 賭注能不能是金幣呢?
> 超極富豪大火拼......
> 應該更刺激......

: include/struct.h struct VCH 中從 nouse 拿一個來用......

-  char nouse[96];
+  char gold;           /* 記錄賭注單位是金幣:1 或銀幣:0 */
+  char nouse[95];

: so/vote.c:vch_edit()

  else if (echo == DOECHO)      /* 只有新增時才能改變賭盤的票價 */
  {
    /* 賭盤就只能選一項 */
    vch->maxblt = 1;

+   if (vans("賭注單位要用金幣嗎(Y/N)?[N] ") == 'y')
+   {
+     vget(b_lines - 5, 0, "請問每票售價多少金幣?(100~1000):",
+       ans, 7, DOECHO);
+     vch->gold = 1;
+   }
+   else
+   {
      vget(b_lines - 5, 0, "請問每票售價多少銀幣?(100~100000):",
        ans, 7, DOECHO);
+     vch->gold = 0;
+   }

: so/vote.c:delvch()

      while (read(fd, &vlog, sizeof(VLOG)) == sizeof(VLOG))
      {
+       if (vch->gold)
+         paycheck.gold = vlog.numvotes * vch->price;
+       else
          paycheck.money = vlog.numvotes * vch->price;
        usr_fpath(buf, vlog.userid, FN_PAYCHECK);
        rec_add(buf, &paycheck, sizeof(PAYCHECK));
      }

: so/vote.c:viote_join()

  if (vch->vgamble == '$')
  {
-   if (cuser.money < vch->price)
+   if ((vch->gold && cuser.gold < vch->price) ||
+     (!vch->gold && cuser.money < vch->price))
    {
      vmsg("您的錢不夠參加賭盤");
      return XO_FOOT;
    }

(中略)

+    if (vch->gold)
+      sprintf(buf, "每張賭票 %d 金幣,請問要買幾張?[1] ", vch->price)
+    else
       sprintf(buf, "每張賭票 %d 銀幣,請問要買幾張?[1] ", vch->price);

(中略)

-     if (cuser.money >= fd)
+     if ((vch->gold && cuser.gold >= fd) ||
+       (!vch->gold && cuser.money >= fd))
        break;

(中略)

  if (vch->vgamble == '$')
  {
+   if (vch->gold)
+     cuser.gold -= fd;   /* fd 是要付的賭金 */
+   else
      cuser.money -= fd;  /* fd 是要付的賭金 */
  }

: so/vote.c:vlog_pay()

+   if (vch->gold)
+     fprintf(fp, "板主 %s 抽頭,可獲得 %d 金幣\n", vch->owner, money);
+   else
      fprintf(fp, "板主 %s 抽頭,可獲得 %d 銀幣\n", vch->owner, money);

    memset(&paycheck, 0, sizeof(PAYCHECK));
    time(&paycheck.tissue);
+   if (vch->gold)
+     paycheck.gold = money;
+   else
      paycheck.money = money;

(中略)
+         if (vch->gold)
+         {
+           fprintf(fp, "%s 買了 %d 張,共可獲得 %d 金幣\n",
+             vlog.userid, vlog.numvotes, money);
+           paycheck.gold = money;
+         }
+         else
+         {
            fprintf(fp, "%s 買了 %d 張,共可獲得 %d 銀幣\n",
              vlog.userid, vlog.numvotes, money);
            paycheck.money = money;
+         }

          sprintf(paycheck.reason, "[賭盤] %s", currboard);

--
  Origin:  彰化師大生物系˙吟風‧眺月‧擎天崗  micro.bio.ncue.edu.tw 
  Author: BioStar61-64-116-235-adsl-zha.STATIC.so-net.net.tw 發表
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻