三子棋(可修改成五子棋)

C語言寫的三子棋,可用VS2013編譯通過,學習C語言半年時間,第一次寫一個小遊戲項目,中間bug調試了一兩個小時,一度想要放棄,最後發現問題,成功寫出來,嘿嘿嘿。
```c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>				//玩家1 操作遊戲的人 落子:‘x’
#include <stdlib.h>				//玩家2 電腦         落子:‘O’
#include <time.h>
#define MAX_ROW 3				//Magic number
#define MAX_COL 3
void Init(char chessBoard[MAX_ROW][MAX_COL]){ 
	int row, col;
	for (row = 0; row < MAX_ROW; row++){
		for (col = 0; col < MAX_COL; col++){
			chessBoard[row][col] = ' ';
		}
	}
	srand((unsigned int)time(0));
}
void Print(char chessBoard[MAX_ROW][MAX_COL]){
	printf("+---+---+---+\n");
	int row, col;
	for (row = 0; row < MAX_ROW; row++){
		for (col = 0; col < MAX_COL; col++){
			printf("| %c ",chessBoard[row][col]); //%c代表打印一個字符
		}
		printf("|");
		printf("\n+---+---+---+\n");
	}
}
void PlayerMove(char chessBoard[MAX_ROW][MAX_COL]){
	printf("玩家落子!\n");
	while (1){
		printf("請輸入您要落子的位置:");
		int row = 0;
		int col = 0;
		scanf("%d %d", &row, &col);
		if (row < 0 || col < 0 
			|| row >= MAX_ROW 
			|| col >= MAX_COL)
		{
			printf("輸入不合法,請輸入小於3的值!\n");
			continue;
		}
		if (chessBoard[row][col] != ' '){
			printf("該位置已有子!\n");
			continue;
		}
		chessBoard[row][col] = 'X';
		break;
	}
}
void ComputerMove(char chessBoard[MAX_ROW][MAX_COL]){
	printf("電腦落子!\n");
	while (1){
		int row = rand() % MAX_ROW;			//產生隨機數
		int col = rand() % MAX_COL;
		if (chessBoard[row][col] != ' ') //此處有子
			continue;
		chessBoard[row][col] = 'O';
		break;
	}
}
int Isfull(char chessBoard[MAX_ROW][MAX_COL]){
	for (int row = 0; row < MAX_ROW; row++){
		for (int col = 0; col < MAX_COL; col++){
			if (chessBoard[row][col] == ' '){
				return 0;
			}
		}
	}
	return 1;
}
char Check(char chessBoard[MAX_ROW][MAX_COL])
{		//判斷遊戲是否結束,若結束返回哪一方贏了
	int row, col;
	//1.檢查3行
	for (row = 0; row < MAX_ROW; row++){
		if (chessBoard[row][0] != ' '
			&& chessBoard[row][0] == chessBoard[row][1]
			&& chessBoard[row][0] == chessBoard[row][2])
			return chessBoard[row][0];
	}
		//2.檢查3列
	for (col = 0; col < MAX_COL; col++){
		if (chessBoard[0][col] != ' '
			&& chessBoard[0][col] == chessBoard[1][col]
			&& chessBoard[0][col] == chessBoard[2][col])
			return chessBoard[0][col];
	}
			//3.檢查兩個對角線
			if (chessBoard[0][0] != ' '				//右對角線
				&& chessBoard[0][0] == chessBoard[1] [1]
				&& chessBoard[0][0] == chessBoard[2][2])
				return chessBoard[0][0];
			if (chessBoard[0][2] != ' '				//左對角線
				&& chessBoard[0][2] == chessBoard[1][1]
				&& chessBoard[0][2] == chessBoard[2][0])
				return chessBoard[0][2];
			if (Isfull(chessBoard)){
				return 'Q';
			}
				return ' ';
}
void Game()
{
	char chessBoard[MAX_ROW][MAX_COL]; //二維數組表示棋盤
	Init(chessBoard);
	char winner = ' ';
	while (1)		//7.循環2-6
	{               
		//2.打印棋盤(第一次打印的是空白棋盤)
		Print(chessBoard);
		//3.玩家落子(通過輸入座標的方式確定位置)
		PlayerMove(chessBoard);
		//4.判斷一下游戲是否結束
		winner = Check(chessBoard);
		if (winner != ' ')
			break;
		//5.電腦落子(瞎落子)
		ComputerMove(chessBoard);
		//6.判斷一下游戲是否結束
		winner = Check(chessBoard);
		if (winner != ' ')
			break;
	}
	Print(chessBoard);
			if (winner == 'O')
			{
				printf("太菜了,電腦都下不過!\n");
			}else if (winner == 'X')
			{
				printf("恭喜你獲勝!\n");
			}else{
				printf("太菜了,和電腦五五開\n");
			}
}
int Menu()
{						//交互界面
	printf("==============================================\n");
	printf("歡迎來到三子棋遊戲!\n");
	printf("1.開始遊戲\n");
	printf("0.退出遊戲\n");
	printf("==============================================\n");
	printf("請輸入您的選擇:");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}
int main()
{
	while (1)
	{
		int choice = Menu();
		if (choice == 1){
			Game();
		}else if (choice == 0){
			printf("goodbye!\n");
			break;
		}else{
			printf("您的輸入有誤!\n");
		}
	}
	system("pause");
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章