私の答え:
最初の質問の最後の部分:コーディングは良さそうです。プログラムが非常に説得力のあるものであっても、いくつかの操作についてコメントしていただければ幸いです(// / * * /)。
私の意見では、あなたの質問は、演習を解決するという点で少し誤解を招くものです。最初は同じようにあなたのやり方を考えました。問題は、パターンが誤ったチェックパターンを許可するため、パターンが3の頻度で検出されるだけではないことです。視覚化するには:
7 8 9
4 5 6
1 2 3
1、2、5、9 6 5のような3の頻度は正解ではありませんが、-159は正解です。そして、すべての周波数パターンを計算したとしても、私のソリューションの次のブログで定義されている、私が見つけたソリューションよりもはるかに多くのコーディングになります。
status_check = possibilities(field,player,2,0,1,1,0,2); //diagonal 1 5 9
status_check = possibilities(field,player,0,0,1,1,2,2); //diagonal 7 5 3
status_check = possibilities(field,player,0,0,1,0,2,0); //vertical 7 4 1
status_check = possibilities(field,player,0,1,1,1,2,1); //vertical 8 5 2
status_check = possibilities(field,player,0,2,1,2,2,2); //vertical 9 6 3
status_check = possibilities(field,player,0,0,0,1,0,2); //horizontal 7 8 9
status_check = possibilities(field,player,1,0,1,1,1,2); //horizontal 4 5 5
status_check = possibilities(field,player,2,0,2,1,2,2); //horizontal 1 2 3
*それが私がnumパッドでプレイできるエクササイズを考え出した方法です(私はそのコードを本当に誇りに思っています。:-))
ちなみに私はその本が大好きですが、残念ながらそれを理解できませんでした。「ボーナス:グリッド全体がいっぱいになる前にどちらの側でもゲームに勝てないかどうかをプログラムに検出させることができますか?」しかし、誰かがその章を飛び越えた場合-この解決策は確かに役立ちます:*
演習は次のようになります(121ページ、Cppにジャンプ)。
2人のプレーヤーが三目並べを競争的にプレイできるようにする小さな三目並べプログラムを作成します。プログラムは、どちらかのプレーヤーが勝ったかどうか、またはボードが完全にいっぱいになっているかどうか(ゲームが引き分けで終了するかどうか)を確認する必要があります。ボーナス:グリッド全体がいっぱいになる前にどちらの側でもゲームに勝てないかどうかをプログラムに検出させることができますか?
次のコードは、c ++ 17標準で簡単にコンパイルおよび実行でき、すべてのライブラリはgcc(GCC)8.2.1で使用できる必要があります。
#include <iostream>
#include <string>
#include <limits> //just for the input validation
using namespace std;
int input_check(char field[3][3],char player);
void display_field(char field[3][3],int size);
void initialize_field(char field[3][3],int size,char player);
string win_check(char field[3][3],char player,int size);
int code(char field[3][3],int i,int j,char player);
int possibilities(char field[3][3],char player,int a,int aa,int b,int bb,int c,int cc);
int main()
{
char field[3][3];
int size = 3;
char player ='-';
initialize_field(field,size,player);
display_field(field,size);
while (field[0][0]!='w')
{
player = 'X';
input_check(field,player);
system("clear");
display_field(field,size);
cout << win_check(field,player,size);
if (field[0][0] =='w')
{
cout << endl;
break;
}
player = 'O';
input_check(field,player);
system("clear");
display_field(field,size);
cout << win_check(field,player,size);
if (field[0][0] =='w')
{
cout << endl;
break;
}
}
return 0;
}
void initialize_field(char field[3][3],int size,char player)
{
int i,k;
for (i = 0; i < size; i++)
{
for (k = 0; k < size; k++)
{
field[i][k]= player;
}
}
}
int input_check(char field[3][3],char player)
{
int input = 0;
bool def = false;
while (def != true)
{
while(!(cin >> input))
{ //check the Input format for integer the right way
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Invalid input. Try again: ";
}
switch (input)
{
case 1:{
def = code(field,2,0,player);
break;}
case 2:{
def = code(field,2,1,player);
break;}
case 3:{
def = code(field,2,2,player);
break;}
case 4:{
def = code(field,1,0,player);
break;}
case 5:{
def = code(field,1,1,player);
break;}
case 6:{
def = code(field,1,2,player);
break;}
case 7:{
def = code(field,0,0,player);
break;}
case 8:{
def = code(field,0,1,player);
break;}
case 9:{
def = code(field,0,2,player);
break;}
default:{
cout << "Invalid input. Try again: " << endl;
break;}
}
}
/*
7 8 9 00 01 02
4 5 6 10 11 12
1 2 3 20 21 22
*/
return input;
}
int code(char field[3][3],int i,int j,char player)
{
int def=0;
if (field[i][j]=='-')
{
field[i][j]=player;
def = true;
}
else
{
cout << "Invalid input. Try again: " << endl;
}
return def;
}
void display_field(char field[3][3],int size)
{
int i,k;
for (i = 0; i < size; i++)
{
for (k = 0; k < size; k++)
{
cout << field[i][k];
cout << " ";
if (k==2) //seperate with new line after the third k
{
cout << endl;
}
}
}
}
string win_check(char field[3][3],char player,int size)
{
string status;
int status_check;
/*
7 8 9 00 01 02
4 5 6 10 11 12
1 2 3 20 21 22
*/
if ((field[0][0]!='-')&&(field[0][1]!='-')&&(field[0][2]!='-') &&(field[1][0]!='-')&&(field[1][1]!='-')&&(field[1][2]!='-')&&(field[2][0]!='-')&&(field[2][1]!='-')&&(field[2][2]!='-'))
{
status = "Rien ne va plus - Nichts geht mehr meine Lieben. Unentschieden";
field[0][0]='w';
}
status_check = possibilities(field,player,2,0,1,1,0,2); //diagonal 1 5 9
status_check = possibilities(field,player,0,0,1,1,2,2); //diagonal 7 5 3
status_check = possibilities(field,player,0,0,1,0,2,0); //vertical 7 4 1
status_check = possibilities(field,player,0,1,1,1,2,1); //vertical 8 5 2
status_check = possibilities(field,player,0,2,1,2,2,2); //vertical 9 6 3
status_check = possibilities(field,player,0,0,0,1,0,2); //horizontal 7 8 9
status_check = possibilities(field,player,1,0,1,1,1,2); //horizontal 4 5 5
status_check = possibilities(field,player,2,0,2,1,2,2); //horizontal 1 2 3
if (status_check == true)
{
status = "Player " + string(1, player) + " won!!";
field[0][0] ='w';
}
return status;
}
int possibilities(char field[3][3],char player,int a,int aa,int b,int bb,int c,int cc)
{
int status;
if ((field[a][aa]==player)&&(field[b][bb]==player)&&(field[c][cc]==player))
{
status = true;
}
return status;
}