【C言語プログラミング】Linux端末でC言語プログラミングで五子棋(コード付)を実現


今日はC言語でLinux環境で五子棋プログラムを記述するコードを共有します.
まず、五子棋を実現し、二つの部分に分けます.
必要なデータ:
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(); }