1. 程式人生 > >C語言入門---仿五子棋遊戲

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;
}