1. 程式人生 > >用C語言實現簡單的三子棋

用C語言實現簡單的三子棋

思路整理: 1.初始化一個二維陣列 2.列印選單並提示玩家進行選擇,獲取玩家的選擇,確定是否開始遊戲 3. 列印棋盤 4. 提示玩家輸入子想要落子的座標,對玩家的輸入進行判斷: <1>(判斷輸入是否合法以及此位置是否為空)並作出相應提示 <2> 玩家落子 <3> 判斷輸贏 5.電腦落子(為保證落子的隨機性,獲取當前時間作為隨機種子) <1> 判斷當前位置是否為空 <2> 電腦落子 <3> 判斷輸贏 6.如果輸贏未定,則回到第三步

感想: 寫程式碼前最重要的是要理清楚思路,寫好註釋,一定要把各個方面都儘可能考慮清楚,寫一部分除錯一部分,發現問題及時修改

原始碼:

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

#define ROW 3
#define COL 3

 Menu(){
	printf(".......1.遊戲開始.......\n");
	printf(".......2.結束遊戲.......\n");
	printf("請輸入你的選擇:");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}

char Map[ROW][COL];
void Init(){
	int i = 0;
	int j = 0;
	for (i = 0; i < ROW; ++i){
		for (j = 0; j < COL; ++j){
			Map[i][j] = ' ';
		}
	}
}

void print(){
	//列印棋盤
	for (int row = 0; row < ROW; ++row){
		printf("| %c  | %c  | %c  |\n", Map[row][0], Map[row][1], Map[row][2]);
		if (row != 2){
			printf("|----|----|----|\n");
		}
	}
}

void PlayerStep(){
	//提示玩家落子
	while (1){
		printf("請您輸入想要落子的座標ROW COL:");
		int row = -1;
		int col = -1;
		scanf("%d %d", &row, &col);
		if (row < 0 || row >= ROW || col < 0 || col >= COL){
			printf("輸入座標非法,請重新輸入座標!\n");
			continue;
		}
		if (Map[row][col] != ' '){
			printf("此處已有棋子,請重新輸入座標!\n");
			continue;
		}
			Map[row][col] = 'o';
			break;
	}
}

void ComputerStep(){
	printf("電腦落子\n");
	srand((unsigned int)time(NULL));
	int row = 0;
	int col = 0;
	while (1){
		row = rand() % 3 ;
		col = rand() % 3 ;
		if (Map[row][col] = ' '){
			Map[row][col] = 'x';
			break;
		}
	}
}

//用‘o’表示玩家 用‘x’表示電腦
//使用IsWin函式,返回‘o’表示玩家勝利 
//               返回‘x’表示電腦勝利
//               返回‘q’表示和棋
//               返回‘ ’表示勝負未分
int IsFull(){
	for (int row = 0; row < ROW; ++row){
		for (int col = 0; row < COL; ++col){
			if (Map[row][col] == ' ')
				return 0;
		}
	}
	return 1;
}

char IsWin(){
	//檢查遊戲是否結束
	//是否有三個子相連的情況出現
	//1.檢查橫行
	int row = 0;
	for (row = 0; row < ROW; ++row){
		if (Map[row][0] == Map[row][1]
			&& Map[row][0] == Map[row][2]
			&& Map[row][0] != ' '){
			return Map[row][0];
		}
	}

		//2.檢查豎行
		int col = 0;
		for (col = 0; col < COL; ++col){
			if (Map[0][col] == Map[1][col]
				&& Map[0][col] == Map[2][col]
				&& Map[0][col] != ' '){
				return Map[0][col];
			}
		}

		//3.檢查斜行 
		if (Map[0][0] == Map[1][1]
			&& Map[0][0] == Map[2][2]
			&& Map[0][0] != ' '){
			return Map[0][0];
		}
		else if (Map[0][3] == Map[1][1]
			&& Map[0][3] == Map[2][0]
			&& Map[0][3] != ' '){
			return Map[0][3];
		}
		//檢查是否和棋
		if (IsFull()){
			return 'q';
		}
		return' ';
	}

int main(){
		char winner = ' ';
		Init();
		printf("\n");
		int choice = Menu();
		if (choice == 2){
			printf("您已經退出遊戲啦!\n");
		}
		while (choice==1){
			//先列印棋盤
			print();
			//4.提示玩家落子,並檢查遊戲是否結束
			PlayerStep();
			winner = IsWin();
			if (winner != ' '){
				break;
			}
			//5.電腦落子,檢查是否結束
			ComputerStep();
			winner = IsWin();
			if (winner != ' '){
				break;
			}
		}
		if (winner == 'o'){
			printf("恭喜您,勝利啦!\n");
		}
		else if (winner == 'x'){
			printf("電腦勝利!\n");
		}
		else if (winner == 'q'){
			printf("和棋!\n");
		}
		system("pause");
		return 0;
	}

執行結果: 在這裡插入圖片描述