# cses (5858)、看板:C_and_CPP
作者 cses (5858) 看板 C\_and\_CPP
標題 \[問題\] 關於 xa xb 的猜數字遊戲AI
時間 Fri Jun 17 23:49:07 2011
───────────────────────────────────────
其實是最近老師開了這個題目給我們
要我們寫出一個簡單的AI來讓電腦跟我們玩 幾A幾B的猜數字遊戲
就是...我們自訂一組數字,而電腦就是隨機產生一組亂數來問我們幾A幾B
我們回答他幾A幾B , 一直到猜出數字 4A 0B 這樣
之前爬文有看到隨機產生1~9亂數這部分有看到一種方法是"增加某數字出現的權重"
想問問這種語法要怎麼寫呢 ?
由於本人是C的無敵新手,只看著課本找到srand()這個亂數函式
想問 那種可以控制亂數出現比例的方法 要怎麼寫...
又或著有更好的方法 可以把幾A幾B的AI寫出來呢 :)?
\--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.17.22.253
推 PRAM:老師出作業就是你要去思考,你不應該來這裡問 06/18 00:20
→ firejox:先完成基礎 再做改良 06/18 00:24
→ cses:其實我也只是想問問,那種可以加權的數字產生法而已 06/18 00:50
程式碼如下,請務必看懂程式碼,看不懂可留言發問。
#include <iostream>
using namespace std;
#define SIZE 45
int main(void)
{
int va[SIZE]={1,
2,2,
3,3,3,
4,4,4,4,
5,5,5,5,5,
6,6,6,6,6,6,
7,7,7,7,7,7,7,
8,8,8,8,8,8,8,8,
9,9,9,9,9,9,9,9,9};
//簡單的增加權重方法 陣列對應
while(cin.get())
cout<<va[rand()%SIZE]<<endl;
system("pause");
}
#include<iostream>
#include<fstream>
using namespace std;
string itos(int ia,int ib=0)//整數 轉 string
{
string sb;
while(ia>0)
{
sb+=(char)(ia%10+'0');
ia/=10;
}
for(int i=0;i<sb.size()/2;i++)sb[i]^=sb[sb.size()-1-i]^=sb[i]^=sb[sb.size()-1-i];
if(sb.size()==0)sb="0";
for(int i=sb.size();i<ib;i++)sb="0"+sb;
return sb;
}
int check(int ia,int ib)
{
string sa=itos(ia,4),sb=itos(ib,4);
int result=0;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if(sa[i]==sb[j])
if(i==j)result+=10;
else result+=1;
return result;
}
int main()
{
string sa;
int round=0;
while(true)
{
round++;
int va[5040];
int icount=0,guess,result;
for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
for(int k=0;k<10 && j!=i;k++)
for(int m=0;m<10 && k!=i && k!=j;m++)
if(m!=i && m!=j && m!=k)
va[icount++]=i*1000+j*100+k*10+m;
while(icount>0)
{
guess=va[0];
if(icount==1)break;
cout<<itos(guess,4)<<endl;
cin>>result;
if(result==40 || result<0)break;
va[0]=va[icount-1];
icount--;
for(int i=0;i<icount;i++)
if(check(guess,va[i])!=result)
{
va[i]=va[icount-1];
i--;
icount--;
}
}
if(result<0)break; //無解 結束
cout<<itos(guess,4)<<endl;
}
system("pause");
}