为了孩子他娘而奋斗

为了孩子他娘而奋斗

C语言实践作业:游戏与字符处理系统

题目描述

请实现一个具有多功能的C语言程序,包含以下功能模块:

  1. 石头剪刀布游戏
  2. 成绩计算系统
  3. 字母转换器
  4. 高级字母转换器

具体要求

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");
}
12-14 18:17