マルチピースチェスの設計を実現するC言語

目次

1. アイデアの共有(ソースコードは最後にあります)

1) まずメニューを印刷する必要があります。私のメニューを参照してください。

2) 次に、選択をするときです。判断を助けるためにスイッチが必要です。また、if も使用できます。

3) ゲームを選択したら、ゲームの詳細を書き始めます。

4) 次のステップは、チェス盤を印刷することです。チェス盤の形式はカスタマイズできます。行、列、勝利時のチェスの駒の数の定義にはマクロ定義を使用することをお勧めします。私のドキュメントを参照してください。

5) 次に、チェスをプレイする人々を実装するための実際のタスクは、配列 (空ではなく、配列内に配置された値) に値を割り当てることです。

6) 次に、コンピューター上でチェスをプレイし、ランダムな値を使用して値を割り当てます (空であり、配列に属している必要があります)。ランダムな値の設定については、私の記事を参照してください。

7) 最後のトラバースは完了を判断するために使用できます。

8) 最後にそれらを接続します

2. ソースコードの表示


1. アイデアの共有(ソースコードは最後にあります)

まずはメイン関数から始めます

1) まずメニューを印刷する必要があります。私のメニューを参照してください。

void menu() {
	printf("******************\n");
	printf("***** 1.开始 *****\n");
	printf("***** 0.退出 *****\n");
	printf("******************\n");
}

複数のラウンドをプレイする必要がある場合があるため、ループに含める必要があります。

2) 次に、選択をするときです。判断を助けるためにスイッチが必要です。また、if も使用できます。

int choose;
	do {
		menu();
		scanf("%d", &choose);
		switch (choose) {
		case 0:
			printf("正在退出\n");
			break;
		case 1:game();
			break;
		default:
			printf("没有这个输入选项,请重新输入\n");
		}
	} while (choose);

3) ゲームを選択したら、ゲームの詳細を書き始めます。

ゲームにはまずチェス盤とチェスの駒が必要です。チェスの駒の代わりに 2 次元配列を使用することをお勧めします。最初に空白スペースを埋めます。次に、関数の初期化関数が必要です。初期化関数にはネストされたループのみが必要です。パラメータには配列と配列サイズが必要です。

void init(char arr[Row][Col], int row, int col) {
	int i, j;
	for (i = 0; i < row; i++)
		for (j = 0; j < col; j++)
			arr[i][j] = ' ';
}

4) 次のステップは、チェス盤を印刷することです。チェス盤の形式はカスタマイズできます。行、列、勝利時のチェスの駒の数の定義にはマクロ定義を使用することをお勧めします。私のドキュメントを参照してください。

#define Row 10//改变棋盘行数
#define Col 10//改变棋盘列数
#define Times 5//改变胜利棋子数
void menu1(char arr[Row][Col], int row, int col) {
	int i, j;
	for (j = 0; j < row; j++) {
		for (i = 0; i < col; i++) {
			printf(" %c ", arr[j][i]);
			if (i < row - 1)
				printf("|");
		}
		printf("\n");
		if(j<row-1)
			for (i = 0; i < col; i++) {
				printf("---");
				if (i < col - 1)
					printf("|");
			}
		printf("\n");
	}
}

効果は以下の通りです

5) 次に、チェスをプレイする人々を実装するための実際のタスクは、配列 (空ではなく、配列内に配置された値) に値を割り当てることです。

void playmove(char arr[Row][Col], int row, int col) {
	int x, y;
	while (1) {
		printf("玩家下棋->");
		scanf("%d%d", &x, &y);
		printf("\n");
		if (x < row + 1 && y < col + 1 && arr[x-1][y-1] == ' ') {
			arr[x-1][y-1] = '*';
			break;
		}
		else printf("输入错误或者输入的位置已经被下过,请重新下棋\n");
	}
}

6) 次に、コンピューター上でチェスをプレイし、ランダムな値を使用して値を割り当てます (空であり、配列に属している必要があります)。ランダムな値の設定については、私の記事を参照してください。

void computermove(char arr[Row][Col], int row, int col) {
	while (1) {
		int x = rand() % row;
		int y = rand() % col;
		if (arr[x][y] == ' ') {
			arr[x][y] = '#';
			break;
		}
	}
}

コンピュータと人間の両方がチェスのすべての動きに勝つ可能性があるため、チェスをプレイするたびにチェス盤を判断して印刷する必要があります。

判定コード:盤面がいっぱいの場合、Q(引き分け)、C(コンティニュー)、*(人間の勝利)、#(コンピュータの勝利)を返す

誰かが勝つかどうかを判断するために、6つの部分に分けました。

