回精華區
作者SnowWolf.bbs@xeon.tfcis.org (靜夜) 看板: plan
標題[文件] 對對樂
時間動力核心 (Wed, 27 Aug 2003 13:17:56 +0800 (CST)) Updated: 2004/10/28
  改這篇前請確定你做了精華區這篇...

~/src/include/global.h

+ #define FN_RUN_TICKET          "run/ticket"
+ #define FN_RUN_TICKET_USER     "run/ticket.user"
+ #define FN_RUN_TICKET_RECORD   "run/ticket.record"

~/src/maple/menu.c,適當選單加入

+ "bin/ticket.so:main_ticket", 0, - M_GAME,
+ "9Ticket    ♂ 對對樂樂 ♀",

> ------------------------------------------------------------------------ <

新增~/etc/game/buyticket


    說明內容自己打 :p

> ------------------------------------------------------------------------ <

修改~/src/game/Makefile

SO =    ..... ticket.so

新增~/src/game/ticket.c

/*-------------------------------------------------------*/
/* ticket.c     ( NTHU CS MapleBBS Ver 3.10 )            */
/*-------------------------------------------------------*/
/* target : 對對樂                                       */
/* create :   /  /                                       */
/* update : 03/08/27                                     */
/* author : Ptt.bbs@ptt.twbbs.org                        */
/* modify : yychen                                       */
/*-------------------------------------------------------*/


#include "bbs.h"


static char betname[8][9] =
{
  "疲倦野貓", "沒力咩咩", "遊魂小風", "魔力小夢",
  "勤奮大魚", "碼頭阿倫", "一堆螞蟻", "嘰哩咕嚕"
};


/*-------------------------------------------------------*/
/* 螢幕控制                                              */
/*-------------------------------------------------------*/


static void
clrfromto(x, y)
  int x, y;
{
  int i;

  i = x;
  while (i <= y)
  {
    move(i, 0);
    clrtoeol();
    i++;
  }
}


static int                      /* 1: 檔案在  0: 檔案不在 */
show_file(fpath, ln, lines)     /* 從第 ln 列開始印檔案 lines 行 */
  char *fpath;
  int ln, lines;
{
  FILE *fp;
  char buf[ANSILINELEN];
  int i;

  if ((fp = fopen(fpath, "r")))
  {
    clrfromto(ln, ln + lines);
    move(ln, 0);
    i = lines;
    while (fgets(buf, ANSILINELEN, fp) && i--)
      outs(buf);
    fclose(fp);
    return 1;
  }

  return 0;
}


static void
show_bet()
{
  FILE *fp;
  int i, total, ticket[8] = {0, 0, 0, 0, 0, 0, 0, 0};

  total = 0;
  if (fp = fopen(FN_RUN_TICKET_RECORD, "r"))
  {
    fscanf(fp, "%9d %9d %9d %9d %9d %9d %9d %9d\n",
      &ticket[0], &ticket[1], &ticket[2], &ticket[3],
      &ticket[4], &ticket[5], &ticket[6], &ticket[7]);
    for (i = 0; i < 8; i++)
      total += ticket[i];
    fclose(fp);
  }
  prints("\033[1;33m1.%-8s:%-9d2.%-8s:%-9d3.%-8s:%-9d4.%-8s:%-9d\033[m\n"
    "\033[1;33m5.%-8s:%-9d6.%-8s:%-9d7.%-8s:%-9d8.%-8s:%-9d\033[m\n"
    "\033[1;37;44m 下注所有金額: \033[33m%d00\033[37m 銀\033[m",
    betname[0], ticket[0], betname[1], ticket[1],
    betname[2], ticket[2], betname[3], ticket[3],
    betname[4], ticket[4], betname[5], ticket[5],
    betname[6], ticket[6], betname[7], ticket[7], total);
}


static void
show_ticket_data()
{
  clear();
  vs_bar("對對樂賭盤");

  move(2, 0);
  outs("\033[1;32m前幾次開獎結果\033[m");
  show_file(FN_RUN_TICKET, 3, 8);

  move(14, 0);
  outs("\033[1;36m目前下注狀況\033[m\n");
  show_bet();
  move(19, 0);
  prints("\033[1;46m您身上有: %-10d 元\033[m\n", cuser.money);
  prints("請選擇要購買的種類(1~8)[Q:離開]");
}


static int
append_ticket_record(ch, n)
  int ch, n;
{
  FILE *fp;
  int ticket[8] = {0, 0, 0, 0, 0, 0, 0, 0};

  if (fp = fopen(FN_RUN_TICKET_USER, "a"))
  {
    fprintf(fp, "%s %d %d\n", cuser.userid, ch, n);
    fclose(fp);
  }

  if (fp = fopen(FN_RUN_TICKET_RECORD, "r+"))
  {
    fscanf(fp, "%9d %9d %9d %9d %9d %9d %9d %9d\n",
      &ticket[0], &ticket[1], &ticket[2], &ticket[3],
      &ticket[4], &ticket[5], &ticket[6], &ticket[7]);
    ticket[ch] += n;
    rewind(fp);
    fprintf(fp, "%9d %9d %9d %9d %9d %9d %9d %9d\n",
      ticket[0], ticket[1], ticket[2], ticket[3],
      ticket[4], ticket[5], ticket[6], ticket[7]);
    fclose(fp);
  }
  else if (fp = fopen(FN_RUN_TICKET_RECORD, "w"))
  {
    ticket[ch] += n;
    fprintf(fp, "%9d %9d %9d %9d %9d %9d %9d %9d\n",
      ticket[0], ticket[1], ticket[2], ticket[3],
      ticket[4], ticket[5], ticket[6], ticket[7]);
    fclose(fp);
  }
}


