A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

[code]//
//  main.c
//  ShakeDiceGame   掷骰子游戏
//  游戏规则:同时投掷两个色子,每次投掷会扣除游戏玩家积分(最低为50积分),若点数之和大于7,则玩家获得2倍积分,
//          若等于2则获得3倍积分,等于7则重新投掷,若小于7且大于2则不得分。
//          玩家初始积分为200,当玩家积分小于50时则不可以继续进行游戏
//
//  Created by 张立鹏 on 16/3/26.
//  Copyright © 2016年 zhanglp. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>

int ch; //定义一个整形全局变量,在清除输入缓冲区时接收无效字符

int main(int argc, const char * argv[]) {
    printf("\tShakeDiceGame   掷骰子游戏\n");
    printf("游戏规则:\n\t同时投掷两个色子,每次投掷会扣除游戏玩家积分(最低为50积分),若点数之和大于7,则玩家获得2倍积分,若等于2则获得3倍积分,等于7则重新投掷,若小于7且大于2则不得分。玩家初始积分为200,当玩家积分小于50时则不可以继续进行游戏\n");
    printf("想试试手气么,快来玩吧,看你能赢多少分!\n");   //欢迎语 0_0  233333333~~~
    int allScore = 200; //定义一个整形变量用来表示玩家总分,并且初始分数为200
    void playGame(int allScore);    //声明 游戏 函数
    playGame(allScore); //调用游戏函数,开始游戏
    return 0;
}

/**
*  @author zhanglp, 16-03-26 01:03:54
*
*  投掷色子,随机获得两个色子的大小,并取得两个色子的点数之和。
*
*  @return 函数返回两只色子点数之和
*/
int ShakeDice(){
    //定义两个色子,类型为整形
    int dice_1,dice_2;
    //随机获得两个色子的大小
    dice_1 = arc4random_uniform(6)+1;//点数为1~6之间的随机数
    dice_2 = arc4random_uniform(6)+1;//点数为1~6之间的随机数
    //定义一个计数器,计算色子的点数之和
    int sum = dice_1 + dice_2;
    //告知玩家点数之和
    printf("两个色子加起来是 %d 点\n",sum);
    //函数返回点数之和
    return sum;
}

/**
*  @author zhanglp, 16-03-26 01:03:06
*
*  点数之和大于7,则玩家获得2倍积分,若等于2则获得3倍积分,等于7则重新投掷,若小于7且大于2则不得分。
*
*  @param sum   色子的点数之和
*  @param score 玩家投入的积分
*
*  @return 返回值为一轮游戏结束后玩家获得的分数
*  
*  @update by 张立鹏 on 2016/03/26 08:06:55
*  修改BUG:当点数之和为7时程序会进入死循环,因为要重新投掷,所以要重新调用ShakeDice()函数,以取得新的点数之和
*/
int rule(int sum,int score){
    if (sum > 7) {
        return score *= 2;  //点数之和大于7时获得双倍积分    score = score * 2;
    } else if (sum == 2){
        return score *= 3;  //点数之和等于2时获得三倍积分
    } else if (sum == 7){
        int ShakeDice();
        sum = ShakeDice();  //当点数之和为7时需要重新调用投掷色子的函数,以取得新的点数之和
        return rule(sum, score);    //点数之和等于7时重新投掷
    } else {
        return score = 0;   //点数之和小于7且大于2时不得分
    }
}