最初の部分では、各行に十分な同一文字があるかどうかを判断します。

for (i = 0; i < row; i++) {
		for (j = 0, flag = 0; j < col; j++) {
			if (arr[i][j] == arr[i][count]&&arr[i][count]!=' ')
				flag++;
			else {
				flag = 0;
				count = j;
			}
			if (flag == times)return arr[i][j];
		}

 2 番目の部分では各列をチェックします

for (i = 0; i < col; i++) {
			for (j = 0, flag = 0; j < row; j++) {
				if (arr[j][i] == arr[count][j] && arr[j][i] != ' ')
					flag++;
				else {
					flag = 0;
					count = j;
				}
				if (flag == times)return arr[i][j];
			}
		}

パート 3

for (i=0; i < row; i++) {
		flag = 0;
		j = 0;
		count = 0;
		count1 = i;
		k = i;
		while (k < row && j < col) {
			if (arr[k][j] == arr[count1][count]&& arr[count1][count]!=' ')
				flag++;
			else {
				flag = 0;
				count = j;
				count1 = k;
			}
			if (flag == times)return arr[count1][count];
			k++;
			j++;
		}
	}

パート 4

for (i = 0; i < row; i++) {
		flag = 0;
		j = 0;
		count = col-1;
		count1 = i;
		k = i;
		while (k < row && j < col) {
			if (arr[k][j] == arr[count1][count]&&arr[k][j]!=' ')
				flag++;
			else {
				flag = 0;
				count = j;
				count1 = k;
			}
			if (flag == times)return arr[count1][count];
			k++;
			j--;
		}
	}

 パート 5

for (i = 0, j = col - 1; j > 0; j--) {
		flag = 0;
		i = 0;
		count = j;
		count1 = 0;
		k = j;
		while (k < col && i<row) {
			if (arr[i][k] == arr[count1][count]&& arr[count1][count]!=' ')
				flag++;
			else {
				flag = 0;
				count = k;
				count1 = i;
			}
			if (flag == times)return arr[count1][count];
			k--;
			i++;
		}
	}

第 6 部

for (i = 0,j=0; j < col; j++) {
		flag = 0;
		i = 0;
		count = j;
		count1 = i;
		k = j;
		while (i < row && k < col) {
			if (arr[i][k] == arr[count1][count]&&arr[i][k]!=' ')
				flag++;
			else {
				flag = 0;
				count = k;
				count1 = i;
			}
			if (flag == times)return arr[count1][count];
			k++;
			i++;
		}
	}

7) 最後のトラバースは完了を判断するために使用できます。

for (i = 0; i < row; i++)
		for (j = 0; j < col; j++)
			if (arr[i][j] != ' ')count++;
			else break;
	if (count == row * col)return 'Q';
	else return 'C';

8) 最後にそれらを接続します

void game() {
	char c='C';
	int result = 1;
	char arr[Row][Col];
	init(arr, Row, Col);
	menu1(arr, Row, Col);
	while (c=='C') {
		playmove(arr, Row, Col);
		menu1(arr, Row, Col);
		c = iswin(arr, Row, Col, Times);
		if (c != 'C')break;
		computermove(arr, Row, Col);
		menu1(arr, Row, Col,Times);
		c = iswin(arr, Row, Col, Times);
	}
	if (c == '*')printf("玩家胜利\n");
	else if (c == '#')printf("电脑胜利\n");
	else printf("平局\n");
}

2. ソースコードの表示

