珠玑妙算

本文介绍了一个简单的珠玑妙算游戏程序实现。通过C语言完成游戏逻辑,包括随机生成4位不重复数字、用户输入验证及反馈结果计算等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

void make4digits(int x[])
{
    int i, j, val;
    for( i = 0; i < 4; i++){
        do{
            val = rand() % 10;
            for( j = 0; j < i; j++)
                if( val == x[j])
                    break;
        }while( j < i);
        x[i] = val;
    }
}

int check(const char s[])
{
    int i, j;
    if( strlen(s) != 4)
        return 1;
    for( i = 0; i < 4; i++){
        if( !isdigit( s[i] ))
            return 2;
        for( j = 0; j < i; j++)
            if( s[i] == s[j] )
                return 3;
    }
    return 0;
}

void judge(const char s[], const int no[], int* hit, int* blow)
{
    int i, j;
    *hit = *blow = 0;
    for( i = 0; i < 4; i++){
        for( j = 0; j < 4; j++){
            if( s[i] == '0' + no[j])
                if( i == j)
                    (*hit)++;
                else
                    (*blow)++;
        }
    }
}

void print_result(int sum, int spos)
{
    if( spos == 4)
        printf("回答正确!!");
    else if( sum == 0)
        printf("    这些数字里没有答案数字。\n");
    else{
        printf("    这些数字里包括%d个答案数字。\n", sum);

        if( spos == 0)
            printf("    但是数字的位置都不一致。\n");
        else
            printf("    其中有%d个数字的位置是一致的。\n", spos);
    }
    putchar('\n');
}

int main(void)
{
    int try_no = 0;
    int chk;
    int hit;
    int blow;
    int no[4];
    char buff[10];
    clock_t start, end;

    srand(time(NULL));

    puts("  来玩珠玑妙算吧。");
    puts("  猜猜4个数字。");
    puts("  其中不包含相同数字。");
    puts("  请像4307这样输入数字。");
    puts("  不能输入空格字符。");

    make4digits(no);

    start = clock();

    do{
        do{
            printf("请输入:");
            scanf("%s", buff);

            chk = check(buff);

            switch(chk){
                case 1 : puts("\a请确保输入四个字符。"); break;
                case 2 : puts("\a请不要输入除了数字以外的字符。"); break;
                case 3 : puts("\a请不要输入相同的数字。"); break;
            }
        }while( chk != 0);


        try_no++;
        judge(buff, no, &hit, &blow);
        print_result(hit + blow, hit);
    }while( hit < 4);

    end = clock();

    printf("用了%d次。\n用时%.1f秒。\n", try_no, (double)(end - start) / CLOCKS_PER_SEC);

    return 0;
}
    ***话不都说代码直接奉上***
Python珠玑妙算是一道猜数字游戏,游戏规则如下:系统随机生成一个长度为4的字符串,字符串由RGBY四个字符组成,且字符可以重复。玩家需要在10次机会内猜出系统生成的字符串,每次猜测后系统会给出两个数字,分别表示猜对了几个字符且位置正确(称为A),以及猜对了几个字符但位置不正确(称为B)。玩家需要根据系统给出的A和B来推测系统生成的字符串。 以下是一个Python珠玑妙算的实现,其中引用和引用分别提供了两种不同的实现方式: ```python # 引入必要的库 import random from typing import List # 实现珠玑妙算游戏 class Solution: def masterMind(self, solution: str, guess: str) -> List[int]: # 初始化变量 j = 0 answer = [0, 0] # 遍历solution字符串 for _ in solution: # 如果当前字符与guess字符串中对应位置的字符相同 if _ == guess[j]: # A加1 answer[0] += 1 # 将guess和solution中对应位置的字符都替换为空 guess = guess.replace(_, "", 1) solution = solution.replace(_, "", 1) else: # 否则j加1 j += 1 # 遍历guess字符串 for _ in guess: # 如果当前字符不为空 if _ != "": # 计算guess和solution中当前字符的出现次数 count1 = guess.count(_) count2 = solution.count(_) # 如果guess中当前字符出现次数大于1,将guess中所有当前字符都替换为空 if count1 > 1: guess = list(filter(lambda x: x != _, guess)) # B加上guess和solution中当前字符出现次数的最小值 answer[1] += min(count2, count1) # 返回结果 return answer # 生成随机字符串 def generate_random_string(): colors = ['R', 'G', 'B', 'Y'] return ''.join(random.choices(colors, k=4)) # 主函数 if __name__ == '__main__': # 初始化变量 solution = generate_random_string() guess = '' count = 0 # 循环10次 while count < 10: # 获取用户输入 guess = input('请输入你猜测的字符串(由RGBY四个字符组成,且字符可以重复):') # 判断用户输入是否合法 if len(guess) != 4 or not all(c in 'RGBY' for c in guess): print('输入不合法,请重新输入!') continue # 调用珠玑妙算函数 result = Solution().masterMind(solution, guess) # 输出结果 print('A:{}, B:{}'.format(result[0], result[1])) # 如果猜对了,退出循环 if result[0] == 4: print('恭喜你猜对了!') break # 否则次数加1 count += 1 # 如果次数用完了,输出答案 if count == 10: print('很遗憾,你没有在规定次数内猜对,答案是:{}'.format(solution)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值