1. 程式人生 > >171114—程式學習:猜數遊戲。

171114—程式學習:猜數遊戲。

這題自己折騰很久了。沒搞出來。看了參考的程式,當時學習了,存點自己的考慮。
原題:
猜數遊戲。玩家想好了一個 1~1000 之內的整數,由計算機來猜這個數。如果計算機猜出的數比 玩家想的數大,則玩家輸入1;如果計算機猜出的數比玩家想的數小,則玩家輸入-1;這個過程一直進行到 計算機猜中為止,玩家輸入0。

一針見血的問題:
怎麼實現多次輸入數值加回車?你之前寫的程式可是隻能玩一次就掛掉了。。!
答:

while1)
{
cin>>....;
if(。。。)break;
}

由此便可實現,while語句的迴圈條件永遠成立,可多次讀取新的輸入數值,並完成計算。
而“break”則承擔著跳出迴圈,終結程式的作用。(詳見轉向語句。另有continue可從此次迴圈中跳出,進行下一次迴圈。)

另外,猜數的主要演算法如何實現?
而且,顯然這個程式需要糾錯機制:

  1. 保證輸入值合乎範圍(0,1,-1)
  2. 保證所猜的值在合理範圍【1,1000】
  3. 防止出現賴皮操作。(猜500嫌大,猜499嫌小。或者命名猜中卻刻意繼續)

看參考的程式碼:

#include<iostream> 
using namespace std; 
int guess(int k=0);



int main()
{
 int feedback,t=1; 
 cout<<"請你想好一個1~1000之內的整數,別告訴我,讓我來猜猜!\n"; 
 cout<<"猜中了,請輸入0;若猜的數小了,請輸入-1;若猜的數大了,請輸入1\n"
; cout<<"開始猜了……\n"; cout<<"是 "<<guess()<<" 嗎?\t"; while(1) //用while(1)和break來實現多次操作。 { cin>>feedback; if(feedback==0) //主函式只完成對反饋值的初步判斷和計數。追求低耦合度。 { //自己寫的時候發現很容易寫得很多很多層。。自己搞暈自己。
cout<<"我猜中啦!只猜了 "<<t<<" 次,很強吧!\n"; break; } cout<<"是 "<<guess(feedback)<<" 嗎?\t"; t++; } } //演算法的主要思想是,利用二分法,其中,left和right給出了猜數的區間端點,每次猜數即去區間中值,而在每次反饋之後,按反饋結果將上次所猜的數值g賦給left或right,得到新的區間。重複進行。很好的用Cpp描述了這個方法的過程,佩服佩服。 int guess(int k) { static int left=1; static int right=1000; static int g = 500; switch(k) { case 0: break; case 1: right=g-1; break; case -1: left=g+1; break; default : cout<<"你輸入錯了,請再輸入。\n"; return g; } //switch語句只負責了判斷輸入值並賦值的準備工作,沒有直接輸出.很智慧。 //如果不這樣的話,在完成賦值之後,最起碼賴皮操作就沒法判斷。。因為你還要輸出,讀都費勁,寫更容易出錯! if(right<=left) { cout<<"你耍賴…不跟你玩了!\n"; //防賴皮通過在一次反饋之後,輸出新值之前判斷區間是否符合left《right來達到。(我這是嚴格小於號!) exit(0); } g=(left+right)/2; return g; }