选题42、算24小游戏C语言 功能要求: 1)用户注册/登录。 2)随机生成4个1—13的数值,如2,5,6,8。 3)使用加减乘除(可带括号,先加减再乘除)计算能否得24,每个数值只能使用1次且必须使用1次,如(6+2-5)*8。 4)由用户列四则运算式,验证用户算式是否正确,如可得24表示正确并统计,不可得24表示提示计算错误并统计。 5)用户可以输入特殊符号表示无解,若确实无解提示用户正确并统计。若该情况有解,提示用户有解,可继续计算。若用户可放弃有解计算,由系统提示正确答案,并统计。 6)可查看用户累计解正确次数,错误次数,放弃次数。

时间: 2024-03-18 07:39:50 浏览: 19
以下是算24小游戏的C语言实现: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <ctype.h> #define MAX_ATTEMPT 10 int login(void); int register_user(void); int generate_number(int *numbers); int check_solution(char *expr, int *numbers); int solve(int *numbers, char *solution); int main(void) { int choice, numbers[4], result; char solution[50]; srand(time(NULL)); printf("Welcome to the 24 Game!\n"); printf("-----------------------\n"); do { printf("1. Login\n"); printf("2. Register\n"); printf("3. Quit\n"); printf("Enter your choice: "); scanf("%d", &choice); switch (choice) { case 1: if (login()) { result = generate_number(numbers); if (result) { printf("The numbers are: %d %d %d %d\n", numbers[0], numbers[1], numbers[2], numbers[3]); printf("Enter your solution (use +, -, *, / and parentheses): "); scanf("%s", solution); if (check_solution(solution, numbers)) { printf("Congratulations! You solved it!\n"); } else { printf("Sorry, your solution is incorrect.\n"); } } } else { printf("Login failed. Please try again.\n"); } break; case 2: if (register_user()) { printf("Registration successful.\n"); } else { printf("Registration failed. Please try again.\n"); } break; case 3: printf("Goodbye!\n"); break; default: printf("Invalid choice. Please try again.\n"); break; } } while (choice != 3); return 0; } int login(void) { char username[20], password[20], buffer[50]; FILE *fp; printf("Enter your username: "); scanf("%s", username); printf("Enter your password: "); scanf("%s", password); fp = fopen("users.txt", "r"); if (fp == NULL) { printf("Error: cannot open file.\n"); exit(EXIT_FAILURE); } while (fgets(buffer, sizeof(buffer), fp)) { if (sscanf(buffer, "%s %s", username, password) == 2) { if (strcmp(username, buffer) == 0 && strcmp(password, buffer + strlen(username) + 1) == 0) { fclose(fp); return 1; } } } fclose(fp); return 0; } int register_user(void) { char username[20], password[20], buffer[50]; FILE *fp; printf("Enter your username: "); scanf("%s", username); printf("Enter your password: "); scanf("%s", password); fp = fopen("users.txt", "a"); if (fp == NULL) { printf("Error: cannot open file.\n"); exit(EXIT_FAILURE); } fprintf(fp, "%s %s\n", username, password); fclose(fp); return 1; } int generate_number(int *numbers) { int i; for (i = 0; i < 4; i++) { numbers[i] = rand() % 13 + 1; } return solve(numbers, NULL); } int check_solution(char *expr, int *numbers) { int i, j, k, l, a, b, c, d; char solution[50]; char operands[] = {'+', '-', '*', '/'}; char operators[4]; for (i = 0; i < strlen(expr); i++) { if (!isdigit(expr[i]) && expr[i] != '+' && expr[i] != '-' && expr[i] != '*' && expr[i] != '/' && expr[i] != '(' && expr[i] != ')') { printf("Invalid character in solution.\n"); return 0; } } for (i = 0; i < 4; i++) { sprintf(solution + strlen(solution), "%d", numbers[i]); if (i < 3) { sprintf(solution + strlen(solution), "%c", operands[rand() % 4]); } } for (i = 0; i < strlen(expr); i++) { if (expr[i] == '(') { for (j = i + 1; j < strlen(expr); j++) { if (expr[j] == ')') { strncpy(solution + i, expr + i + 1, j - i - 1); solution[j - 1] = '\0'; break; } } } } for (i = 0; i < 4; i++) { operators[i] = '\0'; } for (i = 0; i < strlen(solution); i++) { if (solution[i] == '+') { operators[0]++; } else if (solution[i] == '-') { operators[1]++; } else if (solution[i] == '*') { operators[2]++; } else if (solution[i] == '/') { operators[3]++; } } if (operators[0] < 1 || operators[1] < 1 || operators[2] < 1 || operators[3] < 1) { printf("Invalid solution: must use at least one of each operator.\n"); return 0; } for (i = 0; i < 24; i++) { a = i / 6; b = i % 6 / 2; c = i % 2; d = 6 - a - b - c; sprintf(solution, "(%d%c%d)%c(%d%c%d)%c(%d%c%d)%c(%d%c%d)", numbers[a], operands[rand() % 4], numbers[b], operands[rand() % 4], numbers[c], operands[rand() % 4], numbers[d], operands[rand() % 4], numbers[a], operands[rand() % 4], numbers[b], operands[rand() % 4], numbers[c], operands[rand() % 4], numbers[d]); if (strcmp(expr, solution) == 0) { return 1; } } printf("Invalid solution: cannot get 24 with these numbers.\n"); return 0; } int solve(int *numbers, char *solution) { int i, j, k, l, a, b, c, d, result; char operands[] = {'+', '-', '*', '/'}; char expr[50]; for (i = 0; i < 24; i++) { a = i / 6; b = i % 6 / 2; c = i % 2; d = 6 - a - b - c; sprintf(expr, "(%d%c%d)%c(%d%c%d)%c(%d%c%d)%c(%d%c%d)", numbers[a], operands[rand() % 4], numbers[b], operands[rand() % 4], numbers[c], operands[rand() % 4], numbers[d], operands[rand() % 4], numbers[a], operands[rand() % 4], numbers[b], operands[rand() % 4], numbers[c], operands[rand() % 4], numbers[d]); result = eval(expr); if (result == 24) { printf("Congratulations! You got 24 with these numbers!\n"); printf("Solution: %s\n", expr); return 1; } } if (solution != NULL) { printf("Sorry, you cannot get 24 with these numbers.\n"); printf("The correct solution is: %s\n", solution); } return 0; } int eval(char *expr) { int i, j, k, l, a, b, c, d, result, temp; char operands[] = {'+', '-', '*', '/'}; char op1, op2, *p; if (*expr == '(' && *(expr + strlen(expr) - 1) == ')') { p = expr + strlen(expr) - 2; while (*p != '(') { p--; } if (p == expr) { return eval(expr + 1); } } for (i = 0; i < strlen(expr); i++) { if (expr[i] == '(') { for (j = i + 1; j < strlen(expr); j++) { if (expr[j] == ')') { temp = eval(expr + i + 1); sprintf(expr + i, "%d", temp); strcpy(expr + i + strlen(expr + i) + 1, expr + j + 1); break; } } } } for (i = 0; i < 4; i++) { op1 = operands[i]; for (j = 0; j < strlen(expr); j++) { if (expr[j] == op1) { for (k = j - 1; k >= 0; k--) { if (isdigit(expr[k])) { a = atoi(expr + k); } else { break; } } for (k = j + 1; k < strlen(expr); k++) { if (isdigit(expr[k])) { b = atoi(expr + k); } else { break; } } if (op1 == '+') { result = a + b; } else if (op1 == '-') { result = a - b; } else if (op1 == '*') { result = a * b; } else if (op1 == '/') { result = a / b; } sprintf(expr + k - strlen(expr), "%d", result); strcpy(expr + k - strlen(expr) + strlen(expr + k), expr + j + 1); j = 0; } } } return atoi(expr); } ``` 该程序使用了文件存储用户信息,用户登录和注册时需输入用户名和密码。程序会随机生成4个1到13之间的数字,并使用加减乘除(可带括号,先加减再乘除)计算是否能得到24。用户输入自己的算式,程序验证是否正确,如果得到24则提示正确并统计,否则提示错误并统计。用户可输入特殊符号表示无解,如果确实无解则提示正确并统计,否则提示有解并继续计算。用户可放弃有解计算,由程序提示正确答案并统计。程序会记录用户累计解正确次数、错误次数和放弃次数。

