久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

C語(yǔ)言猜拳游戲代碼及分析

作者:劉蕊飛   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年03月02日   【字體:

猜拳游戲需求分析說(shuō)明書(shū)

1.引言

1.編寫(xiě)目的

小時(shí)候,我們喜歡以猜拳來(lái)贏得獎(jiǎng)勵(lì)。

現(xiàn)在,我們希望能開(kāi)發(fā)一個(gè)猜拳的游戲。

2.定義

需求:用戶(hù)解決問(wèn)題或達(dá)到目標(biāo)所需的條件或功能;系統(tǒng)或系統(tǒng)部件要滿足合同、標(biāo)準(zhǔn),規(guī)范或其它正式規(guī)定文檔所需具有的條件或權(quán)能。而且其很強(qiáng)的交互性及簡(jiǎn)單易行性,可以讓人在很短時(shí)間內(nèi)熟悉它的操作方法,不論用戶(hù)文化水平如何,都會(huì)很輕松的學(xué)會(huì)使用它。

2.任務(wù)概述

1.目標(biāo)

2.用戶(hù)的特點(diǎn)

由于本程序簡(jiǎn)單易操作,交互性好,對(duì)用戶(hù)沒(méi)什么特別要求。一般用戶(hù)經(jīng)過(guò)幾分鐘練系都可以熟悉本系統(tǒng)的規(guī)則。

 

3.系統(tǒng)功能示例

 

3.需求細(xì)則

1.    對(duì)功能的規(guī)定

1.1       界面友好

屬性:必選

描述:用戶(hù)的一些操作前后做出一些必要的提示或確認(rèn)。所有完成的功能都需要友好,例如:

   增加失敗提示

   刪除失敗和成功提示、刪除前的確認(rèn);

   修改失敗和成功提示、修改前/后的確認(rèn);

   查找失敗提示、查找成功的確認(rèn);

   退出系統(tǒng)時(shí),要提示是否退出;

   其它方面的界面問(wèn)題;

 

1.2       用戶(hù)注冊(cè)

屬性:必選

描述:登錄界面可以用戶(hù)注冊(cè),注冊(cè)信息包含用戶(hù)名和密碼,例如:

      不能使用已經(jīng)存在的用戶(hù)名

      密碼不能少于6個(gè)字符

1.3       用戶(hù)登錄

屬性:必選

描述:用戶(hù)通過(guò)登錄界面進(jìn)行登錄,必須輸入正確的用戶(hù)名和密碼方可進(jìn)入系統(tǒng),例如:

      提示輸入用戶(hù)名

      提示輸入密碼

      用戶(hù)名和密碼驗(yàn)證,都符合則進(jìn)入系統(tǒng),不然回到第一步,超過(guò)三次登錄,則提示登錄次數(shù)超過(guò)三次,退出系統(tǒng)

 

1.4       開(kāi)始游戲

屬性:必選

描述:金額大于1的用戶(hù)可以開(kāi)始游戲

      下注:提示用戶(hù)下注的金額數(shù)

      猜拳:(必須先下注,如果用戶(hù)下注金額小于等于0,不能進(jìn)行游戲)與電腦進(jìn)行猜拳游戲,如果猜輸了,扣除你的金額(由下注決定),勝利將隨機(jī)獲得1~5倍的下注金額獎(jiǎng)勵(lì)

n提示:電腦隨機(jī)出拳,勝利獎(jiǎng)勵(lì)也是隨機(jī)的,例如:

n隨機(jī)獲得1~5數(shù)字代碼:

nsrand((unsigned)time(NULL));

nint radio = rand() % 5 + 1;//radio 為隨機(jī) 1~5的整數(shù)

      如果金額少于下注數(shù),將不能進(jìn)行猜拳,給出充值提示

1.5       充值

屬性:必選

描述:用戶(hù)可以進(jìn)行充值

      充值金額

      充值的時(shí)候,必須輸入充值密碼(由5個(gè)字符組成,隨機(jī)包括數(shù)字0~9和所有小寫(xiě)字母)

      如果充值密碼正確,充值成功,不然充值失敗

1.6       修改用戶(hù)信息

屬性:必選

描述:用戶(hù)可以注銷(xiāo)(刪除)自己的賬戶(hù)、或者修改個(gè)人信息

  修改個(gè)人信息

n   修改用戶(hù)密碼

  注銷(xiāo)用戶(hù)(本人)