static void
show_picture(filename)
  char *filename;
{
  FILE *fp;
  char buf[256];

  move(5, 0);
  if ((fp = fopen(filename, "r")))
  {
    while (fgets(buf, 256, fp))
      outs(buf);
    fclose(fp);
  }
}


static void
ch_buyitem(money, picture, item)
  int money;
  char *picture;
  int *item;
{
  int num = 0;
  char buf[5];
  vget(b_lines - 1, 0, "要買多少份呢:", buf, 4, LCECHO);
  num = atoi(buf);
  if (num < 0)
    num = 0;
  if (cuser.money > money * num)
  {
    *item += num;
    cuser.money -= money * num;
    clrfromto(5, 17);
    show_picture(picture);
  }
  else
  {
    vmsg("現金不夠!");
  }
}


static int
ticket_main()
{
  int ch, n;

  while (1)
  {
    show_ticket_data();
    ch = vkey();
    if (ch == 'q' || ch == 'Q')
      break;
    ch -= '1';
    if (ch > 7 || ch < 0)
      continue;
    n = 0;
    ch_buyitem(100, "etc/game/buyticket", &n);
    if (n > 0)
      append_ticket_record(ch, n);
  }
  return 0;
}


static void
query_ticket()
{
  FILE *fp;
  int tickets[8] = {0, 0, 0, 0, 0, 0, 0, 0};
  int num1, num2, i = 0;
  char userid[IDLEN + 1];

  if (fp = fopen(FN_RUN_TICKET_USER, "r"))
  {
    while ((fscanf(fp, "%s %d %d", userid, &num1, &num2)) != EOF)
    {
      if (!str_cmp(userid, cuser.userid))
      {
        if (!i)
          i = 1;
        tickets[num1] += num2;
      }
    }
    fclose(fp);
  }
  else
  {
    vmsg("櫃台小姐:並沒有任何一個人(包括您)押注");
    return;
  }
  if (!i)
  {
    vmsg("櫃台小姐:抱歉,您並沒有押任何一項!");
    return;
  }

  clear();
  outs("\033[1;33m櫃台小姐給您一張清單:\033[\n");
  prints("\033[1;32m對對樂賭盤:\033[35m%s \033[32m下注一覽表\033[m\n\n", cuser.userid);
  for (i = 0; i < 8; i++)
  {
    prints("\033[1;3%dm您(%s) 押了 [%d. %-4s]:%d 張\033[m\n",
      i + 1 <= 7 ? i + 1 : i - 6,
      cuser.userid, i + 1, betname[i],
      tickets[i]);
  }
  vmsg(NULL);
}


/* Chukuang 改寫,可以執行下注與查詢 */
int
main_ticket()
{
  if (cutmp->status & STATUS_COINLOCK)
  {
    vmsg(MSG_COINLOCK);
    return XEASY;
  }

  vs_bar("對對樂賭盤");

  move(3, 0);
  outs(
    "\033[1;32m規則:\033[m 1.可購買八種不同類型的彩票。每張要花100元。\n"
    "      2.每十二小時開獎一次(0:30 12:30)。\n"
    "      3.開獎時會抽出一種彩票, 有購買該彩票者, 則可依購買的張數均分總賭金。\n"
    "      4.每筆獎金由系統抽取5%之稅金。\n\n");

  move(9, 10);
  outs("[1] \033[1;41m 對對樂賭盤投注 \033[m");
  move(10, 14);
  outs("\033[1;31m────────\033[m");
  move(11, 10);
  outs("[2] \033[1;44m 查詢所下注資料 \033[m");
  move(12, 14);
  outs("\033[1;34m────────\033[m");
  move(13, 10);
  outs("[0] \033[1;42m 離開對對樂賭盤 \033[m");
  move(14, 14);
  outs("\033[1;32m────────\033[m");

  switch (vans("請輸入您的選擇:"))
  {
  case '1':
    ticket_main();
    break;
  case '2':
    query_ticket();
    break;
  }

  return 0;
}

> ------------------------------------------------------------------------ <


修改~/src/util/Makefile

EXE =    ..... ticket_open

新增~/src/util/ticket_open.c

/*-------------------------------------------------------*/
/* ticket.c     ( NTHU CS MapleBBS Ver 3.10 )            */
/*-------------------------------------------------------*/
/* target : 對對樂開獎                                   */
/* create :   /  /                                       */
/* update : 03/08/27                                     */
/* author : Ptt.bbs@ptt.twbbs.org                        */
/*-------------------------------------------------------*/


