利用C语言实现“三子棋”游戏

“三子棋”小游戏:由电脑和用户来完成游戏操作,若哪一方首先实现一行列,一竖列,对角线均为自己的棋子则获胜。

一:产生游戏界面,判断是否进入游戏的条件;

二:电脑要能够产生正确的随机数,表示棋子的位置;

三:无论哪一方下完棋要判断下棋结果的输赢;

四:用户可以从键盘输入左边,表示棋子的位置

五:要能够在电脑上显示出棋盘以及下棋的过程;

1:显示一个是否选择玩游戏的界面,选择1:玩游戏,选择0:退出。该条件是是否执行下面游戏代码的条件。

void ShowUI(){
	printf("***********************\n");
	printf("****   1.play    ******\n"); 
	printf("****   0.exit    ******\n"); 
	printf("***********************\n");
}

2:电脑开始下棋:要对随机生成的坐标进行判别,当坐标超出棋盘大小或当前坐标已有棋子均为不合格坐标。

void ComputerMove(char board[][COL], int row, int col){
	while (1){
		int x = rand() % row;
		int y = rand() % col;
		if (board[x][y] == ' '){
			board[x][y] = 'o';
			break;
		}
	}
}

3:判断电脑下棋的结果:每一行列,一竖列,对角线是否为同一元素且不为空。

char Judge(char board[][COL], int row, int col){
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++){
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i]&&\
			board[0][i] != ' '){
			return board[0][i];
		}
	}
	for (i = 0; i < col; i++){
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && \
			board[1][0] != ' '){
			return board[i][0];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && \
		board[0][0] != ' '){
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && \
		board[0][2] != ' '){
		return board[1][1];
	}
	for (i = 0; i < row; i++){
		for (j = 0; j < col; j++){
			if (board[i][j] == ' ')
				return 'N';
		}
	}
	return 'E';
}

4:由用户输入棋子的坐标,开始下棋:对用户输入坐标进行判别是否合格

void PlayerMove(char board[][COL], int row, int col){
	int x, y;
	while (1){
		printf("plese enter your pos(x,y):>\n");
		scanf("%d,%d", &x, &y);
		if (x >= 1 && x <= row&&y >= 1 && y <= col){
			if (board[x - 1][y - 1] = ' '){
				board[x - 1][y - 1] = 'x';
				break;
			}
			else{
				printf("enter pos is not ok,try again\n");
			}
		}
		else{
			printf("Error,try again\n");
		}
	}
}

5:显示棋盘及下棋的过程:利用二维数组完成

void ShowBoard(char board[][COL], int row, int col){
	int i = 1;
	int j = 0;
	printf("    1   2   3\n");
	printf("---------------\n");
	for (i = 0; i <row; i++){
		printf("%d |", i+1);
		for (j = 0; j < col; j++){
			printf(" %c |", board[i][j]);
		}
		printf("\n----------------\n");
	}
}

以上五大功能块完成后,在game()函数中调用该功能块完成游戏功能,输出输赢结果。结果共有三种可能,电脑赢,用户赢,平局。

void Game(){
	char board[ROW][COL];
	memset(board, ' ', sizeof(board));//将board所指向的某一块内存中的每个字节的内容全部设置为‘ ’块的大小由sizeof(board)决定。该函数通常为新申请内存做初始化工作。
	char result = 'N';
	srand((unsigned long)time(NULL));

	while (1){
		system("cls");
		ComputerMove(board, ROW, COL);
		ShowBoard(board, ROW, COL);
		result = Judge(board, ROW, COL);
		if (result != 'N'){
			break;
		}
		PlayerMove(board, ROW, COL);
		ShowBoard(board, ROW, COL);
		result = Judge(board, ROW, COL);
		if (result != 'N'){
			break;
		}
	}
	switch (result){
	case'X':
		printf("You Win!:\n");
		break;
	case'O':
		printf("You Lose,Computer Win!:\n");
		break;
	case'E':
		printf("Dogfall!:\n");
		break;
	default:
		break;
	}
}

1:为了更加清楚的显示下棋过程:调用system("cls");该函数对每次下棋结果清屏,显示最新的结果。

2:电脑产生随机数问题:棋盘的大小为3*3,故生成的坐标要小于等于3。在game()函数中写入srand((unsigned long)time(NULL));每次调用均会产生随机的数字。   将电脑的输入坐标表示为: int x = rand() % row; int y = rand() % col;对行,列求模后可获得合格的坐标。

以下为运行结果:

猜你喜欢

转载自blog.csdn.net/qq_44370562/article/details/89110807