n   刪除用戶(hù)所有信息(刪除完畢將返回登錄界面,用戶(hù)賬號(hào)已經(jīng)不存在)

1.7       查看用戶(hù)信息

 

屬性:必選

描述:用戶(hù)登錄成功后,可以選擇查看用戶(hù)自己信息或者所有用戶(hù)信息

 

  查看用戶(hù)自己信息:(本人)用戶(hù)名 密碼 金額 勝率

  查看所有用戶(hù)信息:所有用戶(hù)名 金額 勝率

 

1.8       排序

屬性:必選

描述:用戶(hù)可以對(duì)所有用戶(hù)信息進(jìn)行排序操作,便于查看

  金額排序

  勝率排序

 

對(duì)性能的規(guī)定

 

 本系統(tǒng)在設(shè)計(jì)方面本著方便、實(shí)用的宗旨,性能方面應(yīng)遵循如下原則:

                     執(zhí)行效率(時(shí)間): 軟件運(yùn)行應(yīng)該盡量高效;避免沒(méi)有必要的循環(huán)處理、重復(fù)處理;

                     資源損耗(空間):設(shè)計(jì)盡量節(jié)約資源(內(nèi)存、數(shù)組、鏈表等);不用的資源要及時(shí)釋放;

                     初始化: 變量、數(shù)組、內(nèi)存塊;

                     健壯性:不能出現(xiàn)野指針、內(nèi)存泄露、數(shù)組越界訪問(wèn)等等:

    聲明指針后,立即將指針設(shè)置為NULL,防止產(chǎn)生野指針

    函數(shù)的入?yún)⒈仨氝M(jìn)行有效性判斷;用戶(hù)輸入、函數(shù)返回值(如果用到的話)都要判斷;

    switch-case一定要有defaultif-else if等后要有else,除非if滿足后返回或退出;

    不允許出現(xiàn)goto語(yǔ)句;

    數(shù)組的下標(biāo)不要溢出。

 

3.    對(duì)排版的規(guī)定

 

                     縮進(jìn)要對(duì)齊

                     長(zhǎng)行拆分;

                     二元操作符的前后應(yīng)當(dāng)加空格,包括如下操作符:

 

賦值操作符、比較操作符、算術(shù)操作符、邏輯操作符、位域操作符,如"=""+="">=""<=""+""*""%""&&""||""<<","^" 等;

 

                     空行:

 

    聲明之后、每個(gè)函數(shù)定義結(jié)束之后都要加1行空行;

    邏揖上密切相關(guān)的語(yǔ)句之間不加空行,其它地方應(yīng)加空行分隔;

    一行代碼只做一件事情;

    "if""for""while""do"等語(yǔ)句自占一行,執(zhí)行語(yǔ)句不得緊跟其后。不論執(zhí)行語(yǔ)句有多少都要加 "{ }"

 

4.    對(duì)可維護(hù)性的規(guī)定

 

    對(duì)可維護(hù)性的最終要求:別人能夠輕松上手你的代碼。

                     結(jié)構(gòu)清晰:

 

    模塊化:對(duì)界面(顯示)、菜單管理、邏輯管理、文件操作等等代碼要獨(dú)立,必須多個(gè).c文件,用makefile

    封裝:一個(gè)函數(shù)只做一件事,函數(shù)功能要單一;一個(gè)函數(shù)不能超過(guò)50行;

避免重復(fù)、冗余代碼;

    代碼塊清晰。

                     命名規(guī)范,變量名應(yīng)該具有自明性:

    函數(shù)的命名:

使用"動(dòng)詞"或者"動(dòng)詞+名詞"(動(dòng)賓詞組)的形式,由一個(gè)或多個(gè)單詞組成且以小寫(xiě)字母開(kāi)頭,以后每個(gè)單詞之間用下劃線隔開(kāi)

    變量的命名與定義

應(yīng)當(dāng)使用"名詞"或者"形容詞+名詞",由一個(gè)或多個(gè)單詞組成且以小寫(xiě)字母開(kāi)頭,以后每個(gè)單詞之間用下劃線隔開(kāi)。

 

                     注釋充分:變量、函數(shù)(包括參數(shù)、返回值)、代碼功能塊、一些復(fù)雜算法……等都需要

 

清晰明了地說(shuō)明;

 

5.    對(duì)個(gè)性的規(guī)定

 

