回精華區
作者itoc, 信區: itoc
標題[遊戲] bet.c 賭盤 (開獎程式)
時間05/06/08
作者: chwaian (無言) 看板: itoc
標題: Re: 想請問有做賭盤的站長
時間: 2004/08/23 Mon 20:20:27                           Updated: 2005/06/08

: crontab -e
: 請將下面加入 crontab 的排程

# 每天 6:30 瘋狂賭盤開盤
30 6 * * * bin/bet_open > /dev/null 2>&1

: src/util/Makefile

EXE =   ... bet_open

: src/util/ 底下增加bet_open.c這隻程式

/*-------------------------------------------------------*/
/* util/bet_open.c  ( NTHU CS MapleBBS Ver 3.00 )        */
/*-------------------------------------------------------*/
/* target : 賭盤開盤程式                                 */
/* create :   /  /                                       */
/* update :   /  /                                       */
/*-------------------------------------------------------*/


#include "bbs.h"

#define TAX       1             /* 系統抽稅百分之幾 */
#define CMMTN     5             /* 開盤者抽稅百分之幾 */
#define maxboard  40


static void
add_money(userid, money)
  char *userid;
  int money;
{
  char fpath[64];
  PAYCHECK paycheck;

  memset(&paycheck, 0, sizeof(PAYCHECK));
  time(&paycheck.tissue);
  paycheck.gold = money;
  strcpy(paycheck.reason, "[瘋狂賭盤] 中獎");

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


static void
mail_to_him(userid, money, owner)     /* itoc.011115: 寄檔案給 userid */
  char *userid;                 /* 收件人 */
  int money;
  int owner;                    /* 1:開局者 0:一般玩家 */
{
  char folder[64], fpath[64];
  FILE *fp;
  HDR hdr;

  sprintf(fpath, "tmp/bet.%d", userid);
  if (fp = fopen(fpath, "w"))
  {
    /* 文章檔頭 */
    fprintf(fp, "%s %s (%s)\n", STR_AUTHOR1, STR_SYSOP, SYSOPNICK);
    fprintf(fp, "標題: 賭盤發錢\n時間: %s\n\n", Now());

    /* 文章內容 */
    if (owner)
      fprintf(fp, "舉辦賭盤,抽頭%d 元\n", money);
    else
      fprintf(fp, "恭喜您參加賭盤,贏得 %d 元\n", money);
    fclose(fp);

    usr_fpath(folder, userid, FN_DIR);
    hdr_stamp(folder, HDR_LINK, &hdr, fpath);
    strcpy(hdr.owner, STR_SYSOP);
    strcpy(hdr.title, "賭盤發錢");
    rec_add(folder, &hdr, sizeof(HDR));

    unlink(fpath);
  }
}


/* ----------------------------------------------------- */
/* keep log in board                                     */
/* ----------------------------------------------------- */


static BCACHE *bshm;

static void
init_bshm()
{
  bshm = shm_new(BRDSHM_KEY, sizeof(BCACHE));

  if (bshm->uptime <= 0)
    exit(0);
}


static void
update_btime(brdname)
  char *brdname;
{
  BRD *brdp, *bend;

  brdp = bshm->bcache;
  bend = brdp + bshm->number;
  do
  {
    if (!strcmp(brdname, brdp->brdname))
    {
      brdp->btime = -1;
      break;
    }
  } while (++brdp < bend);
}


static void
keeplog(fnlog, board, title, mode)
  char *fnlog;
  char *board;
  char *title;
  int mode;                        /* 0:load  1:rename  2:unlink */
{
  HDR hdr;
  char folder[64], fpath[64];
  int fd;
  FILE *fp;

  if (!dashf(fnlog))                /* Kudo.010804: 檔案是空的就不 keeplog */
    return;

  if (!board)
    board = BN_RECORD;

  brd_fpath(folder, board, FN_DIR);
  fd = hdr_stamp(folder, 'A', &hdr, fpath);
  if (fd < 0)
    return;

  if (mode == 1)
  {
    close(fd);
    /* rename(fnlog, fpath); */
    f_mv(fnlog, fpath);                /* Thor.990409: 可跨partition */
  }
  else
  {
    fp = fdopen(fd, "w");
    fprintf(fp, "作者: %s (%s)\n標題: %s\n時間: %s\n\n",
      STR_SYSOP, SYSOPNICK, title, Btime(&hdr.chrono));
    f_suck(fp, fnlog);
    fclose(fp);
    close(fd);
    if (mode)
      unlink(fnlog);
  }

  strcpy(hdr.title, title);
  strcpy(hdr.owner, STR_SYSOP);
  rec_add(folder, &hdr, sizeof(HDR));

  update_btime(board);
}


static void
init_bet(no)                        /* 更新第no盤的資料 */
  int no;
{
  FILE *inf, *fs;
  time_t close_time;
  int i, betmoney;
  char dd[100], dscrpt[100];

  if (fs = fopen("etc/game/bet/bet.list", "r"))
  {

    inf = fopen("etc/game/bet/bet.list.w", "w");
    for (i = 0; i < maxboard; i++)
    {
      fscanf(fs, "%d %ld %s\n", &betmoney, &close_time, dd);
      fgets(dscrpt, 60, fs);
      if (i + 1 == no)
        fprintf(inf, "0 111 dsyan\ndsyan\n");
      else
        fprintf(inf, "%d %ld %s\n%s", betmoney, close_time, dd, dscrpt);
    }
    fclose(fs);
    fclose(inf);

    f_mv("etc/game/bet/bet.list.w", "etc/game/bet/bet.list");
  }
}


int
main()
{
  time_t close_time;
  int i, ans, now, all, ch[9], tmp, b, betmoney, money;
  float haha;
  char buf[250], dd[100], tmpb[201], id[13], dscrpt[100], fpath[64];
  FILE *inf, *fs, *logfile;

  chdir(BBSHOME);

  inf = fopen("etc/game/bet/bet.lock", "w");
  fprintf(inf, "\n本檔案存在為系統發錢時間, 無法壓注.\n");
  fclose(inf);

  init_bshm();

  for (now = 1; now < (maxboard + 1); now++)
  {
    sprintf(buf, "etc/game/bet/bet.ans%d", now);

    if (inf = fopen(buf, "r"))
    {
      fscanf(inf, "%d", &ans);
      fclose(inf);

      logfile = fopen("etc/game/bet/bet.log", "w");
      fprintf(logfile, "\033[44;1m【第 %d 個開局宗旨】\033[m\n", now);

      sprintf(buf, "etc/game/bet/bet.scr%d", now);

      if (fs = fopen(buf, "r"))
      {
        while (fgets(tmpb, 200, fs))
          fprintf(logfile, tmpb);
        fclose(fs);
      }

      if (fs = fopen("etc/game/bet/bet.list", "r"))
      {
        for (i = 0; i < maxboard; i++)
        {
          fscanf(fs, "%d %ld %s\n", &betmoney, &close_time, dd);
          fgets(dscrpt, 60, fs);
          if (i + 1 == now)
            break;
        }

        fclose(fs);
      }

      i = strlen(dscrpt) - 1;
      dscrpt[i] = 0;
      fprintf(logfile, "\n\033[44;1m編號      開局者   單價  "
        "項目敘述              \033[m\n");
      fprintf(logfile, "\033[32;1m %2d %12s   %5d  %-30s\033[m\n\n",
        now, dd, betmoney, dscrpt);

      sprintf(buf, "etc/game/bet/bet.cho%d", now);

      if (fs = fopen(buf, "r"))
      {
        fscanf(fs, "%d\n%d\n", &tmp, &all);
        for (i = 0; i < tmp; i++)
        {
          fgets(buf, 200, fs);
          fscanf(fs, "%d\n", &ch[i]);
          if (i + 1 == ans)
            fprintf(logfile, "\033[1;33m%d)%6d    %3.3f %s\033[m",
              i + 1, ch[i], (float)all / ch[i], buf);
          else
            fprintf(logfile, "%d)%6d    %3.3f %s",
              i + 1, ch[i], (float)all / ch[i], buf);
        }

        fclose(fs);
      }

      haha = (float)all / ch[ans - 1];

      fprintf(logfile, "\n\n[開獎結果]:%d\n\n恭喜下列使用者!\n", ans);

      sprintf(buf, "etc/game/bet/bet.cho%d.%d", now, ans);

      if (fs = fopen(buf, "r"))
      {
        while (fscanf(fs, "%s %d\n", id, &b) != EOF)
        {
          money = b * betmoney * haha * (100 - TAX - CMMTN) / 100;

          fprintf(logfile, "\033[%d;1m %12s 贏得 %10d\033[m\n",
            2 + 31, id, money);

          add_money(id, money);
          mail_to_him(id, money, 0);
        }

        fclose(fs);
        sprintf(fpath, "etc/game/bet/bet.cho%d.*", now);
        unlink(fpath);
      }

      money = all * betmoney * (CMMTN) / 100;
      add_money(dd, money);
      mail_to_him(dd, money, 1);
      fprintf(logfile, "\n\n[開局者] \033[33;1m%s\033[m 抽成 (%d%%) "
        "==> \033[32;1m%d\033[m\n", dd, CMMTN, money);
      fprintf(logfile, "[系統抽成] (%d%%) ==> \033[32;1m%d\033[m\n\n\n\n",
        TAX, money / 5);

      sprintf(fpath, "etc/game/bet/bet.cho%d", now);
      unlink(fpath);
      sprintf(fpath, "etc/game/bet/bet.ans%d", now);
      unlink(fpath);
      sprintf(fpath, "etc/game/bet/bet.scr%d", now);
      unlink(fpath);

      fclose(logfile);

      init_bet(now);

      sprintf(buf, "盤號[%d] %s", now, dscrpt);
      keeplog("etc/game/bet/bet.log", BN_BET, buf, 2);

    }
  }
  unlink("etc/game/bet/bet.lock");

  return 0;
}

--
  Origin:  Maple-itoc˙動力核心  processor.tfcis.org 
  Author: chwaian 218-171-119-168.dynamic.hinet.net 發表
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