【C言語プログラミング】Linux端末でC言語プログラミングで五子棋(コード付)を実現
今日はC言語でLinux環境で五子棋プログラムを記述するコードを共有します.
まず、五子棋を実現し、二つの部分に分けます.
必要なデータ:
1.碁盤配列の定義
2、変数を定義して駒の位置を記録する
3、役割変数の定義
ビジネスロジック:
データを初期化する必要があるかどうか
for(;;)
{
1、スクリーンをクリーンアップし、ボードを表示する
2、落子
座標は合法的で,元の位置に駒があってはならない.
3、五子形成の有無を検査する
4、キャラクターの切り替え
}
その中で最も重要なのは勝負判断であり,一方が勝ったと判定した場合,ゲームを終了し,配列をゼロにしてファイルに書き込み,ゲームを終了する.
勝負を判定する論理は,一方の2次元配列を遍歴し,非ゼロ値が付与された配列項を探し出し,隣接する2つの格子内に同じ値が付与された配列項があるかどうかを判定し,ある場合は記録に1を加え,ない場合は遍歴を継続する.ここで、隣接するレコードは、横(across)、縦(through)、および斜め(slant_rおよびslant_l)に分けられる.遍歴終了後の3つのいずれかのデータが1以上の場合、判定は成功し、ゲームは終了する.具体的なコードは長すぎますが、分かりやすいです.
チェッカーの表示とカーソルの移動:
プログラムコード全体:
まず、五子棋を実現し、二つの部分に分けます.
必要なデータ:
1.碁盤配列の定義
2、変数を定義して駒の位置を記録する
3、役割変数の定義
ビジネスロジック:
データを初期化する必要があるかどうか
for(;;)
{
1、スクリーンをクリーンアップし、ボードを表示する
2、落子
座標は合法的で,元の位置に駒があってはならない.
3、五子形成の有無を検査する
4、キャラクターの切り替え
}
その中で最も重要なのは勝負判断であり,一方が勝ったと判定した場合,ゲームを終了し,配列をゼロにしてファイルに書き込み,ゲームを終了する.
勝負を判定する論理は,一方の2次元配列を遍歴し,非ゼロ値が付与された配列項を探し出し,隣接する2つの格子内に同じ値が付与された配列項があるかどうかを判定し,ある場合は記録に1を加え,ない場合は遍歴を継続する.ここで、隣接するレコードは、横(across)、縦(through)、および斜め(slant_rおよびslant_l)に分けられる.遍歴終了後の3つのいずれかのデータが1以上の場合、判定は成功し、ゲームは終了する.具体的なコードは長すぎますが、分かりやすいです.
//
int across_w = 0,across_b = 0;
int through_w = 0,through_b=0;
int slant_r_w = 0,slant_r_b=0;
int slant_l_w = 0,slant_l_b=0;
for(int i = 0; i<15; i++)
{
for(int j =0; j<15;j++)
{
//
if(1 == arr[i][j])
{
(i>0 && i<15)&&( 1==arr[i][j-1]&&1 == arr[i][j+1]&&1 == arr[i][j+2]&&1 == arr[i][j-2])&& across_w++;
(j>0 && j<15)&&(1==arr[i-1][j]&&1 == arr[i+1][j]&&1 == arr[i+2][j]&&1 == arr[i-2][j]) && through_w++;
(i>0 && i<15 && j>0 && j<15)&&(1 == arr[i-1][j-1]&&1 == arr[i+1][j+1]&&1 == arr[i+2][j+2]&&1 == arr[i-2][j-2]) && slant_r_w++;
(i>0 && i<15 && j>0 && j<15)&&(1 == arr[i-1][j+1]&&1 == arr[i+1][j-1]&&1 == arr[i-2][j+2]&&1 == arr[i+2][j-2]) && slant_l_w++;
}
//
if(2 == arr[i][j])
{
(i>0 && i<15)&&( 2==arr[i][j-1]&&2 == arr[i][j+1]&&2 == arr[i][j+2]&&2 == arr[i][j-2])&& across_b++;
(j>0 && j<15)&&(2==arr[i-1][j]&&2 == arr[i+1][j]&&2 == arr[i+2][j]&&2 == arr[i-2][j]) && through_b++;
(i>0 && i<15 && j>0 && j<15)&&(2 == arr[i-1][j-1]&&2 == arr[i+1][j+1]&&2 == arr[i+2][j+2]&&2 == arr[i-2][j-2]) && slant_r_b++;
(i>0 && i<15 && j>0 && j<15)&&(2 == arr[i-1][j+1]&&2 == arr[i+1][j-1]&&2 == arr[i-2][j+2]&&2 == arr[i+2][j-2]) && slant_l_b++;
}
}
}
printf(" %d%d%d%d %d%d%d%d",across_b,through_b,slant_l_b,slant_r_b,across_w,through_w,slant_r_w,slant_l_w);
if(across_b>=1 || through_b>=1 || slant_r_b>=1 || slant_l_b>1)
{
printf(" ! !
");
//exit_arr();
return 0;
}
if(across_w>=1 || through_w>=1 || slant_r_w>=1 || slant_l_w>=1)
{
printf(" ! !
");
//exit_arr();
return 0;
}
チェッカーの表示とカーソルの移動:
void show_arr(void)
{
system("clear");
for(int i= 0; i<15; i++)
{
printf("-----------------------------------------------------------------------------
");
for(int j= 0; j<15; j++)
{
if(arr[i][j])
{
if(2 == arr[i][j])
{
printf("| B");
}
if(1 == arr[i][j])
{
printf("| W");
}
}
else
{
printf("| ");
}
}
printf("|
");
}
printf("-----------------------------------------------------------------------------
");
for(;;)
{
printf("\33[%d;%dH",(x+1)*2,(y+1)*5);
switch(getch())
{
case 183: x>0 && x--; break;
case 184: x<14 && x++; break;
case 185: y<14 && y++; break;
case 186: y>0 && y--; break;
case 10 : return;
}
}
}
プログラムコード全体:
#include
#include
#include
#include
int x = 7, y = 7;
int step = 1;
int arr[15][15];
//1、
void show_arr(void)
{
system("clear");
for(int i= 0; i<15; i++)
{
printf("-----------------------------------------------------------------------------
");
for(int j= 0; j<15; j++)
{
if(arr[i][j])
{
if(2 == arr[i][j])
{
printf("| B");
}
if(1 == arr[i][j])
{
printf("| W");
}
}
else
{
printf("| ");
}
}
printf("|
");
}
printf("-----------------------------------------------------------------------------
");
for(;;)
{
printf("\33[%d;%dH",(x+1)*2,(y+1)*5);
switch(getch())
{
case 183: x>0 && x--; break;
case 184: x<14 && x++; break;
case 185: y<14 && y++; break;
case 186: y>0 && y--; break;
case 10 : return;
}
}
}
//
void is_WB(void)
{
if(0 != arr[x][y])
{
printf(" !
");
return;
}
// 1
if(0 == step%2)
{
arr[x][y] = 1;
step ++;
}
// 2
else
{
arr[x][y] =2;
step++;
}
}
//
void start_arr(void)
{
FILE* frp = fopen("wuziqi.bin", "r");
if(NULL == frp)
{
printf(" !
");
return ;
}
fread(arr,4,225,frp);
fclose(frp);
}
//
void exit_arr(void)
{
FILE* fwp = fopen("wuziqi.bin","w");
if(NULL == fwp)
{
printf(" !
");
}
fwrite(arr,4,225,fwp);
fclose(fwp);
}
//
int main()
{
//start_arr();
for(;;)
{
show_arr();
is_WB();
//
int across_w = 0,across_b = 0;
int through_w = 0,through_b=0;
int slant_r_w = 0,slant_r_b=0;
int slant_l_w = 0,slant_l_b=0;
for(int i = 0; i<15; i++)
{
for(int j =0; j<15;j++)
{
//
if(1 == arr[i][j])
{
(i>0 && i<15)&&( 1==arr[i][j-1]&&1 == arr[i][j+1]&&1 == arr[i][j+2]&&1 == arr[i][j-2])&& across_w++;
(j>0 && j<15)&&(1==arr[i-1][j]&&1 == arr[i+1][j]&&1 == arr[i+2][j]&&1 == arr[i-2][j]) && through_w++;
(i>0 && i<15 && j>0 && j<15)&&(1 == arr[i-1][j-1]&&1 == arr[i+1][j+1]&&1 == arr[i+2][j+2]&&1 == arr[i-2][j-2]) && slant_r_w++;
(i>0 && i<15 && j>0 && j<15)&&(1 == arr[i-1][j+1]&&1 == arr[i+1][j-1]&&1 == arr[i-2][j+2]&&1 == arr[i+2][j-2]) && slant_l_w++;
}
//
if(2 == arr[i][j])
{
(i>0 && i<15)&&( 2==arr[i][j-1]&&2 == arr[i][j+1]&&2 == arr[i][j+2]&&2 == arr[i][j-2])&& across_b++;
(j>0 && j<15)&&(2==arr[i-1][j]&&2 == arr[i+1][j]&&2 == arr[i+2][j]&&2 == arr[i-2][j]) && through_b++;
(i>0 && i<15 && j>0 && j<15)&&(2 == arr[i-1][j-1]&&2 == arr[i+1][j+1]&&2 == arr[i+2][j+2]&&2 == arr[i-2][j-2]) && slant_r_b++;
(i>0 && i<15 && j>0 && j<15)&&(2 == arr[i-1][j+1]&&2 == arr[i+1][j-1]&&2 == arr[i-2][j+2]&&2 == arr[i+2][j-2]) && slant_l_b++;
}
}
}
printf(" %d%d%d%d %d%d%d%d",across_b,through_b,slant_l_b,slant_r_b,across_w,through_w,slant_r_w,slant_l_w);
if(across_b>=1 || through_b>=1 || slant_r_b>=1 || slant_l_b>1)
{
printf(" ! !
");
//exit_arr();
return 0;
}
if(across_w>=1 || through_w>=1 || slant_r_w>=1 || slant_l_w>=1)
{
printf(" ! !
");
//exit_arr();
return 0;
}
}
exit_arr();
}