在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");

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