mustang 发表于 2017-3-30 10:24:05

万事开头难!!猜数字*A*B


想写一个猜数字的游戏,规则如下:

1.电脑随机生成四个数字(不重复的),例如:2078

2.用户猜四个数字,例如:8053

3.将用户的输入与电脑生成的数字进行比对,返回结果:
         位置和值都对,返回A
         位置不对,值对,返回B
         例如:2078 和 8053 就返回 1A1B
4.给8次猜的机会,次数用完或者猜对(返回4A0B)则游戏结束

万事开头难,各位大神给指导指导思路!!

lumber2388779 发表于 2017-3-30 11:31:05

python的话用list就可以了,生成随机数的时候只要检测到list中没有就加入,一次加入一位数,高位的数在list低位,输入的数也是这个排位,然后用in和not in 还有索引来比较值就能获取AB对应的值
C语言的话用字符数组存储,其他的跟python的大同小异

人造人 发表于 2017-3-30 11:32:48

程序似乎是没问题^_^

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

void generate_abcd(int *a, int *b, int *c, int *d)
{
        *a = rand() % 10;

        do
        {
                *b = rand() % 10;
        }
        while(*b == *a);

        do
        {
                *c = rand() % 10;
        }
        while((*c == *a) || (*c == *b));

        do
        {
                *d = rand() % 10;
        }
        while((*d == *a) || (*d == *b) || (*d == *c));
}

void input_abcd(int *a, int *b, int *c, int *d)
{
        char buf;

        printf("please input abcd:");
        fgets(buf, 10, stdin);
        sscanf(buf, "%c%c%c%c", (char *)a, (char *)b, (char *)c, (char *)d);

        *a -= '0';
        *b -= '0';
        *c -= '0';
        *d -= '0';
}

int main(void)
{
        int a = 0, b = 0, c = 0, d = 0;
        int ua = 0, ub = 0, uc = 0, ud = 0;
        int resualt_a = 0, resualt_b = 0;
        int chance = 8; // 8次机会

        srand((unsigned int)time(NULL));

        generate_abcd(&a, &b, &c, &d);

        while(chance)
        {
                //printf("%d        %d        %d        %d\n", a, b, c, d); // 此代码用来作弊^_^


                resualt_a = 0;
                resualt_b = 0;

                printf("还有%d次机会\n", chance);
                input_abcd(&ua, &ub, &uc, &ud);

                if(a == ua) resualt_a++;
                if(b == ub) resualt_a++;
                if(c == uc) resualt_a++;
                if(d == ud) resualt_a++;

                if(resualt_a == 4)
                {
                        printf("4A0B\n");
                        printf("恭喜你,猜对了^_^\n");
                        return 0;
                }

                if(a == ub) resualt_b++;
                if(a == uc) resualt_b++;
                if(a == ud) resualt_b++;
                if(b == ua) resualt_b++;
                if(b == uc) resualt_b++;
                if(b == ud) resualt_b++;
                if(c == ua) resualt_b++;
                if(c == ub) resualt_b++;
                if(c == ud) resualt_b++;
                if(d == ua) resualt_b++;
                if(d == ub) resualt_b++;
                if(d == uc) resualt_b++;

                printf("%dA%dB\n", resualt_a, resualt_b);

                chance--;
        }

        printf("很遗憾,答案是:\n");
        printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);

        return 0;
}

mustang 发表于 2017-3-30 12:14:21

人造人 发表于 2017-3-30 11:32
程序似乎是没问题^_^

谢啦!!   

mustang 发表于 2017-3-30 12:16:20

lumber2388779 发表于 2017-3-30 11:31
python的话用list就可以了,生成随机数的时候只要检测到list中没有就加入,一次加入一位数,高位的数在list ...

谢啦!!   思路清晰了不少

mustang 发表于 2017-3-30 12:17:29

lumber2388779 发表于 2017-3-30 11:31
python的话用list就可以了,生成随机数的时候只要检测到list中没有就加入,一次加入一位数,高位的数在list ...

