[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]
|
|