C语言:《猜拳游戏》

  • 需求:

    • 本游戏是一款单机游戏,人机交互

  • 规则:

    • 需要双方出拳:石头、剪刀、布

    • 赢:

      • 石头 → 剪刀

      • 剪刀 → 布

      • 布 → 石头

    • 平:

      • 两边出拳相等

    • 输:

      • ...

  • 实现:

    • 选择对手

    • 玩家出拳

    • 对手出拳

    • 判断胜负

    • 游戏退出

  • 代码:

/*************************************************************************
  > File Name:    CaiQuan.c
  > Author:       三道渊
  > Description:  综合案例:猜拳游戏v1.0 
  > Created Time: 2025年07月16日 星期三 14时14分56秒
 ************************************************************************/

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

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");
zhu
    // 主循环
    while (game_running)
    {
        // 1. 选择对手
        printf("\n--- 选择对手 ---\n");
        // 创建一个变量,用来存储对手对应的序号
        int opponent;
        while (1)
        {
            printf("选择对手:【1】哪吒 【2】敖丙 【3】敖闰:\n");
            // 处理非法输入
            if (scanf("%d", &opponent) != 1)
            {
                // 清空输入缓冲区非法字符
                while (getchar() != '\n');
                printf("请输入数字1~3!\n");
                continue;
            }
            // 验证输入范围
            if (opponent >= 1 && opponent <=3) break;

            printf("选择无效,请重新输入!\n");

        }
        // 显示对手信息,使用const修饰的变量还是变量,只不过不能再次改变
        const char *opponent_name = opponent == 1 ? "哪吒" : opponent == 2 ? "敖丙" : "敖闰";

        printf("对手,%s\n", opponent_name);

        // 2. 玩家出拳
        printf("--- 玩家出拳 ---\n");
        // 创建一个变量,用来存储玩家自己出拳的序号
        int player_gesture;
        while (1)
        {
            printf("请出拳:【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) break;

            printf("无效输入,请重新输入!\n");
        }

        // 显示玩家出拳信息
        const char* player_gesture_name = player_gesture == 1 ? "石头" : player_gesture == 2 ? "剪刀" : "布";

        printf("您出:%s\n", player_gesture_name);

        // 3. 对手出拳
        printf("\n--- 对手出拳 ---\n");
        // 创建一个变量,作为对手的出拳序号,这个序号需要随机生成1~3
        int computer_gesture = rand() % 3 + 1;
        const char* computer_gesture_name = computer_gesture == 1 ? "石头" : computer_gesture == 2 ? "剪刀" : "布";
        
        // 显示对手出拳信息
        printf("%s出:%s\n", opponent_name, computer_gesture_name);

        // 4. 判断胜负
        printf("\n--- 判断胜负 ---\n");
        // 创建一个变量,用来存储比较的结果
        int result = (player_gesture - computer_gesture + 3) % 3;
        printf("战况:");
        // 比较
        if (result == 0) printf("平局!\n");
        else if (result == 2) printf("您赢了!\n");
        else printf("您输了!\n");

        // 5. 游戏退出
        printf("\n--- 游戏退出 ---\n");

        printf("继续游戏?【Y/N】");
        // 清空输入缓冲区
        while (getchar() != '\n');
        // 获取控制台输入
        char choice = getchar(); // 等价于 char choice; scanf("%c", &choice);
        // 修改循环状态
        game_running = choice == 'Y' || choice == 'y' ? 1 : 0;

    }

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

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值