回精華區
作者itoc.bbs@processor.tfcis.org (核心動力) 看板: plan
標題Re: new一個新帳號時,出現使用者條款(站規)
時間動力核心 (2003/12/25 Thu 02:10:39) Updated: 2005/03/23
※ 引述《cyanofox.bbs@bbs.cs.nchu.edu.tw (我是好人一族的:()》之銘言:
> 如何在申請一個新id時,先出現站規,使用者同意後再繼續下面的步驟
> (像ptt那樣)
> 而那個站規檔放在~/etc/底下(或他處,最好可由站上改)
> 若無站規檔則關閉此功能

: bbsd.c:acct_apply()

  SCHEMA slot;
  char buf[80];
  char *userid;
  int try, fd;

+ if (startgame(IQFILE) != FULLSCORE)
+   login_abort("\n很抱歉,您考試不通過,無法註冊");

  film_out(FILM_APPLY, 0);

: etc/iqdata.aq  把題庫檔(iqdata.aq)放在etc下,格式於下
: 題目+正確答案
: 正確答案只能是一個 char

站長是帥哥(Y/N)? y
誰是世界上最帥的人 (1)總統 (2)站長 (3)超人? 2
新手上站要幾天(1-9)? 3

: bbsd.c: 新增以下函式於 acct_apply() 前面

/*-------------------------------------------------------*/
/* target : 數學大富翁                                   */
/* author : codeman.bbs@amtigers.adsldns.org             */
/*          hxw.bbs@bbs.sayya.org                        */
/*-------------------------------------------------------*/


/* 題目數(Q_MAX)要大於出題數(Q_MUCH) */

#define Q_LENTH     160         /* 題目長度 */
#define Q_MAX       1024        /* 最多能有幾題 */
#define Q_MUCH      10          /* 出多少題 */
#define Q_TOTAL     total       /* 檔案中共有多少題目 */
#define FULLSCORE   100         /* 定義滿分是 100 分 */

#undef  SHOWRANSER              /* show the right anser 秀出解答 */
                                /* 建議不要,因為這樣就不好玩了 */

/*-------------------------------------------------------*/
/* 題庫格式                                              */
/* 題目長以一個螢幕可輸出為限                            */
/* 範例:                                                 */
/* 1+1=2? y                                              */
/* 2+3=4? n                                              */
/* ^^題目 ^答案                                          */
/* 註:答案是該字串扣掉換行的最後一個字元                 */
/*-------------------------------------------------------*/


#define IQFILE  "etc/iqdata.aq"             /* 定義題庫檔的檔名 */


static int
logo()              /* 標題 */
{
  vs_bar("站規考試");
  move(1,0);
  outs("\033[1;33;41m");
  outs("*****************************************************************\n");
  outs("*                         站規考試                              *\n");
  outs("*****************************************************************");
  outs("\033[m");
}


static int
showans(anser)              /* 把使用者輸入的答案秀出來 */
  char anser[Q_MAX];
{
  int i;

  move(Q_MUCH + 1, 0);
  outs("您的答案是:\n");
  for (i = 0; i < Q_MUCH; i++)
    prints("%d:%c  ", i + 1, anser[i]);
}


#ifdef SHOWRANSER
static int
showrans(ranser, aqnum, question)   /* 秀出正解的函式 */
  char ranser[Q_MAX];
  int aqnum[Q_MUCH];
  char *question[Q_LENTH];
{
  int i;

  vs_bar("站規考試");
  for (i = 0; i < Q_MUCH; i++)
    prints("%d.%s :%c\n", i+1, question[aqnum[i]], ranser[aqnum[i]]);
}
#endif


static int          /* 回傳對了幾題 */
anscompare(anser, ranser, aqnum)   /* 比對答案的函式 */
  char anser[Q_MAX];
  char ranser[Q_MAX];
  int aqnum[Q_MUCH];
{
  int i, rmuch;

  rmuch = 0;
  for (i = 0; i < Q_MUCH; i++)
  {
    if (ranser[aqnum[i]] == anser[i])
      rmuch++;
  }
  return rmuch;
}


static int          /* 回傳分數 */
countscore(rmuch)               /* 計算分數的函式 */
  int rmuch;
{
  return rmuch * FULLSCORE / Q_MUCH;
}


static int
startgame(fpath)
  char *fpath;           /* 題庫的檔名 */
{
  FILE *fp;
  char *question[Q_MAX];
  char anser[Q_MAX], ranser[Q_MAX]; /* anser是使用者的答案,ranser是正解 */
  int qnum, total;                  /* total是檔案中的總題目數,qnum是題號 */
  int aqnum[Q_MUCH] = {0};          /* aqnum是己出現過的題號 */
  int alnum[Q_MAX] = {0};           /* already exists num 己出現過的題號 */
  int i;
  int score;
  char buf[3];

  if (!(fp = fopen(fpath, "r")))
    return FULLSCORE;

  logo();

  /* 將 question 的記憶體準備好 */
  for (i = 0; i < Q_MAX; i++)
    question[i] = (char *) malloc(Q_LENTH);

  /* 把題目讀到 question 陣列中 */
  total = 0;
  while (fgets(question[total], Q_LENTH, fp))
  {
    i = strlen(question[total]) - 2;
    ranser[total] = (char) *(question[total] + i);
                                        /* 把倒數第二個字元讀入ranser陣列 */
    *(question[total] + i) = '\0';
    total++;
  }

  fclose(fp);

  /* 亂數取題,列印到螢幕上,並將答案存到anser陣列 */
  srand(time(NULL) + cuser.userno);
  for (i = 0; i < Q_MUCH; i++)
  {
    /* 判斷亂數是否出現過,若有就重取 */
    do
    {
      qnum = rnd(total);
    } while (alnum[qnum] == 1);

    alnum[qnum] = 1;
    move(9, 0);
    clrtobot();
    prints("\033[1m%s\033[m", question[qnum]);
    anser[i] = vget(10, 0, "請輸入答案 : ", buf, 3, LCECHO);
    aqnum[i] = qnum;
  }

  /* 比對ranser和anser答案 */
  i = anscompare(anser, ranser, aqnum);

  /* 計分 */
  score = countscore(rmuch);
  move(9, 0);
  clrtobot();
  move(9, 18);
  prints("您答對了 %d 題!", i);
  move(10, 18);
  prints("您得了 %d 分,滿分是 %d 分。", score, FULLSCORE);
  vmsg(NULL);

#ifdef SHOWRANSER  /* 秀出解答 */
  showrans(ranser, aqnum, question);
  showans(anser);
  vmsg(NULL);
#endif

  for (i = 0; i < Q_MAX; i++)
    free(question[i]);

  return score;
}

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