猜拳游戏!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 1.选择对手的函数(此函数确保用户输入的是1-3之间的数);
int select_opponent() 
{
    int opponent;
    while (1) {
        printf("\n选择对手:[1] 哪吒   [2] 敖丙   [3] 敖润:\n");
        if (scanf("%d", &opponent) != 1) {
            // 清空输入缓冲区
            while (getchar() != '\n');
            printf("请输入数字1 - 3!\n");
            continue;
        }
        // 验证输入范围
        if (opponent >= 1 && opponent <= 3) {
            // 清空输入缓冲区
            while (getchar() != '\n');
            break;
        }
        printf("无效选择,请重新输入\n");
    }
    return opponent;
}

// 1.获取对手名称的函数
const char* get_opponent_name(int opponent)
 {
    switch (opponent) {
        case 1: return "哪吒";
        case 2: return "敖丙";
        case 3: return "敖润";
        default: return "未知";
    }
}

// 2/3 玩家出拳的函数(此函数确保用户输入的是1-3之间的数);
int player_make_gesture()
 {
    int player_gesture;
    while (1) {
        printf("\n请出拳:[1] 石头   [2] 剪刀   [3] 布:\n");
        if (scanf("%d", &player_gesture) != 1) {
            // 清空输入缓冲区
            while (getchar() != '\n');
            printf("请输入数字1 - 3!\n");
            continue;
        }
        // 验证输入范围
        if (player_gesture >= 1 && player_gesture <= 3) {
            // 清空输入缓冲区
            while (getchar() != '\n');
            break;
        }
        printf("无效选择,请重新输入\n");
    }
    return player_gesture;
}

// 2/3 获取手势名称的函数
const char* get_gesture_name(int gesture) 
{
    switch (gesture) {
        case 1: return "石头";
        case 2: return "剪刀";
        case 3: return "布";
        default: return "未知";
    }
}



// 4.判断胜负的函数
void judge_result(int player_gesture, int computer_gesture) 
{
    int result = (player_gesture - computer_gesture + 3) % 3;
    printf("战况:");
    if (result == 0) {
        printf("平局!\n");
    } else if (result == 1) {
        printf("您输了!\n");
    } else {
        printf("您赢了!\n");
    }
}

//上数判断胜负的函数可以写为数学运算,看起来比较直观,但是代码稍微长一些
// 判断胜负的函数
//void judge_result(int player_gesture, int computer_gesture) {
  //  printf("战况:");
      //if (player_gesture == computer_gesture) {
      //  printf("平局!\n");
    //} else if ((player_gesture == 1 && computer_gesture == 2) || 
      //         (player_gesture == 2 && computer_gesture == 3) || 
        //       (player_gesture == 3 && computer_gesture == 1)) {
        //printf("您赢了!\n");
    //} else {
      //  printf("您输了!\n");
    //}
//}


// 5.询问是否继续游戏的函数
int ask_continue() 
{
    char choice;
    while (1) {
        printf("\n继续游戏?[Y/N] ");
        if (scanf(" %c", &choice) == 1) {
            // 清空输入缓冲区
            while (getchar() != '\n');
            if (choice == 'Y' || choice == 'y') {
                return 1;
            } else if (choice == 'N' || choice == 'n') {
                return 0;
            }
        }
        printf("无效输入,请输入Y或N!\n");
    }
}

int main(int argc, char *argv[]) 
{
    // 初始化随机数种子(以时间作为种子)
    srand((unsigned)time(NULL));

    // 游戏主循环控制(默认是可以重复玩)
    int game_running = 1;

    // 游戏的头
    printf("=================================\n");
    printf("=          猜拳游戏 v1.0        =\n");
    printf("=          作者:FPF            =\n");
    printf("=================================\n");

    while (game_running) {
        // 1. 选择对手
        int opponent = select_opponent();
        const char *opponent_name = get_opponent_name(opponent);
        printf("对手:%s\n", opponent_name);

        // 2. 玩家出拳
        int player_gesture = player_make_gesture();
        const char *player_gesture_name = get_gesture_name(player_gesture);
        printf("您出:%s\n", player_gesture_name);

        // 3. 对手出拳
        int computer_gesture = rand() % 3 + 1;
        const char *computer_gesture_name = get_gesture_name(computer_gesture);
        printf("%s出:%s\n", opponent_name, computer_gesture_name);

        // 4. 判断胜负(双方比较)
        judge_result(player_gesture, computer_gesture);

        // 5. 游戏退出
        game_running = ask_continue();
    }

    printf("\n游戏结束!\n");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值