C语言实践作业:游戏与字符处理系统
题目描述
请实现一个具有多功能的C语言程序,包含以下功能模块:
- 石头剪刀布游戏
- 成绩计算系统
- 字母转换器
- 高级字母转换器
具体要求
1. 主菜单设计
- 创建一个循环菜单系统,允许用户选择不同的功能
- 提供清晰的菜单选项和退出机制
- 对无效输入进行适当的错误处理
2. 石头剪刀布游戏
实现一个具有以下特性的游戏:
- 游戏最多进行5轮
- 跟踪并显示获胜次数和胜率
- 实现以下功能:
- 用户可以选择石头(0)、剪刀(1)、布(2)
- 电脑随机生成选择
- 正确判断胜负
- 允许提前退出(输入9)
- 显示最终游戏统计信息
3. 成绩计算系统
开发一个成绩处理程序:
- 接收5门课程的成绩输入
- 要求:
- 验证输入成绩是否在0-100范围内
- 计算总分
- 计算平均分
- 清晰展示计算结果
4. 基础字母转换器
创建一个字符转换程序:
- 功能要求:
- 接收单个字符输入
- 如果是小写字母,向后移动4位并转换为大写
- 如果是大写字母,向后移动4位并转换为小写
- 非字母字符保持不变
- 实现字母循环(例如:‘z’后接’a’)
5. 高级字母转换器
在基础转换器的基础上添加动画效果:
-
增加以下特性:
- 显示用户输入的字符
- 等待1秒
- 使用退格符(\b)清除显示的字符
- 在相同位置显示转换后的结果
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <windows.h>
void guessWinner(void);
void calculateGrades(void);
void convertLetter(void);
void advancedConvertLetter(void);
int main() {
while(1)
{
int choice;
printf("1.猜拳游戏\n");
printf("2.成绩计算\n");
printf("3.基础字母转换\n");
printf("4.进阶字母转换\n");
printf("0.退出\n");
printf("请输入您的选择:\n");
scanf("%d", &choice);
switch(choice)
{
case 1:
guessWinner();
break;
case 2:
calculateGrades();
break;
case 3:
convertLetter();
break;
case 4:
advancedConvertLetter();
break;
case 0:
exit(0);
default:
printf("输入有误!请重新输入!\n");
}
}
return 0;
}
void guessWinner()
{
int player;
int computer;
int rounds = 0; // 当前轮数
int wins = 0; // 获胜次数
float winRate; // 胜率
printf("\n游戏说明:\n");
printf("在游戏过程中,输入9可以随时退出游戏\n");
printf("0 - 石头\n1 - 剪刀\n2 - 布\n9 - 退出游戏\n\n");
while(rounds < 5) // 只玩5轮
{
printf("第 %d 轮游戏(共5轮):\n", rounds + 1);
printf("0 - 石头\n1 - 剪刀\n2 - 布\n9 - 退出\n");
printf("请输入你的选择: \n");
scanf("%d", &player);
if(player == 9) {
printf("\n您选择退出游戏。\n");
break; // 跳出游戏循环
}
if (player < 0 || player > 2)
{
printf("无效的选择!\n");
continue; // 无效输入不计入轮数
}
computer = rand() % 3;
printf("你选了: \n");
if(player == 0) printf("石头\n");
if(player == 1) printf("剪刀\n");
if(player == 2) printf("布\n");
printf("计算机选了: \n");
if(computer == 0) printf("石头\n");
if(computer == 1) printf("剪刀\n");
if(computer == 2) printf("布\n");
if(player == computer)
{
printf("平局!\n");
}
else if((player == 0 && computer == 1) || (player == 1 && computer == 2) || (player == 2 && computer == 0))
{
printf("恭喜!你赢了!\n");
wins++; // 记录获胜次数
}
else
{
printf("对不起!你输了!\n");
}
rounds++; // 增加轮数
if(rounds < 5)
{
printf("\n按 Enter 键继续...");
getchar();
getchar();
system("cls");
}
}
// 计算并显示最终胜率
if(rounds >= 1)
{
winRate = (float)wins / rounds * 100;
printf("\n=== 游戏结束 ===\n");
printf("总共进行了5轮游戏\n");
printf("你赢了 %d 轮\n", wins);
printf("最终胜率: %.1f%%\n", winRate);
printf("\n按 Enter 键返回主菜单...");
getchar();
getchar();
system("cls");
}else
{
printf("游戏结束!因为未完成任何一局游戏,无法统计胜率。\n"); // 更清晰的提示信息
printf("\n按 Enter 键返回主菜单...");
getchar();
getchar();
system("cls");
}
}
void calculateGrades()
{
int i;
int scores[5]; // 存储五门课程成绩
int score;
int total = 0; // 总分
float average; // 平均分
printf("\n=== 成绩计算 ===\n");
printf("请输入五门课程的成绩(整数):\n");
for(i = 0; i < 5;i++)
{
do {
printf("请输入第 %d 科分数: ", i + 1);
scanf("%d", &score);
if(score >= 0 && score <= 100) {
scores[i] = score;
break; // 如果分数有效,跳出do-while循环
} else {
printf("成绩必须在0-100之间,请重新输入第 %d 门课程的成绩: ", i + 1);
}
} while(1);
total += scores[i];
}
average = (float)total / 5;
printf("\n=== 计算结果 ===\n");
printf("总分为:%d",total);
printf("平均分为:%lf",average);
printf("\n按 Enter 键返回主菜单...");
getchar();
getchar();
system("cls");
}
void convertLetter(void)
{
char input, result;
printf("\n=== 字母转换 ===\n");
printf("请输入一个字符: ");
getchar(); // 清除缓冲区
scanf("%c", &input);
if (islower(input)) { // 如果是小写字母
result = ((input - 'a' + 4) % 26) + 'A'; // 循环后移4位并转大写
printf("转换结果: %c\n", result);
}
else if (isupper(input)) { // 如果是大写字母
result = ((input - 'A' + 4) % 26) + 'a'; // 循环后移4位并转小写
printf("转换结果: %c\n", result);
}
else { // 其他字符不转换
printf("输入的不是字母,保持不变: %c\n", input);
}
printf("\n按 Enter 键返回主菜单...");
getchar();
getchar();
system("cls");
}
void advancedConvertLetter()
{
char input, result;
printf("\n=== 进阶字母转换 ===\n");
printf("请输入一个字符: ");
getchar(); // 清除缓冲区
scanf("%c", &input);
// 在输入位置显示输入的字符
printf("%c", input);
// 等待1秒
Sleep(1000);
// 回到字符位置
printf("\b");
// 清除之前输入的字符(用空格覆盖)
printf(" ");
// 再次回到字符位置
printf("\b");
// 计算结果
if (islower(input)) {
result = ((input - 'a' + 4) % 26) + 'A';
}
else if (isupper(input)) {
result = ((input - 'A' + 4) % 26) + 'a';
}
else {
result = input;
}
// 在相同位置显示结果
printf("%c", result);
printf("\n\n按 Enter 键返回主菜单...");
getchar();
getchar();
system("cls");
}