1. 程式人生 > >NO.21————三子棋遊戲

NO.21————三子棋遊戲

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ROW 3
#define COL 3

// 三子棋遊戲
// 1、列印棋盤(藉助二維陣列)
// 2、玩家落子(輸入座標)
// 3、判斷勝負情況
// 4、電腦落子(使用隨機數產生座標)
// 5、判斷勝負情況
// a、玩家獲勝
// b、電腦獲勝
// c、和棋
// d、遊戲未結束

char chess_borad[ROW][COL];     //	定義全域性變數

//選單函式

void menu()
{
printf("********************************************\n");
printf("歡迎您進入三子棋遊!\n");
printf("1、玩家先手\n");
printf("2、電腦先手\n");
printf("********************************************\n");
}

// 初始化

void init()
{
int row;
int col;
for (row = 0; row < ROW; row++)
{
	for (col = 0; col < COL; col++)
	{
		chess_borad[row][col] = ' ';

	}
}
}

// 列印棋盤

void	print_borad( )
{
	int row;
	int col=0;


	for (row = 0; row < ROW; row++)
	{
		for (col = 0; col < COL; col++)
		{
			printf("| %c", chess_borad[row][col]);

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

// 玩家落子

void player_move()
{
	int row;
	int col;
	printf("該您落子了,請輸入一個座標:");
	while (1)
	{
		scanf("%d %d", &row, &col);

		if (row < 0 || row >= ROW || col < 0 || col >= COL || chess_borad[row][col] != ' ')           //判斷玩家輸入座標是否合法
		{
			printf("輸入有誤,請重新輸入:");
			continue;
		}

		chess_borad[row][col] = 'X';
		print_borad(chess_borad[row][col]);      //		列印棋盤
		break;

	}

}

// 電腦落子

void computer_move()
{
	int row;
	int col;
	
	while (1)
	{

		row = rand() % ROW;
		col = rand() % COL;
		if (chess_borad[row][col] != ' ')
		{
			continue;
		}

		chess_borad[row][col] = 'O';
		printf("電腦已落子!\n");
		print_borad(chess_borad[row][col]);      //		列印棋盤
		break;

	}

}

// 判斷棋盤是否滿了

int  Isfull()
{
	int count = 0;
	for (int row = 0; row < ROW; row++)
	{
		for (int col = 0; col < COL;col++)
		if (chess_borad[row][col] != ' ')

			count++;

	}
	if (count == 9)
		return 2;

	return 0;
}

// 判斷勝負

int  judge_winner()
{
	int row;
	int col;
	
	//	先判斷行
	for (row = 0; row < ROW; row++)
	{

		if (chess_borad[row][0] == chess_borad[row][1] &&
			chess_borad[row][0] == chess_borad[row][2] &&
			chess_borad[row][0] != ' ')
			return 1;
	}

	//	判斷列
	for (col = 0; col < COL; col++)
	{
		if (chess_borad[0][col] == chess_borad[1][col] &&
			chess_borad[0][col] == chess_borad[2][col] &&
			chess_borad[0][col] != ' ')
			return 1;
	}
	//	判斷對角線
	if (chess_borad[0][0] == chess_borad[1][1] &&
		chess_borad[0][0] == chess_borad[2][2] &&
		chess_borad[0][0] != ' ')
		return 1;

	if (chess_borad[0][2] == chess_borad[1][1] &&
		chess_borad[0][2] == chess_borad[2][0] &&
		chess_borad[0][2] != ' ')
		return 1;
	
	return 0;
}

// 程式碼主體

int main()
{
	int row = 0;
	int col = 0;
	int choice;
	int  winner = '\0';
	menu();												  //		呼叫menu函式,選擇玩家先手還是電腦先手
	
	
	init();
	print_borad(chess_borad[row][col]);      //		列印棋盤
	printf("請選擇你先手還是電腦先手:");
	flag:
	scanf("%d", &choice);
	srand((unsigned)time(0));           //	設定隨機種子保證電腦每次落子是隨機的
	while (1)
	{
		
		
	
		if (choice == 1)
		{
			

			player_move( );                                      //	玩家落子
			
			winner = judge_winner();                                    //	判斷勝負

			if (winner ==1)
			{
				printf("你贏了!\n");
				print_borad(chess_borad[row][col]);
				break;
			}

			winner = Isfull();
			if (winner == 2)
			{
				printf("和棋,遊戲結束!\n");
				print_borad(chess_borad[row][col]);
				break;
			}

			system("cls");

			computer_move();                                //  電腦落子

			winner = judge_winner();
			if (winner ==1)
			{
			
				printf("你輸了!\n");
				print_borad(chess_borad[row][col]);
				
				break;

			}
			
		}


		else if (choice == 2)
		{
			computer_move();                                      //	電腦落子

			winner = judge_winner();                                    //	判斷勝負 

			if (winner == 1)
			{
				printf("你輸了!\n");
				print_borad(chess_borad[row][col]);
				break;
			}

			winner = Isfull();
			if (winner == 2)
			{
				printf("和棋,遊戲結束!\n");
				print_borad(chess_borad[row][col]);
				break;
			}


			player_move();                                //  玩家落子

			winner = judge_winner();
			if (winner == 1)
			{

				printf("你贏了!\n");
				print_borad(chess_borad[row][col]);

				break;
			}
			system("cls");

		}
		else if(choice !=1 &&choice!=2)
		{
			printf("輸入有誤,請重新輸入:");
			goto flag;
			break;
		
		}

	}


	system("pause");
	return 0;

}

執行結果:
1、和棋
在這裡插入圖片描述

2、玩家贏
在這裡插入圖片描述

3、電腦贏
在這裡插入圖片描述