用C語言實現簡單的三子棋
阿新 • • 發佈:2018-12-17
思路整理: 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; }
執行結果: