C语言入门---仿五子棋游戏

仿五子棋游戏

#define _CRT_SECURE_NO_WARNINGS
#define ROW 15
#define COL 15
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
//1.定义二维数组表示棋盘

char g_chess_board[ROW][COL];
int input_row = -1;
int input_col = -1;
void Init(){
	
	for (int row = 0; row < ROW; row++){
		for (int col = 0; col < COL; col++){
			g_chess_board[row][col] = ' ';
		}
	}

	//2.对棋盘初始化


}
//3.打印棋盘
void print(){
	int row = 0;
	for (int row = 0; row < ROW; row++){

		printf("   %2d", row);
	}
	printf("\n");


	for (int row = 0; row < ROW; row++){

		for (int i = 0; i < ROW; i++){
			if (i == 0){
				printf("  |----");

			}
			else{

				printf("|----");
			}

		}
		printf("\n");
		for (int col = 0; col < COL; col++){
			if (col != COL - 1){
				if (col == 0){
					printf("%2d| %c  ", row, g_chess_board[row][col]);

				}
				else{

					printf("| %c  ", g_chess_board[row][col]);
				}
			}
			else{
				printf("| %c  |\n", g_chess_board[row][col]);

			}

		}




	}
	

		for (int i = 0; i < ROW; i++){
			if (i == 0){
				printf("  |----");

			}
			else{

				printf("|----");
			}		
	}
		printf("\n");
}

int IsFull(){
	//满了返回1 没满返回0
	for (int row = 0; row < ROW; row++){
		for (int col = 0; col < COL; col++){
			if (g_chess_board[row][col] == ' ')
				return 0;


		}
		return 1;

	}
}


void PlayerMove(){
	//4.玩家落子,检查游戏是否结束
	// a提示玩家落子
	//  b检验玩家输入
	//  c若玩家输入不合法提示玩家重新输入
	//  d.若合法 赋值
	
	while (1){
		printf("请玩家落子(输入棋盘数字坐标row col)\n");
		scanf("%d%d", &input_row, &input_col);
		if (input_col > COL || input_col<0 || input_row>ROW || input_row < 0){

			printf("输入棋盘范围错误,请重输~~\n");
			continue;
		}
		else if (g_chess_board[input_row][input_col] != ' '){
		
			printf("当前棋格有子,请重下!\n");
			continue;
		}
		else if (g_chess_board[input_row][input_col] == ' '){
				g_chess_board[input_row][input_col] = 'x';
				
			break;
		}
	}
}
void ComputerMove_upgrade_dia(int row, int col){

	while (1){
		
			if (g_chess_board[++row][++col] == ' '){

				g_chess_board[row][col] = 'o';
				break;
			}
		}
}
void ComputerMove_upgrade_right(int row, int col){
	while (1){

		if (g_chess_board[++row][col] == ' '){

			g_chess_board[row][col] = 'o';
			break;
		}
		else{
			if (g_chess_board[row][++col] == ' '){

				g_chess_board[row][col] = 'o';
				break;
			}
		}
	}
}
void ComputerMove_upgrade_left(int row, int col){
	while (1){

		if (g_chess_board[row][--col] == ' '){

			g_chess_board[row][col] = 'o';
			break;
		}
		else{
			if (g_chess_board[--row][col] == ' '){

				g_chess_board[row][col] = 'o';
				break;
			}
		}
	}

}

void ComputerMove_upgrade(int row, int col){
	if (row == col){
	ComputerMove_upgrade_dia( row, col);

	}
	else if (row < col){

	ComputerMove_upgrade_right(row, col);
	}
	else if (row>col){

	ComputerMove_upgrade_left(row, col);
	}

	}
void ComouterMove(){
	//5.电脑落子,检查游戏是否结束
	while (1){

		int input_row = rand() % ROW;
		int input_col = rand() % COL;

		if (g_chess_board[input_row][input_col] == ' '){

			g_chess_board[input_row][input_col] = 'o';
			break;
		}

	}

}
char CheckWinner(){
	   
	   
	//检查列是否有连子
	for (int row = 0; row < ROW; row++){
		for (int col = 0; col < COL; col++){

			if (g_chess_board[row][col] == g_chess_board[row][col + 1]
				&& g_chess_board[row][col] == g_chess_board[row][col + 2]
				&& g_chess_board[row][col] == g_chess_board[row][col - 1]
				&& g_chess_board[row][col] == g_chess_board[row][col - 2]
				&& g_chess_board[row][col] != ' ')
				return g_chess_board[row][col];

		}
	}

	for (int row = 0; row < ROW; row++){
		for (int col = 0; col < COL; col++){
			if (g_chess_board[row][col] == g_chess_board[row + 1][col]
				&& g_chess_board[row][col] == g_chess_board[row + 2][col]
				&& g_chess_board[row][col] == g_chess_board[row - 1][col]
				&& g_chess_board[row][col] == g_chess_board[row - 2][col]
				&& g_chess_board[row][col] != ' ')
				return g_chess_board[row][col];
		}
	}
	

	
//检查k=-1/2时 是否有连子
	
	for (int row = 0; row < ROW; row++){
		for (int col = 0; col < COL; col++){
			if (g_chess_board[row][col] == g_chess_board[row - 1][col - 1]
				&& g_chess_board[row][col] == g_chess_board[row - 2][col - 2]
				&& g_chess_board[row][col] == g_chess_board[row + 1][col + 1]
				&& g_chess_board[row][col] == g_chess_board[row + 2][col + 2]
				&& g_chess_board[row][col] != ' ')
				return g_chess_board[row][col];
		}
	}
	//检查k=1/2时 是否有连子
	for (int row = 0; row < ROW; row++){
		for (int col = 0; col < COL; col++){
			if (g_chess_board[row][col] == g_chess_board[row - 1][col + 1]
				&& g_chess_board[row][col] == g_chess_board[row - 2][col + 2]
				&& g_chess_board[row][col] == g_chess_board[row + 1][col - 1]
				&& g_chess_board[row][col] == g_chess_board[row + 2][col - 2]
				&& g_chess_board[row][col] != ' ')
				return g_chess_board[row][col];
		}
	}

	if (IsFull()){
		return 'q';
	}
	else
		return ' ';
	//1.返回x表示玩家胜利
	//2.返回o表示电脑胜利
	//3.返回q表示和棋
	//4.返回‘ ‘表示游戏继续
}
int main(){
	char winner = ' ';


	Init();
	while (1){
		print();

		PlayerMove();
		winner = CheckWinner();
		if (winner != ' '){
			break;
		}
		ComputerMove_upgrade(input_row, input_col);
		//ComouterMove();
		winner = CheckWinner();
		if (winner != ' '){
			break;
		}

	}


	if (winner == 'x'){
		print();
		printf("玩家胜利!\n");
	}
	else if (winner == 'o'){

		printf("电脑胜利!\n");
	}
	else if (winner == 'q'){
		printf("和棋\n");
	}

	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42962924/article/details/83274417
今日推荐