读心术(C)

近来发现一Flash游戏,名读心术.游戏算法奇妙.特以C写出.代码简单,未做注释.感谢指点.

附:本人E文较差,文内提示纯属乱拼.勿怪.

#define WIDTH 9
#define HEIGHT 10
#define HEART 9
#define BYTE 27

using namespace std;  //C++标准命名空间

char UChar[] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZ"};

void Function()    //功能函数
{
   int iAll = 99,iRand = 0,iNumber = 0;
   srand(time(0));
   printf("please select one tens digit:/n");
   printf("******************************************************************/n");
     iNumber = rand() % (BYTE-1);
   for (int iCount = 0;iCount < WIDTH;iCount++)
   {
      printf("*  ");
     for (int jCount = 0;jCount < HEIGHT;jCount++)
     {
      if ((iAll % HEART) != 0 || (iAll / HEART) > 10)
      {
         iRand = rand() % (BYTE-1);
        }else{
         iRand = iNumber;
       }
         printf("%2d-%c  ",iAll,UChar[iRand]);
         iAll = iAll - 1;
    }
     printf("  */n");
     }
   printf("******************************************************************/n");
   printf("please use your select number in : [xy - (x + y)]");
  printf("receive your heart password./n");
  printf("please any key give me look your heart password./n");
   getch();
   printf("please wait.");
   Sleep(1000);
   printf(".");
   Sleep(1000);
   printf(".");
   Sleep(1000);
   printf("/nyour heart password is [%c]./n",UChar[iNumber]);
}

### C语言实现吉普赛读心术算法 吉普赛读心术本质上是一个基于二进制逻辑的游戏,通过一系列问题逐步缩小范围并最终确定目标数字。以下是完整的C语言实现代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_NUMBER 15 // 数字范围为1到15 int main() { int number, guess; printf("请在心里选一个从1到%d之间的整数。\n", MAX_NUMBER); printf("准备好后按回车继续...\n"); getchar(); // 等待用户准备完毕 // 初始化变量 guess = 0; // 提问过程 (基于二进制表示) for (int i = 3; i >= 0; i--) { // 对于4位二进制数 int mask = 1 << i; // 计算当前位对应的掩码 int subset_sum = 0; // 构造子集 for (int j = 1; j <= MAX_NUMBER; j++) { if ((j & mask) != 0) { subset_sum += j; printf("%d ", j); // 打印属于该子集的数字 } } printf("\n这些数字中是否包含你心中的数?(y/n): "); char answer; scanf(" %c", &answer); if (answer == 'y' || answer == 'Y') { guess |= mask; // 如果回答是,则将对应位设置为1 } else if (answer != 'n' && answer != 'N') { printf("输入错误,请重新运行程序。\n"); return 1; } } // 输出猜测结果 printf("你心中的数字是:%d\n", guess); return 0; } ``` #### 解析 上述代码实现了吉普赛读心术的核心逻辑[^2]。 - **核心原理**:利用二进制分解技术,每次提问都针对特定的一组数字集合(由某一位上是否有值决定),从而逐步锁定目标数字。 - **循环机制**:外层`for`循环控制每一位的询问顺序,内层`for`循环负责构建当前位对应的数字子集。 --- ### 示例运行流程 假设用户选择的目标数字为7(其二进制形式为`0111`): 1. 第一次提问涉及第3位(8的倍数部分),即 `{8}`,用户回答“否”。 2. 第二次提问涉及第2位(4的倍数部分),即 `{4, 6, 12, 14}`,用户回答“是”。 3. 第三次提问涉及第1位(2的倍数部分),即 `{2, 3, 6, 7, 10, 11, 14, 15}`,用户回答“是”。 4. 第四次提问涉及第0位(奇数部分),即 `{1, 3, 5, 7, 9, 11, 13, 15}`,用户回答“是”。 最终程序推测出目标数字为7。 --- ### 注意事项 - 用户输入需严格遵循提示中的选项(如`y`/`n`),否则可能导致异常退出。 - 范围限定为1至15之间,因为此范围内所有数字均可被4位二进制唯一表示。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值