#include "bbs.h"

#define MAX_DES     8          /* 最大保留獎數 */


/* JCWang:發錢函式 */
stativ void
add_money(userid, kind, money)
  char *userid;
  int kind;
  int money;
{
  char fpath[64];
  PAYCHECK paycheck;

  memset(&paycheck, 0, sizoef(PAYCHECK));
  time(&paycheck.tissue);
  paycheck.money = money;
  strcpy(paycheck.reason, "對對樂獎金");

  usr_fpath(fpath, userid, FN_PAYCHECK);
  rec_add(fpath, &paycheck, sizeof(PAYCHECK));
}


static void
mail_to_him(fpath, userid, title, xmode)     /* itoc.011115: 寄檔案給 userid */
  char *fpath;                  /* 檔案路徑 */
  char *userid;                 /* 收件人 */
  char *title;                  /* 郵件標題 */
  usint xmode;
{
  HDR hdr;
  char folder[64];

  usr_fpath(folder, userid, FN_DIR);
  hdr_stamp(folder, HDR_LINK, &hdr, fpath);
  strcpy(hdr.owner, STR_SYSOP);
  strcpy(hdr.title, title);
  hdr.xmode = xmode;
  rec_add(folder, &hdr, sizeof(HDR));
}


static void
mail_to_him(userid, num, name, givemoney)
  char *userid;
  int num;
  char *name;
  int givemoney;
{
  FILE *fp;
  char fpath[64];

  usr_fpath(fpath, userid, "ticket");
  if (fp = fopen(fpath, "w"))
  {
    fprintf(fp, "%s 中了 %d 張 [%s] 得 %d 元\n", userid, num, name, givemoney);
    fclose(fp);
    mail_to_him(fpath, userid, "[對對樂] 賭盤開獎通知", 0);
    unlink(fpath);
  }
}


int
main()
{
  int money, bet, n, total, ticket[8] = {0, 0, 0, 0, 0, 0, 0, 0};
  FILE *fp;
  time_t now;
  char des[MAX_DES][200] = {"", "", "", ""};
  static char betname[8][9] =
  {
    "疲倦野貓","沒力咩咩","遊魂小風","魔力小夢",
    "勤奮大魚","碼頭阿倫","一堆螞蟻","嘰哩咕嚕"
  };

  chdir(BBSHOME);

  f_mv(FN_RUN_TICKET_RECORD, FN_RUN_TICKET_RECORD ".tmp");
  f_mv(FN_RUN_TICKET_USER, FN_RUN_TICKET_USER ".tmp");

  if (!(fp = fopen(FN_RUN_TICKET_RECORD ".tmp", "r")))
    return 0;

  fscanf(fp, "%9d %9d %9d %9d %9d %9d %9d %9d\n",
    &ticket[0], &ticket[1], &ticket[2], &ticket[3],
    &ticket[4], &ticket[5], &ticket[6], &ticket[7]);
  total = 0;
  for (n = 0; n < 8; n++)
    total += ticket[n];
  fclose(fp);

  if (!total)
    return 0;

  if (fp = fopen(FN_RUN_TICKET, "r"))
  {
    for (n = 0; n < MAX_DES && fgets(des[n], 200, fp); n++);
    fclose(fp);
  }

  time(&now);
  srand(now);
  bet = rnd(8);

  money = ticket[bet] ? total * 95 / ticket[bet] : 9999999;

  if (fp = fopen(FN_RUN_TICKET, "w"))
  {
    if (des[MAX_DES - 1][0])
      n = 1;
    else
      n = 0;
    for (; n < MAX_DES && des[n][0] != 0; n++)
    {
      fprintf(fp, des[n]);
    }
    fprintf(fp, "%14.14s 賭盤開出:%s 總金額:%d00 元 "
      "獎金/張:%d 元 機率:%1.2f\n",
      Btime(&now), betname[bet], total, money,
      (float)ticket[bet] / total);
    fclose(fp);
  }

  if (ticket[bet] &&
    (fp = fopen(FN_RUN_TICKET_USER ".tmp", "r")))  /* 有人押中 */
  {
    int mybet, num;
    char userid[20];

    while (fscanf(fp, "%s %d %d\n", userid, &mybet, &num) != EOF)
    {
      if (mybet == bet)
      {
        printf("%s 中了 %d 張 [%s] 得 %d 元\n",
          userid, num, betname[mybet], money * num);
        add_money(userid, 4, money * num);
        mail_to_him(userid, num, betname[mybet], money * num);
      }
    }
  }
  unlink(FN_RUN_TICKET_RECORD ".tmp");
  unlink(FN_RUN_TICKET_USER ".tmp");
}

最後別忘了放入可愛的crontab中:P

# 對對樂開獎
30 0 * * * bin/openticket > /dev/null 2>&1

--
=[:摃�◣�:Origin ]|[     O�processor.tfcis.org    ]|[�搟說:]=
=[:摃�╱�:Author ]|[     bbs.kuas.edu.tw                 ]|[�:]=
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