作者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翻