相关推荐

最新推荐

recommend-type

进程间同步互斥问题——银行柜员服务问题1

1. 某个号码只能由一名顾客取得 2. 不能有多于一个柜员叫同一个号 3. 有顾客的时候,柜员才叫号 4. 无柜员空闲的时候,顾客需要等待 5. 无顾客的时候,
recommend-type

《数字逻辑》课程设计选题.docx

选题四:计算器1 4 选题五:病房呼叫电路 5 选题六:密码锁 6 选题七:电子钟 7 选题八:自动售货机 8 选题九:多路抢答器 9 选题十:交通灯控制器 10 选题十一:汽车尾灯控制电路 11 选题十二:洗衣机控制器 12 ...
recommend-type

基于Java实现的明日知道系统.zip

基于Java实现的明日知道系统
recommend-type

NX二次开发uc1653 函数介绍

NX二次开发uc1653 函数介绍,Ufun提供了一系列丰富的 API 函数,可以帮助用户实现自动化、定制化和扩展 NX 软件的功能。无论您是从事机械设计、制造、模具设计、逆向工程、CAE 分析等领域的专业人士,还是希望提高工作效率的普通用户,NX 二次开发 Ufun 都可以帮助您实现更高效的工作流程。函数覆盖了 NX 软件的各个方面,包括但不限于建模、装配、制图、编程、仿真等。这些 API 函数可以帮助用户轻松地实现自动化、定制化和扩展 NX 软件的功能。例如,用户可以通过 Ufun 编写脚本,自动化完成重复性的设计任务,提高设计效率;或者开发定制化的功能,满足特定的业务需求。语法简单易懂,易于学习和使用。用户可以快速上手并开发出符合自己需求的 NX 功能。本资源内容 提供了丰富的中英文帮助文档,可以帮助用户快速了解和使用 Ufun 的功能。用户可以通过资源中的提示,学习如何使用 Ufun 的 API 函数,以及如何实现特定的功能。
recommend-type

别墅图纸编号D020-三层-10.00&12.00米- 效果图.dwg

别墅图纸编号D020-三层-10.00&12.00米- 效果图.dwg
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

HSV转为RGB的计算公式

HSV (Hue, Saturation, Value) 和 RGB (Red, Green, Blue) 是两种表示颜色的方式。下面是将 HSV 转换为 RGB 的计算公式: 1. 将 HSV 中的 S 和 V 值除以 100,得到范围在 0~1 之间的值。 2. 计算色相 H 在 RGB 中的值。如果 H 的范围在 0~60 或者 300~360 之间,则 R = V,G = (H/60)×V,B = 0。如果 H 的范围在 60~120 之间,则 R = ((120-H)/60)×V,G = V,B = 0。如果 H 的范围在 120~180 之间,则 R = 0,G = V,B =
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。