/**
*  @author zhanglp, 16-03-26 01:03:35
*
*  模拟游戏过程,计算游戏总分
*
*  @param allScore 玩家总分数
*
*  @update by 张立鹏 on 2016/03/26 09:42:49
*  修改BUG:如果用户输入的分数小于50重新输入后要清除输入缓冲区
*/
void playGame(int allScore){
    int score;  //定义一个整形变量表示玩家投入的分数
    int score_get;  //定义一个整形变量表示游戏后获得的分数
    int sum;    //定义一个整形变量用来接收投掷色子后,两个色子的点数之和
    while (allScore >= 50) {
        //提示玩家投入积分
        printf("请输入您要投入的积分(最少为50):");
        //接收用户输入的分数
        scanf("%d",&score);
        
        //清空输入缓冲区
        /**  
         *   为什么要清空输入缓冲区:
         *   因为在使用scanf()函数时,用户在输入完对应的数据后,会有一些未被匹配的字符在输入缓冲区内,如:"\n" "\t"等字符
         *   如果这些字符没有被清空,则会影响用户下次的输入,导致程序异常。
         */
        //方法1:(不推荐)
        //flush(stdin);
        //方法2:不停地使用getchar()获取缓冲区中字符,直到获取的字符c是换行符’\n’或者是文件结尾符EOF为止。这个方法可以完美
        //      清除输入缓冲区,并且具备可移植性。
        while ((ch = getchar()) != '\n' && ch != EOF);
        //方法3:用scanf()函数接收缓冲区内多余的字符(只能接受一个字符)
        //scanf("%c",&ch);
        //方法4:
        //rewind(stdin);

        //检查玩家输入的积分是否符合要求
        int checkScore(int score,int allScore);    //声明 检查积分 函数
        score = checkScore(score, allScore);    //玩家输入的积分
        allScore -= score;  //从总积分中扣除投入的积分
        
        //投掷色子
        int ShakeDice();    //声明 投掷色子 的函数
        sum = ShakeDice();  //调用投掷色子的函数计算点数之和
        
        //根据游戏规则计算游戏得分
        int rule(int sum,int score);    //声明 游戏规则 函数
        score_get = rule(sum, score);   //调用游戏规则函数计算游戏后玩家获得的分数
        printf("本次游戏共获得%d分,加油哦!\n",score_get);  //提示用户本轮游戏得分
        allScore += score_get;  //计算总分数
        //向玩家显示当前总分数
        printf("您现在还剩余 %d 分。\n",allScore);
        
        char kaiguan;    //定义字符类型变量来表示游戏开关
        //询问是否继续游戏
        printf("是否继续游戏? Y / N  ");
        scanf("%c",&kaiguan);    //接收用户输入
        if (kaiguan == 'N' || kaiguan == 'n') {   //如果用户输入 ‘N’或者 ‘n’ 则退出游戏
            printf("游戏结束!\n");
            break;
        }
    }
    //如果玩家当前分数小于50,则提示游戏结束
    if (allScore < 50) {
        printf("很抱歉你的分数不够了,游戏结束!\n");
    }
}


/**
*  @author zhanglp, 16-03-26 12:03:43
*
*  检查玩家输入的分数是否符合游戏规则
*
*  @param score    玩家输入的分数
*  @param allScore 玩家拥有的总分数
*
*  @return 输入正确的分数
*/
int checkScore(int score,int allScore){
    if (score > allScore) {         //如果输入的分数大于则重新输入
        printf("我们这里不能欠账的啊!没那么多分就少来点啦!重新输入:");
        scanf("%d",&score); //重新输入
        //不停地使用getchar()获取缓冲区中字符,直到获取的字符c是换行符’\n’或者是文件结尾符EOF为止
        while ((ch = getchar()) != '\n' && ch != EOF);
        return checkScore(score,allScore);
    } else if (score < 50) {        //如果输入的分数小于50则重新输入
        printf("你是不是瞎!最少50分玩一次啊!重新输入:");
        scanf("%d",&score); //重新输入
        //不停地使用getchar()获取缓冲区中字符,直到获取的字符c是换行符’\n’或者是文件结尾符EOF为止
        while ((ch = getchar()) != '\n' && ch != EOF);
        return checkScore(score, allScore);
    } else {
        return score;  //返回一个用户输入正确的积分
    }
}















[/code]

4 个回复

正序浏览
都这么牛!真羡慕
回复 使用道具 举报
6666,加油!!
回复 使用道具 举报
还不错,还挺好玩呢
回复 使用道具 举报
希望版主看到后可以加精
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马