万事开头难!!猜数字*A*B
想写一个猜数字的游戏,规则如下:
1.电脑随机生成四个数字(不重复的),例如:2078
2.用户猜四个数字,例如:8053
3.将用户的输入与电脑生成的数字进行比对,返回结果:
位置和值都对,返回A
位置不对,值对,返回B
例如:2078 和 8053 就返回 1A1B
4.给8次猜的机会,次数用完或者猜对(返回4A0B)则游戏结束
万事开头难,各位大神给指导指导思路!! python的话用list就可以了,生成随机数的时候只要检测到list中没有就加入,一次加入一位数,高位的数在list低位,输入的数也是这个排位,然后用in和not in 还有索引来比较值就能获取AB对应的值
C语言的话用字符数组存储,其他的跟python的大同小异 程序似乎是没问题^_^
#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;
}
人造人 发表于 2017-3-30 11:32
程序似乎是没问题^_^
谢啦!! lumber2388779 发表于 2017-3-30 11:31
python的话用list就可以了,生成随机数的时候只要检测到list中没有就加入,一次加入一位数,高位的数在list ...
谢啦!! 思路清晰了不少 lumber2388779 发表于 2017-3-30 11:31
python的话用list就可以了,生成随机数的时候只要检测到list中没有就加入,一次加入一位数,高位的数在list ...
高位的数在list低位 怎么理解? 我用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))
mustang 发表于 2017-3-30 12:17
高位的数在list低位 怎么理解?
就是list是千位 ,list是百位 冬雪雪冬 发表于 2017-3-30 12:40
我用python写了一个。
{:10_275:}冬雪大神的代码总是如此简洁 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次机会就猜对了,厉害了我的皮皮虾! gopythoner 发表于 2017-3-30 14:51
python代码,每个地方都加了注释
测试了一下,符合要求:
牛掰了,word皮皮虾!!{:5_98:} 本帖最后由 mustang 于 2017-3-30 15:39 编辑
gopythoner 发表于 2017-3-30 14:51
python代码,每个地方都加了注释
测试了一下,符合要求:
题目中有个条件没申明清楚
就是数字如果如果返回了A就不能再返回B
例如:9527和9572 就返回 2A2B 而不能是4A4B python代码量确实好少。其实主要点在与4位数生成与比对,其他跟小甲鱼的猜猜心里想的数字基本一样,把数字比对解决就完成 了。{:5_91:} 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次机会就猜对了,厉害了我的皮皮虾!
...公子 发表于 2017-3-30 16:10
python代码量确实好少。其实主要点在与4位数生成与比对,其他跟小甲鱼的猜猜心里想的数字基本一样,把数字 ...
错了,并不一定是一个数
按照题目要求只需要产生4个数字就行,那第一位可以是0,如果第一位是0的话就不能变成数字了
所以应该当成一个列表或者字符串来比较 本帖最后由 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)))
应该没啥问题 #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]