高位的数在list低位   怎么理解?

冬雪雪冬 发表于 2017-3-30 12:40:30

我用python写了一个。
import random
computer =
random.shuffle(computer)
computer = computer[:4]
for num in range(8):
    person = list(input('请输入4个数字,中间不用隔开:'))
    a = 0
    b = 0
    for n, i in enumerate(person):
      if i == computer:
            a += 1
      elif i in computer:
            b += 1
    print('%dA%dB'%(a, b))
    if a == 4:
      print('你答对了,这4个数字是%s。'%','.join(computer))
      break
else:
    print('8次机会用光,你没有答对,这4个数字是%s。'%','.join(computer))
   

lumber2388779 发表于 2017-3-30 13:55:43

mustang 发表于 2017-3-30 12:17
高位的数在list低位   怎么理解?

就是list是千位 ,list是百位

lumber2388779 发表于 2017-3-30 13:56:28

冬雪雪冬 发表于 2017-3-30 12:40
我用python写了一个。

{:10_275:}冬雪大神的代码总是如此简洁

gopythoner 发表于 2017-3-30 14:51:12

import random
# 得到一个随机4个数字的列表
secret = random.sample(range(10),4)
#print(secret)
# 给你8次机会
times = 8
while times:
# 获得一个4个数字的字符串
temple = input("请输入你的四个数字:")
# A,B分别代表满足条件的个数,起始为0
A = 0
B = 0
# i代表的是位置
for i in range(len(secret)):
    # 满足位置和值都相同
    if str(temple) == str(secret):
      A +=1
    # 满足值相同
    if int(temple) in secret:
      B +=1
# 定义输入字符串
outstr = "{}A{}B".format(A,B)
print(outstr)
# 定义跳出循环条件
if outstr == "4A4B":
    print("你只用了{}次机会就猜对了,厉害了我的皮皮虾!".format(9-times))
    break
elif times == 1:
    print("8次机会用完还没猜对,你这智商只适合玩王者荣耀,去吧皮卡丘!")
times -=1

python代码,每个地方都加了注释
测试了一下,符合要求:

请输入你的四个数字: 1221
0A2B
请输入你的四个数字: 8302
4A4B
你用了2次机会就猜对了,厉害了我的皮皮虾!

mustang 发表于 2017-3-30 15:32:38

gopythoner 发表于 2017-3-30 14:51
python代码,每个地方都加了注释
测试了一下,符合要求:

牛掰了,word皮皮虾!!{:5_98:}

mustang 发表于 2017-3-30 15:37:20

本帖最后由 mustang 于 2017-3-30 15:39 编辑

gopythoner 发表于 2017-3-30 14:51
python代码,每个地方都加了注释
测试了一下,符合要求:

题目中有个条件没申明清楚   
就是数字如果如果返回了A就不能再返回B   
例如:9527和9572   就返回    2A2B   而不能是4A4B

...公子 发表于 2017-3-30 16:10:22

python代码量确实好少。其实主要点在与4位数生成与比对,其他跟小甲鱼的猜猜心里想的数字基本一样,把数字比对解决就完成 了。{:5_91:}

gopythoner 发表于 2017-3-30 17:48:20

mustang 发表于 2017-3-30 15:37
题目中有个条件没申明清楚   
就是数字如果如果返回了A就不能再返回B   
例如:9527和9572   ...

if int(temple) in secret:
那这句的if改成elif
if outstr == "4A4B":
这句改成if A ==4:
就行了,跟楼上的答案基本是一样的,只是写法有的地方不同而已

请输入你的四个数字: 3140

2A2B
请输入你的四个数字: 3104
4A0B
你只用了2次机会就猜对了,厉害了我的皮皮虾!

gopythoner 发表于 2017-3-30 17:52:56

...公子 发表于 2017-3-30 16:10
python代码量确实好少。其实主要点在与4位数生成与比对,其他跟小甲鱼的猜猜心里想的数字基本一样,把数字 ...

