初夏小談:小專案 五子棋
阿新 • • 發佈:2018-11-25
此次五子棋小專案,呼叫大量函式,函式相對於上次模擬王者榮耀—榮耀水晶小程式更進一步為程式的獨立性,相互呼叫,進行較多傳參,在判斷勝負中遇到判斷問題,導致頻頻出錯,在於陣列下標極易混淆,受前三次判斷條件的影響。程式碼如下:
#ifndef __GAME_H__ #define __GAME_H__ #include<Aventador_SQ.h> #define ROW 10 #define COL 10//10*10的方格 #define ROWS 5 #define COLS 5//五子棋 void Display(char arr[ROW][COL], int row, int col);//列印棋盤 void InitBoard(char arr[ROW][COL], int row, int col);//初始化棋盤 void ComputerMove(char arr[ROW][COL]); void PlayerMove(char arr[ROW][COL], int row, int col);//玩家走 char IsWin(char arr[ROW][COL], int row, int col);//判斷輸贏 #endif
#include "game.h" void InitBoard(char arr[ROW][COL], int row, int col) { memset(arr, ' ', col*row * sizeof(arr[0][0])); //int i = 0; //int j = 0; //for (i = 0; i < row; i++) { // for (j = 0; j < col; j++) // { // arr[i][j]=' '; // } //} } void Display(char arr[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { if (i == 0) { for (j = 0; j < COL; j++) { printf("----"); } printf("-\n"); } if ((i >= 0) && (i < row )) { for (j = 0; j < COL; j++) { printf("| %c ",arr[i][j]); } printf("|%2d\n",i+1); for (j = 0; j < COL; j++) { printf("----"); } printf("-\n"); } //for (j = 0; j < row; j++) //{ // printf(" %d ", j + 1); //} } for (j = 0; j < row; j++) { printf(" %2d ", j + 1); } printf("\n"); } void ComputerMove(char arr[ROW][COL]) { int x = 0; int y = 0; while (1) { x = rand() % ROW; y = rand() % COL; if (arr[x][y] == ' ') { arr[x][y] = '0'; break; } } } void PlayerMove(char arr[ROW][COL], int row, int col) { int x = 0; int y = 0; while (1) { printf("請輸入座標:"); scanf("%d%d", &x, &y); x--; y--; if ((x >= 0) && (x <= ROW-1) && (y >= 0) && (y <= COL-1)) { if (arr[x][y] == ' ') { arr[x][y] = '*'; break; } else { printf("座標有誤!!!\n"); } } else { printf("座標有誤!!!\n"); } } } int IsFull(char arr[ROW][COL], int row, int col) { int i = 0, j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (arr[i][j] == ' ') return 0; break; } } return 1; } char IsWin(char arr[ROW][COL], int row, int col) { int i = 0, j = 0; //棋子橫排能贏得可能 for (i = 0; i < row; i++) { for (j = 0; j <= col - 5; j++)//5是五子棋 { if ((arr[i][j] == arr[i][j + 1]) && (arr[i][j + 1] == arr[i][j + 2]) && (arr[i][j + 1] == arr[i][j + 3]) && (arr[i][j + 1] == arr[i][j + 4]) && (arr[i][j] != ' ')) { return arr[i][j]; } } } // printf("橫排\n"); //棋子豎排能贏得可能 for (i = 0; i < col; i++) { for (j = 0; j <= row - 5; j++)//5可以替換 { if ((arr[j][i] == arr[j + 1][i]) && (arr[j + 1][i] == arr[j + 2][i]) && (arr[j + 1][i] == arr[j + 3][i]) && (arr[j + 1][i] == arr[j + 4][i]) && (arr[j][i] != ' ')) { return arr[j][i]; } } } // printf("豎排\n"); ////主對角線系列贏的可能(測試版) //for (i = 0; i <= row - 5; i++) //{ // for (j = 0; j <= col - 5; j++) // { // printf("%cA", arr[i][j]); // if ((arr[i][j] == arr[i + 1][j + 1]) && (arr[i + 1][j + 1] == arr[i + 2][j + 2]) && (arr[i + 2][j + 2] == arr[i + 3][j + 3]) && (arr[i + 3][j + 3] == arr[i + 4][j + 4]) && (arr[i][j] != ' ')) // { // return arr[i][j]; // } // } // printf("\n"); //} //printf("對角排\n"); //主對角線系列贏的可能 for (i = 0; i <= row - 5; i++) { for (j = 0; j <= col - 5; j++) { if ((arr[i][j] == arr[i + 1][j + 1]) && (arr[i + 1][j + 1] == arr[i + 2][j + 2]) && (arr[i + 2][j + 2] == arr[i + 3][j + 3]) && (arr[i + 3][j + 3] == arr[i + 4][j + 4]) && (arr[i][j] != ' ')) { return arr[i][j]; } } } // printf("對角排\n"); //// 副對角線系列贏的可能(測試版) // for (i = row-5; i >=0; i--) // { // for (j = 0; j <=col-5; j++) // { // //printf("%cA", arr[i][j]); // if ((arr[i + 4][j] == arr[i + 3][j + 1]) // && (arr[i + 3][j + 1] == arr[i + 2][j + 2]) // && (arr[i + 2][j + 2] == arr[i + 1][j + 3]) // && (arr[i + 1][j + 3] == arr[i][j + 4]) // && (arr[i + 4][j] != ' ')) // { // return arr[i + 4][j]; // } // } // //printf("\n"); // } //副對角線贏得可能 for (i = 0; i <= row - 5; i++) { for (j = col - 5; j >= 0; j--) { if ((arr[i][j + 4] == arr[i + 1][j + 3]) && (arr[i + 1][j + 3] == arr[i + 2][j + 2]) && (arr[i + 2][j + 2] == arr[i + 3][j + 1]) && (arr[i + 3][j + 1] == arr[i + 4][j]) && (arr[i][j + 4] != ' ')) { return arr[i][j + 4]; } } } // printf("反對角排\n"); if (IsFull(arr, row, col)) { return'q'; } return' '; }
#include "game.h" void menu() { printf("************************************************\n"); printf("****** 1.開始 0.結束 ******\n"); printf("************************************************\n"); printf("****** *表示玩家走棋 ******\n"); printf("****** 0表示電腦走棋 ******\n"); printf("************************************************\n"); } void game() { char arr[ROW][COL]; char set ; InitBoard(arr, ROW, COL); // Display(arr, ROW, COL); do { ComputerMove(arr); Display(arr, ROW, COL); set = IsWin(arr, ROW, COL); if (set != ' ') { break; } PlayerMove(arr, ROW, COL); Display(arr, ROW, COL); set = IsWin(arr, ROW, COL); if (set != ' ') { break; } printf("********************************************\n"); printf("********************************************\n"); } while (set==' ');//set == ' ' if (set == '*') { printf("恭喜你贏了\n"); } else if (set == '0') { printf("電腦贏了\n"); } else if (set == 'p') { printf("平局\n"); } } void test() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("請選擇:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: break; default: printf("選擇失敗!!!\n"); break; } } while (input); } int main() { test(); system("pause"); return 0; }
願與君共享,如有好的建議或意見,QQ2630420233 謝謝
珍&原始碼