#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#define Row 10//改变棋盘行数
#define Col 10//改变棋盘列数
#define Times 5//改变胜利棋子数
void menu();
void game();
void init(char arr[Row][Col], int row, int col);
void menu1(char arr[Row][Col], int row, int col);
void playmove(char arr[Row][Col], int row, int col);
void computermove(char arr[Row][Col], int row, int col);
char iswin(char arr[Row][Col], int row, int col,int times);
int main() {
	srand((unsigned int)time(NULL));
	int choose;
	do {
		menu();
		scanf("%d", &choose);
		switch (choose) {
		case 0:
			printf("正在退出\n");
			break;
		case 1:game();
			break;
		default:
			printf("没有这个输入选项,请重新输入\n");
		}
	} while (choose);
	return 0;
}
void menu() {
	printf("******************\n");
	printf("***** 1.开始 *****\n");
	printf("***** 0.退出 *****\n");
	printf("******************\n");
}
void game() {
	char c='C';
	int result = 1;
	char arr[Row][Col];
	init(arr, Row, Col);
	menu1(arr, Row, Col);
	while (c=='C') {
		playmove(arr, Row, Col);
		menu1(arr, Row, Col);
		c = iswin(arr, Row, Col, Times);
		if (c != 'C')break;
		computermove(arr, Row, Col);
		menu1(arr, Row, Col,Times);
		c = iswin(arr, Row, Col, Times);
	}
	if (c == '*')printf("玩家胜利\n");
	else if (c == '#')printf("电脑胜利\n");
	else printf("平局\n");
}
void init(char arr[Row][Col], int row, int col) {
	int i, j;
	for (i = 0; i < row; i++)
		for (j = 0; j < col; j++)
			arr[i][j] = ' ';
}
void menu1(char arr[Row][Col], int row, int col) {
	int i, j;
	for (j = 0; j < row; j++) {
		for (i = 0; i < col; i++) {
			printf(" %c ", arr[j][i]);
			if (i < row - 1)
				printf("|");
		}
		printf("\n");
		if(j<row-1)
			for (i = 0; i < col; i++) {
				printf("---");
				if (i < col - 1)
					printf("|");
			}
		printf("\n");
	}
}
void playmove(char arr[Row][Col], int row, int col) {
	int x, y;
	while (1) {
		printf("玩家下棋->");
		scanf("%d%d", &x, &y);
		printf("\n");
		if (x < row + 1 && y < col + 1 && arr[x-1][y-1] == ' ') {
			arr[x-1][y-1] = '*';
			break;
		}
		else printf("输入错误或者输入的位置已经被下过,请重新下棋\n");
	}
}
void computermove(char arr[Row][Col], int row, int col) {
	while (1) {
		int x = rand() % row;
		int y = rand() % col;
		if (arr[x][y] == ' ') {
			arr[x][y] = '#';
			break;
		}
	}
}
char iswin(char arr[Row][Col], int row, int col, int times) {
	int i, flag = 0, j, count = 0, k, count1;
	for (i = 0; i < row; i++) {
		for (j = 0, flag = 0; j < col; j++) {
			if (arr[i][j] == arr[i][count]&&arr[i][count]!=' ')
				flag++;
			else {
				flag = 0;
				count = j;
			}
			if (flag == times)return arr[i][j];
		}
		count = 0;
		for (i = 0; i < col; i++) {
			for (j = 0, flag = 0; j < row; j++) {
				if (arr[j][i] == arr[count][j] && arr[j][i] != ' ')
					flag++;
				else {
					flag = 0;
					count = j;
				}
				if (flag == times)return arr[i][j];
			}
		}
	}
	for (i=0; i < row; i++) {
		flag = 0;
		j = 0;
		count = 0;
		count1 = i;
		k = i;
		while (k < row && j < col) {
			if (arr[k][j] == arr[count1][count]&& arr[count1][count]!=' ')
				flag++;
			else {
				flag = 0;
				count = j;
				count1 = k;
			}
			if (flag == times)return arr[count1][count];
			k++;
			j++;
		}
	}
	for (i = 0; i < row; i++) {
		flag = 0;
		j = 0;
		count = col-1;
		count1 = i;
		k = i;
		while (k < row && j < col) {
			if (arr[k][j] == arr[count1][count]&&arr[k][j]!=' ')
				flag++;
			else {
				flag = 0;
				count = j;
				count1 = k;
			}
			if (flag == times)return arr[count1][count];
			k++;
			j--;
		}
	}
	for (i = 0, j = col - 1; j > 0; j--) {
		flag = 0;
		i = 0;
		count = j;
		count1 = 0;
		k = j;
		while (k < col && i<row) {
			if (arr[i][k] == arr[count1][count]&& arr[count1][count]!=' ')
				flag++;
			else {
				flag = 0;
				count = k;
				count1 = i;
			}
			if (flag == times)return arr[count1][count];
			k--;
			i++;
		}
	}
	for (i = 0,j=0; j < col; j++) {
		flag = 0;
		i = 0;
		count = j;
		count1 = i;
		k = j;
		while (i < row && k < col) {
			if (arr[i][k] == arr[count1][count]&&arr[i][k]!=' ')
				flag++;
			else {
				flag = 0;
				count = k;
				count1 = i;
			}
			if (flag == times)return arr[count1][count];
			k++;
			i++;
		}
	}
	count = 0;
	for (i = 0; i < row; i++)
		for (j = 0; j < col; j++)
			if (arr[i][j] != ' ')count++;
			else break;
	if (count == row * col)return 'Q';
	else return 'C';
}

ようやくこれで終わりです。

閲覧していただきありがとうございます、「いいね」や収集を歓迎します

おすすめ

転載: blog.csdn.net/m0_74316391/article/details/130546292