我在为我的c ++二十一点应用程序代码发表评论时遇到了困难。我已经对它进行了编码,但是现在我对于评论的内容感到困惑,我的导师在评论方面很节俭。
感谢您的帮助! :)
这是我的代码:
#include <iostream> // in/out for form
#include <ctime> // uses time for randomizing
#include <Windows.h> //
using namespace std; // prevents redundancey of ::STD
char enter[1]; //
int hand[52] = {}, dealer[52]; // array of 52 for 52 cards that holds zero
int GetScore(int param) // function prototype that calls getscore
{
int score = 0; //
int temp[52]; //
if(param == 0) for(int i = 0; i < 52; i++) temp[i] = hand[i]; //
if(param == 1) for(int i = 0; i < 52; i++) temp[i] = dealer[i]; //
for(int i = 0; i < 52; i++) //
{
if(temp[i] == 0) break; //
if(temp[i] != 11)
{
score += temp[i];
}
}
for(int i = 0; i < 52; i++) // simple loop to ....
{
if(temp[i] == 0) break;
if(temp[i] == 11)
{
if(temp[i] + score <= 21)
{
score += 11;
}
else
{
score += 1;
}
}
}
return score;
}
void ShowDealersHand(int show) //
{
cout << "\n Dealer's hand: "; //
if(show == 1) //
{
if(dealer[0] == 11)
{
cout << "A [Not Shown]";
}
else
{
cout << dealer[0] << " [Not Shown]";
}
}
else
{
for(int i = 0; i < 52; i++)
{
if(dealer[i] == 0) break;
if(dealer[i] == 11)
{
cout << "A ";
}
else
{
cout << dealer[i] << " ";
}
}
}
}
void Blackjack()
{
for(int i = 0; i < 2; i++) //
{
int num, temp;
if(hand[0] == 0) temp = 0;
else temp = 1;
num = rand() % 10 + 2;
hand[temp] = num;
num = rand() % 10 + 2;
dealer[temp] = num;
}
ShowDealersHand(1); //
cout << endl << endl << " Your hand: "; //
for(int i = 0; i < 52; i++) //
{
if(hand[i] == 0) break;
if(hand[i] == 11)
{
cout << "A ";
}
else
{
cout << hand[i] << " ";
}
}
cout << endl << " Your score: " << GetScore(0) << endl << endl;
while(GetScore(0) <= 21)
{
cout << " Hit(h) or stand(s): ";
cin >> enter;
if(strcmp(enter, "h") == 0)
{
int card = rand() % 10 + 2;
for(int i = 0; i < 52; i++)
{
if(hand[i] == 0)
{
hand[i] = card;
break;
}
}
cout << " Your hand: ";
for(int i = 0; i < 52; i++)
{
if(hand[i] == 0) break;
if(hand[i] == 11)
{
cout << "A ";
}
else
{
cout << hand[i] << " ";
}
}
cout << endl << " Your score: " << GetScore(0) << endl << endl;
if(GetScore(0) > 21)
{
cout << " - ..BUST.. -" << endl ;
cout << "\n - !!House Wins!! -";
goto end;
break;
}
}
else if(strcmp(enter, "s") == 0)
{
cout << endl;
break;
}
system("pause > nul");
}
Sleep(2000);
ShowDealersHand(0);
cout << endl << " Dealer score: " << GetScore(1) << endl << endl;
if(GetScore(1) < GetScore(0))
{
while(GetScore(1) < 17 && GetScore(0) <= 21)
{
Sleep(2000);
int card = rand() % 10 + 2;
for(int i = 0; i < 52; i++)
{
if(dealer[i] == 0)
{
dealer[i] = card;
break;
}
}
cout << " Dealer's hand: ";
for(int i = 0; i < 52; i++)
{
if(dealer[i] == 0) break;
if(dealer[i] == 11)
{
cout << "A ";
}
else
{
cout << dealer[i] << " ";
}
}
cout << endl << " Dealer score: " << GetScore(1) << endl << endl;
if(GetScore(1) >= GetScore(0)) break;
}
}
end:
if(GetScore(1) > GetScore(0) && GetScore(1) <= 21)
{
cout << " - !!House Wins!! -";
}
else if(GetScore(1) == GetScore(0) && GetScore(0) <= 21)
{
cout << " * Tie * - !!House Wins!! -";
}
else if(GetScore(0) <= 21)
{
cout << " - !!!You win!!! -"; // outputs if you win
}
system("pause > nul");
system("cls");
}
void main() // no return on main for form to start
{
srand((unsigned int)time(0)); // randomizer unasigned initializer
cout << " *-*-*-*-*Zachattack's Blackjack*-*-*-*-*" << endl << endl; // Name of program outputs to user
Blackjack();
}
答案 0 :(得分:4)
实际上,你的评论毫无用处。以此为例:
int hand[52] = {}, dealer[52]; // array of 52 for 52 cards that holds zero
任何使用C / C ++的人都应该知道该行在做什么,而不必阅读评论。
不是评论你的代码所做的事情(“这一行声明一个int”),而是评论为什么代码执行它所做的事情(你在编写代码时的想法),或者,如果算法很复杂,请评论它是如何做的,或记录如何使用你的功能。
例如,您的GetScore
函数take有一个名为param
的参数。我不知道我期望给param
提供什么值,所以你应该解释一下:“当param为1时,会发生这种情况,当它为0时,会发生这种情况。”
另一个例子:在您的代码中,您有一行Sleep(2000)
。你为什么用这个功能?在评论中解释:
// Sleep 2 seconds to make the game more exciting
Sleep(2000);
始终假设阅读代码的人知道如何使用该语言。永远不要认为阅读代码的人能够理解您对某个问题的思考方式。
答案 1 :(得分:2)
评论应该解释为什么,而不是什么。
因此,您对using namespace std;
的评论是不必要的,因为任何C ++程序员都已经知道using
关键字的作用。
但是,对于GetScore()函数,您省略了总计得分的规则。
评论应该增加价值,而不仅仅是重复的事情,即使粗略看一下代码也是显而易见的。
假设阅读代码的人熟悉编程环境,但并不是您编写代码时想到的内容的参与者。
这是我有时会使用的一个例子 - 一段带有无用注释的代码(你能解决这里发生了什么,为什么?):
// Is the new selection end above the selection start?
if newSelEnd.Line < FSelection.SelStart.Line then
begin
// Is the selection start at the left margin and above the selection end?
if (FSelection.SelStart.Line < FSelection.SelEnd.Line) and
(FSelection.SelStart.Column = 0) then
begin
// Move the selection start down one line
Inc(FSelection.SelStart.Line);
并提供有用的评论:
if newSelEnd.Line < FSelection.SelStart.Line then
begin
// The new selection end is above the selection start, so will become the
// top of the new selection.
if (FSelection.SelStart.Line < FSelection.SelEnd.Line) and
(FSelection.SelStart.Column = 0) then
begin
// The start of the selection was at the top of the old selection and the
// new line is above this, so the selection is about to change direction.
// Since the start column is 0 we assume the original selection was an
// entire line, so we keep the original line selected by moving the start
// position down one line.
Inc(FSelection.SelStart.Line);
答案 2 :(得分:0)
这是关于评论的最重要的规则。可选的是“我为什么要迭代/我在寻找什么”关于循环。幻数是使用GetScore(0) <= 21
或hand[52]
等常量值的每个声明/条件。
这些地方甚至应该为自己评论......当你在一年或更长时间内查看你的代码并且仍然没有任何问题地阅读它时,感觉非常好。
答案 3 :(得分:0)
除了其他答案之外,通常,通过将其替换为命名函数来删除注释是个好主意:
// Find top-scorers:
for (Iter it=scorers.begin(), end=scorers.end(); it!=end; ++it) {
...
{
top.push_back (*it);
}
}
相反,请执行:
const std::vector<Scorer> top = find_top_scorers (scorers.begin(),
scorers.end());
这可以减少错过维护(评论不会强制执行,可能会过时)和可重用性。就个人而言,我总是努力建立无评论的代码,因为我厌倦了过时的评论,只要有可能并且理智。
当然,在上面的示例中,您应该使用std::partial_sort
,std::partition
或std::stable_partition
。
此外,魔术数字应该替换为常量,并且关于错失维护和可重用性的论证相同:
const float x = radius * 3.14159...; // radius * pi
const float pi = 3.14159...,
x = radius * pi;