把項(xiàng)目做出個(gè)性出來(lái)。下列各項(xiàng)中有和比人不同之處、或很有創(chuàng)意,即可認(rèn)為有個(gè)性。獨(dú)立設(shè)計(jì)的軟件,一般都會(huì)出現(xiàn)一些個(gè)性。參考、抄襲不會(huì)出現(xiàn)個(gè)性。   

 

                     設(shè)計(jì)思路:包括軟件的整體架構(gòu)、功能塊的設(shè)計(jì)思路、函數(shù)封裝等等;

                     功能實(shí)現(xiàn):從用戶(hù)的角度,使用上發(fā)現(xiàn)與眾不同的地方;

                     其它方面;

 

c語(yǔ)言程序代碼:

/*
func:猜拳游戲
auth:肖喬
date:2014.02.22
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define TRUE 1
typedef struct {
       charname[30];       //用戶(hù)名長(zhǎng)度最長(zhǎng)28
       charpassword[30];   //密碼長(zhǎng)度最長(zhǎng)28
       doublemoney;
       inttimes;
       intwin;
}game_t;
//清空緩存
void fflush_in();
//登錄菜單函數(shù)
void log_menu();
//功能菜單函數(shù)
void ctrl_menu();
//登錄函數(shù)
int log_in(game_t *p,int *count,int *my);
//注冊(cè)函數(shù)
int add_user(game_t *p,int *count);
//登錄控制函數(shù)
void log_ctrl(game_t *p,int *count,int*my);
//功能控制函數(shù)
void ctrl(game_t *p,int *count,int *my);
//查看函數(shù)
void look(game_t *p,int *count,int *my);
//查看菜單
void look_menu();
//查看所有
void look_all(game_t *p,int *count);
//查看個(gè)人
void look_my(game_t *p,int *my);
//初始化函數(shù)
int log_start(game_t *p,int *count);
//保存函數(shù)
int exit_save(game_t *p,int *count);
//充值函數(shù)
int pay(game_t *p,int *my);
//修改函數(shù)
void alter(game_t *p,int *count,int *my);
//修改菜單
void alter_menu();
//修改密碼
int alter_pass(game_t *p,int *my);
//注銷(xiāo)用戶(hù)
int del(game_t *p,int *count,int *my);
//游戲控制函數(shù)
void game_ctrl(game_t *p,int *my);
//游戲菜單
void game_menu();
//下注
int game_pay(game_t *p,int *my,double*mon);
//游戲函數(shù)
void game_play(game_t *p,int *my,double*mon);
//游戲
int game();
//排序控制函數(shù)
void cmp(game_t *p,int *count);
//排序菜單
void cmp_menu();
//按金額排序函數(shù)
int cmp_money(const void *px,const void*py);
//勝率函數(shù)
void win_times(game_t *p,int *count);
//按勝率排序函數(shù)
int cmp_win(const void *px,const void *py);
 
 
int main(){
       game_tstu[100]={"\0"}; //最多100個(gè)用戶(hù)
       intcount=0;            //count表示用戶(hù)數(shù)
       intmy=0;               //my表示本人用戶(hù)下標(biāo)
 
       printf("歡迎使用猜拳游戲\n");
       if(log_start(stu,&count)==0)                             //系統(tǒng)初始化
              printf("系統(tǒng)初始化成功\n");
       else
              printf("系統(tǒng)初始化失敗\n");
       log_ctrl(stu,&count,&my);    //功能控制函數(shù)
 
       return0;
}
//初始化函數(shù) 0-成功1-失敗
int log_start(game_t *p,int *count){
       FILE*fp=NULL;
 
       fp=fopen("data","a+");
       if(NULL==fp)
              return1;
       while(fread(&p[*count],sizeof(game_t),1,fp))
              *count+=1;
       fclose(fp);
     
       return0;
}
//保存函數(shù) 0-成功 1-失敗
int exit_save(game_t *p,int *count){
       FILE*fp=NULL;
 
       fp=fopen("data","w");
       if(NULL==fp)
              return1;;
       fwrite(p,sizeof(game_t),*count,fp);
       fclose(fp);
       return0;
}
 
//功能控制函數(shù)
void ctrl(game_t *p,int *count,int *my){
       intchose=0;
 
       while(TRUE){
              chose=0;
              ctrl_menu();
              printf("請(qǐng)選擇:");
              scanf("%d",&chose);
              fflush_in();
              switch(chose){
                     case1:          //查看
                            look(p,count,my);
                            break;
                     case2:          //游戲
                            game_ctrl(p,my);
                            break;
                     case3:          //充值
                            if(pay(p,my)==0)
                                   printf("充值成功\n");
                            else
                                   printf("充值失敗\n");
                            break;
                     case4:          //修改
                            alter(p,count,my);
                            break;
                     case5:          //排序
                            cmp(p,count);
                            break;
                     case6:          //返回
                            return;
                            break;
                     default:
                            printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
              }
       }
}
//排序控制函數(shù)
void cmp(game_t *p,int *count){
       intchose=0;
 
       while(TRUE){
              chose=0;
              cmp_menu();
              printf("請(qǐng)選擇:");
              scanf("%d",&chose);
              fflush_in();
              switch(chose){
                     case1:            //金額
                            qsort(p,*count,sizeof(game_t),cmp_money);     
                            printf("排序成功\n");
                            break;
                     case2:            //勝率
                            win_times(p,count);
                                   printf("排序成功\n");
                            break;
                     case3:            //返回
                            return;
                            break;
                     default:
                            printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
              }
       }
}
//勝率函數(shù)
void win_times(game_t *p,int *count){
       doublewins[100]={0.0};
       doublei=0,j=0;
       intk=0;
     
       for(k=0;k<*count;k++){
              i=p[k].times;
              j=p[k].win;
              wins[k]=(i=0?0:(double)j/i*100);
       }
              qsort(wins,*count,sizeof(game_t),cmp_win);
}
//按勝率排序函數(shù)
int cmp_win(const void *px,const void *py){
       constgame_t *p1=px;
       constgame_t *p2=py;
 
       if(p1->money>p2->money)
              return-1;
       if(p1->money<p2->money)
              return1;
       else
              return0;
}
//按金額排序函數(shù)
int cmp_money(const void *px,const void*py){
       constgame_t *p1=px;
       constgame_t *p2=py;
 
       if(p1->money>p2->money)
              return-1;
       if(p1->money<p2->money)
              return1;
       else
              return0;
}
//排序菜單
void cmp_menu(){
       printf("1.按金額排序 2.按勝率排序 3.返回\n");
}
//游戲控制函數(shù)
void game_ctrl(game_t *p,int *my){
       intchose=0;
       doublemon=0.0;
 
       while(TRUE){
              chose=0;
              game_menu();
              printf("請(qǐng)選擇:");
              scanf("%d",&chose);
              fflush_in();
              switch(chose){
                     case1:          //下注
                            if(game_pay(p,my,&mon)==0)
                                   printf("下注成功,請(qǐng)開(kāi)始游戲\n");
                            else
                                   printf("下注失敗\n");
                            break;
                     case2:          //猜拳
                            game_play(p,my,&mon);    
                            break;
                     case3:          //返回
                            return;
                            break;
                     default:
                            printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
              }
       }
}
//游戲函數(shù)
void game_play(game_t *p,int *my,double*mon){
       intresult=0;
       intradio=0;
 
       if(*mon==0){
              printf("請(qǐng)先下注\n");
              return;
       }
       p[*my].money-=*mon;
       result=game();
       srand((unsigned)time(NULL));
       radio=rand()%5+1;
       if(result==0){
              p[*my].money+=0;
              printf("平局,余額%.2f\n",p[*my].money);
              p[*my].times+=1;
       }
       elseif(result==1){
              p[*my].money+=(*mon)*radio;
              printf("您勝利了,獎(jiǎng)金:%.2f余額:%.2f\n",(*mon)*radio,p[*my].money);
              p[*my].times+=1;
              p[*my].win+=1;
       }
       else{
              printf("您輸了%.2lf,余額%.2lf\n",*mon,p[*my].money);
              p[*my].times+=1;
       }
       *mon=0.0;
}
//游戲 0-平局,1-勝,-1-輸
int game(){
       intmy=0;
       intradio=0;
       while(my!=1&&my!=2&&my!=3){
              printf("1.剪刀 2.石頭 3.布\n");
              printf("請(qǐng)選擇:");
              scanf("%d",&my);
              fflush_in();
              switch(my){
                     case1:
                            printf("您出的是剪刀\n");
                            break;
                     case2:
                            printf("您出的是石頭\n");
                            break;
                     case3:
                            printf("您出的是布\n");
                            break;
                     default:
                            printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
              }
       }
       srand((unsigned)time(NULL));
       radio=rand()%3+1;
       if(radio==1)
              printf("電腦出的是剪刀\n");
       elseif(radio==2)
              printf("電腦出的是石頭\n");
       elseif(radio==3)
              printf("電腦出的是布\n");
       switch(radio-my)
       {
              case1:
              case-2:
                     return-1;
              case2:
              case-1:
                     return1;
              default:
                     return0;
       }
}
//下注 0-成功 1-失敗
int game_pay(game_t *p,int *my,double*mon){
       doublemoney=0.0;
     
       if(p[*my].money==0){
              printf("您的余額為0.00,請(qǐng)充值\n");
              return1;
       }
       printf("您的余額為:%.2lf元\n",p[*my].money);
       printf("請(qǐng)下注:");
       scanf("%lf",&money);
       fflush_in();
       if(money<=0){
              printf("金額輸入有誤\n");
              return1;
       }
       if(money>p[*my].money){
              printf("余額不足,請(qǐng)充值\n");
              return1;
       }
       *mon=money;
       return0;
}
//游戲菜單
void game_menu(){
       printf("1.下注 2.猜拳 3.返回\n");
}
//修改函數(shù) 0-成功 1-失敗
void alter(game_t *p,int *count,int *my){
       intchose=0;
 
       while(TRUE){
              chose=0;
              alter_menu();
              printf("請(qǐng)選擇:");
              scanf("%d",&chose);
              fflush_in();
              switch(chose){
                     case1:          //改密
                            if(alter_pass(p,my)==0)
                                   printf("修改密碼成功\n");
                            else
                                   printf("修改密碼失敗\n");
                            break;
                     case2:          //注銷(xiāo)
                            if(del(p,count,my)==0){
                                   printf("注銷(xiāo)成功\n");
                                   log_ctrl(p,count,my);     //功能控制函數(shù)
                            }
                            else
                                   printf("注銷(xiāo)失敗\n");
                            break;
                     case3:          //返回
                            return;
                            break;
                     default:
                            printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
              }
       }
}
//注銷(xiāo)用戶(hù) 0-成功 1-失敗
int del(game_t *p,int *count,int *my){
       charpass[30]="\0";
       inti=0,chose=0;
 
       printf("密碼:");
       fgets(pass,30,stdin);
       pass[strlen(pass)-1]='\0';
       if(!(strcmp(p[*my].password,pass))==0){
              printf("密碼輸入錯(cuò)誤\n");
              return1;
       }
       printf("是否注銷(xiāo)?\n1.是 2.否\n");
       printf("請(qǐng)選擇:");
       scanf("%d",&chose);
       fflush_in();
       if(chose==1){
              for(i=*my;i<*count-1;i++){
                     strcpy(p[i].name,p[i+1].name);
                     strcpy(p[i].password,p[i+1].password);
                     p[i].money=p[i+1].money;
                     p[i].times=p[i+1].times;
                     p[i].win=p[i+1].win;
              }
       }
       else
              return1;
       *count-=1;
       return0;
}
//修改密碼 0-成功 1-失敗
int alter_pass(game_t *p,int *my){
       charpass[30]="\0",pass2[30]="\0";
       intchose=0;
 
       printf("密碼:");
       fgets(pass,30,stdin);
       pass[strlen(pass)-1]='\0';
       if(!(strcmp(p[*my].password,pass))==0){
              printf("密碼輸入錯(cuò)誤\n");
              return1;
       }
       printf("提示:密碼長(zhǎng)度為6-28位\n");
       printf("輸入新密碼:");
       fgets(pass,30,stdin);
       pass[strlen(pass)-1]='\0';
       printf("確認(rèn)新密碼:");
       fgets(pass2,30,stdin);
       pass2[strlen(pass2)-1]='\0';
       if(strcmp(pass,pass2)!=0){
              printf("兩次輸入密碼不一樣\n");
              return1;
       }
       if(strcmp(p[*my].password,pass)==0){
              printf("新密碼與原密碼相同\n");
              return1;
              }
       printf("是否改密?\n1.是 2.否\n");
       printf("請(qǐng)選擇:");
       scanf("%d",&chose);
       fflush_in();
       if(chose==1)
              strcpy(p[*my].password,pass);
       else
              return1;
       return0;
}
//修改函數(shù)菜單
void alter_menu(){
       printf("1.修改密碼 2.注銷(xiāo) 3.返回\n");
}
//充值函數(shù)
int pay(game_t *p,int *my){
       inti=0;
       doublemoney=0;
       charpass[30]="\0";
       charstr[10]="\0",str2[10]="\0";
     
       printf("請(qǐng)輸入金額:");
       scanf("%lf",&money);
       fflush_in();
       if(money<=0.0)
              return1;
     
       //驗(yàn)證碼
       for(i=0;i<5;i++){
              srand((unsigned)time(NULL)+i);
              str[i]="0123456789abcdefghihklmnopqrstuvwxyz"[rand()%36];
       }
       printf("充值密碼:%s",str);
       printf("\n");
       printf("請(qǐng)輸入充值密碼:");
       fgets(str2,10,stdin);
       str2[strlen(str2)-1]='\0';
       if(strcmp(str,str2)!=0){
              printf("充值密碼輸入錯(cuò)誤\n");
              return1;
       }
     
       printf("密碼:");
       fgets(pass,30,stdin);
       pass[strlen(pass)-1]='\0';
       if(!(strcmp(p[*my].password,pass))==0)
              return1;
       p[*my].money+=money;
     
       return0;
}
//查看函數(shù)
void look(game_t *p,int *count,int *my){
       intchose=0;
 
       while(TRUE){
              chose=0;
              look_menu();
              printf("請(qǐng)選擇:");
              scanf("%d",&chose);
              fflush_in();
              switch(chose){
                     case1:       //個(gè)人
                            look_my(p,my);
                            break;
                     case2:       //所有
                            look_all(p,count);
                            break;
                     case3:       //返回
                            return;
                            break;
                     default:
                            printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
              }
       }
}
//查看所有
void look_all(game_t *p,int *count){
       inti=0;     //i表示游戲次數(shù)
       intj=0;     //j表示勝利次數(shù)
       intk=0;
     
       printf("用戶(hù)\t金額\t勝率\t\n"); 
       for(k=0;k<*count;k++){
              i=p[k].times;
              j=p[k].win;
              printf("%s\t%.2f\t%.2lf%%\t\n",p[k].name,
                     p[k].money,i==0?0:(double)j/i*100);
       }
}
//查看個(gè)人
void look_my(game_t *p,int *my){
       inti=0;     //i表示游戲次數(shù)
       intj=0;     //j表示勝利次數(shù)
 
       i=p[*my].times;
       j=p[*my].win;
       printf("用戶(hù)名:%s\n",p[*my].name);
       printf("密 碼:%s\n",p[*my].password);
       printf("金 額:%.2lf\n",p[*my].money);
       printf("勝 率:%.2lf%%\n",i==0?0:(double)j/i*100);
}
//查看菜單
void look_menu(){
       printf("1.個(gè)人 2.所有 3.返回\n");
}
//功能菜單函數(shù)
void ctrl_menu(){
       printf("1.查看 2.游戲 3.充值 4.修改 5.排序 6.返回\n");
}
//登錄控制函數(shù)
void log_ctrl(game_t *p,int *count,int*my){
       intchose=0,chose2=0;
 
       while(TRUE){
              chose=0;
              chose2=0;
              log_menu();
              printf("請(qǐng)選擇:");
              scanf("%d",&chose);
              fflush_in();
              switch(chose){
                     case1:           //登錄
                            if(log_in(p,count,my)==1)
                                   printf("登錄失敗\n");                
                            else{
                                   printf("登錄成功\n");
                                   ctrl(p,count,my);
                            }
                            break;
                     case2:           //注冊(cè)
                            if(add_user(p,count)==1)
                                   printf("注冊(cè)失敗\n");
                            else
                                   printf("恭喜您,注冊(cè)成功\n");
                            break;
                     case3:           //退出
                            printf("是否退出?\n1.是 2.否\n");
                            printf("請(qǐng)選擇:");
                            scanf("%d",&chose2);
                            fflush_in();
                            if(chose2==1){
                                   if(exit_save(p,count)==0)
                                          printf("信息保存成功\n");
                                   else
                                          printf("信息保存失敗\n");
                                   exit(0);
                            }
                            else
                                   log_ctrl(p,count,my);
                            break;
                     default:
                            printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
              }
       }
}
//登錄函數(shù) 0-成功 1-失敗
int log_in(game_t *p,int *count,int *my){
       inti=0,flag=0;
       charname[30]="\0",pass[30]="\0";
     
       printf("用戶(hù)名:");
       fgets(name,30,stdin);
       name[strlen(name)-1]='\0';
       flag=0;
       for(i=0;i<*count;i++)
              if(strcmp(p[i].name,name)==0){
                     *my=i;
                     flag=1;
                     break;
              }
       if(flag==0){
              printf("用戶(hù)不存在\n");
              return1;
       }
     
       i=0;
       while(i<3){
              printf("密碼:");
              fgets(pass,30,stdin);
              pass[strlen(pass)-1]='\0';
              if(strcmp(p[*my].password,pass)==0){
                     return0;
              }
              printf("密碼輸入錯(cuò)誤,請(qǐng)重新輸入\n");
              i++;
       }
       if(i==3){
              printf("登錄失敗\n");
              printf("登錄次數(shù)超過(guò)三次,您將退出系統(tǒng)\n");
              if(exit_save(p,count)==0)  //保存信息
                     printf("信息保存成功\n");
              else
                     printf("信息保存失敗\n");
              exit(1);
       }
 
       return0;
}
//注冊(cè)函數(shù) 0-成功 1-失敗
int add_user(game_t *p,int *count){
       inti=0;
       charname[30]="\0";
       charpass[30]="\0",pass2[30]="\0";
 
       if(*count>100){
              printf("注冊(cè)用戶(hù)已滿\n");
              return1;
       }
       printf("提示:用戶(hù)名長(zhǎng)度為3-28\n");
       printf("用戶(hù)名:");
       fgets(name,30,stdin);
       name[strlen(name)-1]='\0';
       if(strlen(name)<3||strlen(name)>28){          //用戶(hù)名長(zhǎng)度3-28
              printf("用戶(hù)名長(zhǎng)度不合法\n");
              return1;
              }
       for(i=0;i<*count;i++){
              if(strcmp(p[i].name,name)==0){
              printf("已有同名用戶(hù)名\n");
              return1;
              }
       }
       strcpy(p[*count].name,name);
     
       printf("提示:密碼長(zhǎng)度6-28\n");
       printf("密碼:");
       fgets(pass,30,stdin);
       pass[strlen(pass)-1]='\0';
       if(strlen(pass)<6||
              strlen(pass)>28){   //密碼長(zhǎng)度6-28
              printf("密碼長(zhǎng)度不合法\n");
              return1;
              }
       printf("確認(rèn)密碼:");
       fgets(pass2,30,stdin);
       pass2[strlen(pass2)-1]='\0';
       if(!(strcmp(pass,pass2))==0){
              printf("兩次輸入密碼不一樣\n");
              return1;
       }
 
       strcpy(p[*count].password,pass);
       *count+=1;
 
       return0;
}
//登錄菜單函數(shù)
void log_menu(){
       printf("1.登錄 2.注冊(cè) 3.退出\n");
}
//清空緩存
void fflush_in(){
       charc='\0';
 
       c=getchar();
       while(c!='\n'){
              c=getchar();
       }
}
 

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 成人精品在线视频 | 91视频在线观看 | 午夜三级在线观看 | 国产精品久久精品 | 亚洲激情在线观看 | 日韩有码一区 | 国际精品鲁一鲁一区二区小说 | 国产精品极品美女在线观看免费 | 夜夜爽99久久国产综合精品女不卡 | 欧一区二区 | 亚洲韩国精品 | 国产精品视频一区二区三 | 91一区二区三区在线观看 | 永久av| 免费午夜剧场 | 黑人精品欧美一区二区蜜桃 | 国产精品久久久 | 国产欧美精品区一区二区三区 | 久久久99精品免费观看 | xxxcom在线观看 | 日韩一区二区三区在线观看 | 午夜大片 | 欧洲一级黄 | 伊人激情网 | 亚洲国产aⅴ精品 | 欧美偷偷| 久久亚洲一区二区 | 欧美一区二区三区在线观看 | 日本在线观看网址 | 亚洲精品国产第一综合99久久 | 亚洲精品日韩综合观看成人91 | 天天草天天干天天 | 日韩激情网 | 日韩高清黄色 | www视频在线观看 | 亚洲国产欧美一区二区三区久久 | 中文字幕av网站 | 久久国产视频播放 | 国产精品久久在线观看 | 在线观看午夜视频 | 欧美偷偷 |