c语言24点游戏报告,24点游戏C语言(附源代码)
在24点游戏中,随机生成4个 数,让用户对这4个数进行四则运算,对用户输入进行判断,若结果为24,则生命值不变,分数加10,将结果存入文件,并以排行榜的方式打开。首先进行四个数的随机输出(给定的范围是1到13),用rand()函数实现。{printf("你要计算的四个数是:");num1=(rand()%13+1);printf("%d ",num1);num2=(rand()%13+1);pr.
在24点游戏中,随机生成4个 数,让用户对这4个数进行四则运算,对用户输入进行判断,若结果为24,则生命值不变,分数加10,将结果存入文件,并以排行榜的方式打开。
首先进行四个数的随机输出(给定的范围是1到13),用rand()函数
实现。
{
printf("你要计算的四个数是:");
num1=(rand()%13+1);
printf("%d ",num1);
num2=(rand()%13+1);
printf("%d ",num2);
num3=(rand()%13+1);
printf("%d ",num3);
num4=(rand()%13+1);
printf("%d \n",num4);
initnum();
}
接着让用户输入,并对用户输入的进行判断,这里我用了数据结构里栈构造一个计算器对输入的进行运算。定义一个存储运算符的栈SNode_Symbol和一个存储运算数字的栈SNode_Num。取出输入的数字和运算符,
//定义第一个栈---作为存放运算数的操作符
struct SNode_Num {
int datas[MAX];
int top;
};
typedef struct SNode_Num OperateNum;
//定义第二个栈---作为存放运算符号的栈
struct SNode_Symbol {
char symbol[MAX];
int top;
};
typedef struct SNode_Symbol OperateSymbol;
//判断栈满
void InitOperateNum(OperateNum *StackNum)
{
StackNum->top = -1;
}
void InitOperateSymbol(OperateSymbol *StackSymbol)
{
StackSymbol->top = -1;
}
//入栈
void PushOperateNum(OperateNum *StackNum, int x)
{
StackNum->top++;
StackNum->datas[StackNum->top] = x;
}
void PushOperateSymbol(OperateSymbol *StackSymbol, char ch)
{
StackSymbol->top++;
StackSymbol->symbol[StackSymbol->top] = ch;
}
//出栈
int PopOperateNum(OperateNum *StackNum)
{
int num;
num = StackNum->datas[StackNum->top];
StackNum->top--;
return num;
}
char PopOperateSymbol(OperateSymbol *StackSymbol)
{
char ch;
ch = StackSymbol->symbol[StackSymbol->top];
StackSymbol->top--;
return ch;
}
//取出相应的数
int GetOperateNum(OperateNum *StackNum)
{
return StackNum->datas[StackNum->top];
}
//取出相应运算符
char GetOperateSymbol(OperateSymbol *StackSymbol)
{
return StackSymbol->symbol[StackSymbol->top];
}
short IsOperateSymbolOrNum(char ch)
{
//判断所有需要用的操作符 包括+ - * / ( ) \n
if(ch == '+' || ch == '-' || ch == '*'
|| ch == '/' || ch == '(' || ch == ')' || ch == n') return 1;
'\
else return 0;
}
并将输入的数字与随机输出的数字进行对比,如果不同,则不计分。
int check(int x)
{ //检查数字
if(x==s1)
{
s1=0;
return 1;
}
if(x==s2)
{
s2=0;
return 1;
}
if(x==s3)
{
s3=0;
return 1;
}
if(x==s4)
{
s4=0;
return 1;
}
//cout<
return 0;
对输入的运算符进行优先级的分配,括号>乘除>加减。
char Priority(char inputnum, char ch)
{
switch(inputnum)
case '+':
case '-': {n '
else if(ch == ')') return
if(ch == '+' || ch == '-') return '>';
{
//加减在同一个优先级上
else if(ch == '*' || ch == '/') return '
else if(ch == '(') retur'>';
else return '>';
}
break;
//乘除在同一优先级
case '*':
case '/':
{
if(ch == '+' || ch == '-') return '>';
else if(ch == '*' || ch == '/') return '>';
else if(ch == '(') return '
else if(ch == ')') return '>';
else return '>';
}
break;
//括号在所有优先级以上
case '(':
{
if(ch == ')') return '=';
else return '
}
break;
case ')':
{
return '>';
}
break;
case '\n':
{
if(ch == '\n') return '=';
else return '
}
break;
}
}
然后对输入运算符进行定义。
int Calculate(int num1, char ch, int num2)
{
int result;
switch(ch) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
}
return result;
}
对输入的数字和运算符进行计算,当输入有回车符时,输出对前面的运算结果。
{
OperateNum datas;
OperateSymbol symbol;
int num1, num2, result, num;
char ch, sign;
InitOperateNum(&datas);
InitOperateSymbol(&symbol);
//把回车计算的操作符放在栈中
PushOperateSymbol(&symbol, '\n');
ch = getchar();
while((ch != '\n') || (GetOperateSymbol(&symbol) != '\n')) {
if(!IsOperateSymbolOrNum(ch)) {
num = atoi(&ch); //将字符转换为整数
ch = getchar(); //获取输入
while(!IsOperateSymbolOrNum(ch)) {
num = num * 10 + atoi(&ch);
ch = getchar(); //当没有输入回车时,继续获取输入
}
PushOperateNum(&datas, num);
ck=check(num);
if(ck==0) {
cout<
cc = 0;
}
} else {
switch(Priority(GetOperateSymbol(&symbol), ch)) {
//判断优先级后进行计算
case '
PushOperateSymbol(&symbol, ch);
ch = getchar();
break;
case '=':
sign = PopOperateSymbol(&symbol);
ch = getchar(); //获取输入
break;
case '>':
sign = PopOperateSymbol(&symbol);
num2 = PopOperateNum(&datas);
num1 = PopOperateNum(&datas);
result = Calculate(num1, sign, num2);
PushOperateNum(&datas, result);
break;
}
}
}
result = GetOperateNum(&datas);
return result;
}
用fopen函数进行文件操作,将所有结果存放至文件中,并且排序输出。
void add2rank(int pts)
{
FILE *fp;
fp=fopen("toplist.txt","r");
if(!fp)//如果文件为空
{
printf("\n打开文件toplist.dat失败!");
}
fprintf(fp,"%s\n",pts);//利用fprintf函数向文件中输入
printf("\n");
fclose(fp);//关闭文件
}
void rank() {
FILE *fp;
fp=fopen("toplist.txt","r");
if(!fp)//如果文件为空
{
printf("\n打开文件toplist.dat失败!");
}
}
用对计算出的结果进行判断,如果结果为24,则生命值不减少,分数加10。
if(result!=24) {
life=life-1;
score=score-10;
printf("哈哈哈 ,你智商欠费\n");
printf("你的分数是:%d\n",score);
printf("生命值减一,你还有%d条命\n",life);
} else {
score=score+10;
printf("蒙对的吧?\n");
printf("你的分数是:%d",score);
printf("你还有%d条命\n",life);
}
printf("你算得是%d\n", result); //输出结果
system("pause");
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)