错了,并不一定是一个数
按照题目要求只需要产生4个数字就行,那第一位可以是0,如果第一位是0的话就不能变成数字了
所以应该当成一个列表或者字符串来比较

99592938 发表于 2017-3-31 09:25:04

本帖最后由 99592938 于 2017-3-31 09:33 编辑

import random
def rand():
    li=[]
    while len(li)<4:
      if len(li)==0:
            li.append(str(random.randint(1,9)))
      else:
            t=str(random.randint(0,9))
            if not t in li:
                li.append(t)
    return ''.join(li)

def comparison(x,y):
    if x==y:
      print('恭喜回答正确,电脑想的就是:%d'%(int(x)))
      print('游戏结束,祝你好运!')
      return 0
    a=b=0
    l_temp=[]
    for i in range(4):
      if x==y:
            a+=1
      elif x in y:
            b+=1
    print('不好意思,猜的不太对,给你个提示哟:%dA%dB' %(a,b))
    return 1

def isint(x):
    while 1:
      if len(set(x))!=len(x):
            x=input('输入有重复数字,请重新输入:')
      elif int(x) not in range(1000,10000):
            x=input('输入的不是4位整数,请重新输入:')
      else:
            break
    return x

ran=rand()
temp=str(input('请输入一个4位不重复的整数:'))
num=isint(temp)
chance=8
while chance-1:
    chance-=1
    if comparison(ran,num):
      num=input('你还有%d次机会,要把握好哦,再写一个数吧:' %(chance))
      num=isint(num)
    else:
      break
if comparison(ran,num):
    print('你的机会用完了。\n若想继续猜,请给支付宝182****8896充值吧,一元一次机会哦。')
    print('哈哈,玩笑啦,告诉你电脑怎么想的吧,她想的是:%d\n再见咯,祝你好运!'%(int(ran)))
应该没啥问题

machimilk 发表于 2017-3-31 13:58:47

#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
int num={0};//答案数组
int guess={0};//用户输入的答案数组
int inputnum=0;//用户输入
int pos=0;//位置正确
int bingo=0;//数字正确
int chance=10;//几次机会
int GetRandNum()//生成随机数字
{
        srand((unsigned int)time(0));
        return rand()%10;
}
void GenerateResule()//生成4位0-9不重复答案
{
        int p=0;
        int temp=0;
        for (int i=0;i<4;i++)
        {
                if(i==0)
                {
                        num=GetRandNum();
                }
                else
                {
                        p=i;
                        temp=GetRandNum();
                        while(p)
                        {
                                if (temp==num[--p])
                                {       
                                        temp=GetRandNum();
                                        p=i;
                                }
                        }
                        num=temp;
                }
        }
}
void ManageInput()//把用户输入的数字处理到数组里面
{
        cin>>inputnum;
        for(int i=0;i<4;i++)
        {
                guess=inputnum/(int)pow(10.0,3-i);
                inputnum-=guess*(int)pow(10.0,3-i);
        }
}
int main(void)
{
        GenerateResule();
        cout<<"请输入4位不重复0-9的数字:"<<endl;
        ManageInput();
        while(chance)
        {
                for(int i=0;i<4;i++)
                {
                        for (int j=0;j<4;j++)
                        {
                                if (num==guess )
                                {
                                        bingo++;
                                }

                        }
                        if (num==guess)
                        {
                                pos++;
                        }
                }
                if (pos==4 && bingo==4)
                {
                        cout<<"恭喜您猜中答案!"<<endl;
                        break;
                }else
                {
                        chance--;
                        if(!chance)
                        {
                                cout<<"10次都没猜中,只能GAME OVER了!!"<<endl;
                                break;
                        }
                        cout<<"猜中"<<bingo<<"个数字,有"<<pos<<"个数字位置正确。还有"<<chance<<"次机会..."<<endl;
                        pos=0;
                        bingo=0;
                        ManageInput();
                }
        }
        system("pause");
        return 0;
}

页: [1]
查看完整版本: 万事开头难!!猜数字*A*B