小遊戲——三子棋(C語言實現)
阿新 • • 發佈:2018-11-17
一、遊戲步驟
三子棋的實現其實很簡單,只要思路理清,然後按照步驟一步一步的用程式碼實現就可以了。具體步驟如下:
1、遊戲開始。(列印一個遊戲選單)
2、列印遊戲棋盤。
3、玩家走棋,判斷該座標是否有效,無效,提示重新輸入。有效,列印棋盤;然後判贏,贏,遊戲結束;
4、電腦走棋,列印棋盤,並且判贏。贏,遊戲結束;
步驟如圖:
二、程式碼實現:
1、主要實現:game.c
程式碼如下:
#pragma once #include"Game.h" void Game() { char a='w'; int count = 0; char board[ROW][COL]; InitBoard(board,ROW,COL); stampGame(board, ROW, COL); while (1) { PlayerRemove(board, ROW, COL); count++; stampGame(board, ROW, COL); a=IsWinGame(board, ROW, COL); if (a != ' ') { find_win(a); break; } computerRemove(board, ROW, COL); count++; stampGame(board, ROW, COL); a = IsWinGame(board, ROW, COL); if (a != ' ') { find_win(a); break; } } } void InitBoard(char board[ROW][COL], int row, int col) { memset(board, ' ', sizeof(board[0][0])*row*col); } void stampGame(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf(" %c ",board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); if (i<row-1) { for (j = 0; j < row; j++) { printf("---"); if (j < row-1) printf("|"); } } printf("\n"); } } void PlayerRemove(char board[ROW][COL], int row, int col) { int x = -1, y = -1; printf("玩家走:\n"); while (1) { scanf("%d %d", &x, &y); if (x <= row && y <= col && x > 0 && y > 0) { if (board[x-1][y-1] == ' ') { board[x - 1][y - 1] = 'O'; return; } else { printf("此位被佔了請重新輸入:\n"); } } else { printf("垃圾輸入錯誤:\n"); } } } void computerRemove(char board[ROW][COL], int row, int col) { int x = -1, y = -1; printf("電腦走:\n"); while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x][y] = 'X'; return; } } } char IsWinGame(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) // 判斷每一行是否相等 { int j = 0; for (j = 0; j < col - 1; j++) { if (board[i][j] != board[i][j + 1]) break; } if (j == col - 1) return board[i][0]; } for (i = 0; i < col; i++) // 判斷每一列是否相等 { int j = 0; for (j = 0; j < row - 1; j++) { if (board[j][i] != board[j + 1][i]) break; } if (j == row - 1) return board[0][i]; } for (i = 0; i < row - 1; i++) // 判斷每對角線是否相等 { if (board[i][i] != board[i + 1][i + 1]) break; } if (i == row - 1) return board[0][0]; for (i = 0; i < row - 1; i++) // 判斷每對角線是否相等 { if (board[i][row - 1 - i] != board[i + 1][row - 1 - i - 1]) break; } if (i == row - 1) return board[row - 1][0]; for (i = 0; i < row; i++) // 如果相等,判斷內容是什麼 { int j = 0; for (j = 0; j < col; j++) { if (board[i][j] == ' ') return ' '; } } return 'Q'; } void find_win(char win) { if (win == 'O') printf("玩家贏\n"); else if (win == 'X') printf("電腦贏\n"); else printf("平局\n"); }
2、標頭檔案 game.h
程式碼如下:
#pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<Windows.h> #include<string.h> #include<time.h> #define ROW 3 #define COL 3 void Game(); void stampGame(char board[ROW][COL], int row, int col); // 列印棋盤 void InitBoard(char board[ROW][COL], int row, int col); // 初始化 void PlayerRemove(char board[ROW][COL], int row, int col); // 玩家走棋 void computerRemove(char board[ROW][COL], int row, int col); // 電腦走棋 char IsWinGame(char board[ROW][COL], int row, int col); // 判贏 void find_win(char win); // 判贏條件
3、具體實現原始檔:game.c
程式碼如下:
#pragma once #include"Game.h" void menu() { printf("=============================\n"); printf("======== 1.play =============\n"); printf("======== 0.exit =============\n"); printf("=============================\n"); } int main() { int input; srand((unsigned int) time(NULL)); do { menu(); printf("請選擇<1,0>: "); scanf("%d", &input); switch (input) { case 1: Game(); break; case 0: break; default: printf("輸入錯誤:\n"); fflush(stdin);//清空輸入緩衝區,避免輸入字元型資料而死迴圈 break; } } while (input); system("pause"); return 0; }