3ピースチェスと5ピースチェスCの実現は同じであり、それぞれ実現するには以下のパーツに分割する必要があります。以下は主に3つのチェスの実現を紹介します。
1.
ボードの初期化2.ボードの表示
3.プレイヤー入力
4. 3ピースの状況があるかどうかを判断する
5.コンピューターによる自動入力
6. 3ピースの状況があるかどうかを判断する
1.ボードの初期化:
void InitialArr(char Arr[][COL], int row, int col)
{
int i = 0;
for (; i < row; i++)
{
int j = 0;
for (; j < col; j++)
{
Arr[i][j] = ' ';
}
}
}
最初のボードのすべてのキャラクターを設定します' '
。
2.チェッカーボード表示:
void ShowArr(char Arr[][COL], int row, int col)
{
int i = 0;
printf("-----------\n");
printf(" 1| 2| 3|\n");
printf("-----------\n");
for (; i < row; i++)
{
printf("%d| %c| %c| %c|\n", i+1, Arr[i][0], Arr[i][1], Arr[i][2]);
printf("-----------\n");
}
}
これは3 * 3のチェス盤です。複雑にする必要はなく、単に表示するだけです。
3.プレイヤー入力:
int PlayerArr(char Arr[][COL], int row, int col)
{
printf("Please input your row and col:>");
int i = 0;
int j = 0;
scanf("%d %d", &i, &j);
if (i >= 1 && i <= 3 && j >= 1 && j <= 3)
{
if (Arr[i-1][j-1] != ' ')
{
return 2; //该位置已经有点了,不能再输入
}
else
{
Arr[i - 1][j - 1] = BLACK;
return 1; //输入正确
}
}
return -1; //坐标输入错误
}
プレイヤーによる入力が表示されます‘X’
。
ここでは、プレーヤーの入力方法として、キーボードから座標を入力することを選択しています。入力が間違っている(範囲が正しくない)場合、または座標が既に少しでもある場合は、エラーが表示され、プレーヤーに再度入力するよう求められます。
4. 3つのサブ条件があるかどうかを判断します。
int JudgeArr(char Arr[][COL], int row, int col)
{
int i = 0;
for (;i<row;i++)//每行三子,且不为空
{
if (Arr[i][0]!=' '&& Arr[i][0] == Arr[i][1] && Arr[i][1] == Arr[i][2])
{
return Arr[i][0];
}
}
for (i=0; i < row; i++)//每列三子,且不为空
{
if (Arr[0][i] != ' '&&Arr[0][i] == Arr[1][i] && Arr[1][i] == Arr[2][i])
{
return Arr[0][i];
}
}
if (Arr[0][0] != ' '&&Arr[0][0] == Arr[1][1] && Arr[1][1] == Arr[2][2])
{
return Arr[0][0];
}//主对角线,且不为空
if (Arr[0][2] != ' '&&Arr[0][2] == Arr[1][1] && Arr[1][1] == Arr[2][0])
{
return Arr[0][2];
}//副对角线,且不为空
for (i = 0; i < row; i++)
{
int j = 0;
for (; j < col; j++)
{
if (Arr[i][j] == ' ')
{
return 'E'; //Empty,棋盘还有空,继续下棋
}
}
}
return 'D';//Draw,棋盘满了,未有输赢,平局
}
判定はプレイヤーとコンピューターの入力後に行われます。勝ちまたは負けの状況は8 つあります。各行に3人の子供、各列に3人の子供、主対角線および副対角線があり、空のものはありません。
他の2つの状況:
- ボードは無料です。引き続きプレイしてください
- チェス盤がいっぱいで、勝ち負けなし、引き分け
5.コンピュータ自動入力:
void ComputerArr(char Arr[][COL], int row, int col)
{
while (1)
{
int i = rand() % row;
int j = rand() % col;
if (Arr[i][j] == ' ')
{
Arr[i][j] = WHITE;
break;
}
}
Sleep(500);
printf("Computer done!\n");
}
ここでは、srand関数とrand関数を使用して乱数を生成しています。生成された行と列、および対応するチェス盤がこの時点で空の場合、それらはチェスの駒に落ち、コンピュータのチェスの駒はになり‘O’
ます。ここで少し遅延が設定されています。
6. 3人の息子がいるかどうかを確認する
これは、上記のステップ4と同じです。
ゲームの手順:
void Game()
{
printf("\n游戏开始!\n");
char Arr[ROW][COL];
InitialArr(Arr, ROW, COL);
char ret = 'E'; //Empty,棋盘最开始全为空,返回值可为D,WHITE和BLACK
int ProRet = 0;
while (1)
{
ShowArr(Arr, ROW, COL);
again: //输入不对的情况,重新输入
ProRet=PlayerArr(Arr, ROW, COL);
if (2 == ProRet)
{
printf("该位置已经有点了,请重新输入\n");
goto again;
}
else if (-1 == ProRet)
{
printf("坐标输入有误,请重新输入\n");
goto again;
}
else
{
printf("Player done!\n");
Sleep(500);
}
ret=JudgeArr(Arr, ROW, COL);
if (ret != 'E')//不等于空,棋盘满了,不执行了
{
break;
}
ComputerArr(Arr, ROW, COL);
ret = JudgeArr(Arr, ROW, COL);
if (ret != 'E')//不等于空,棋盘满了,不执行了
{
break;
}
}
ShowArr(Arr, ROW, COL);
switch (ret)//进行判定,谁输谁赢,平局
{
case BLACK:
printf("\n恭喜你,你赢了!\n");
break;
case WHITE:
printf("\n很遗憾,你输了!\n");
break;
case 'D':
printf("\n平局,再接再厉!\n");
break;
default:
break;
}
printf("\n游戏结束!\n");
}
ゴバンのサンプル画像は、サンバンの実現方法と同じです。
3つのチェスとgobangのプログラムをGithubに配置しました。必要に応じて、3つのチェスとgobangを入手してください。