五子棋是一種經典的策略性棋類游戲,因其規則簡單、趣味性強而廣受歡迎。本文將詳細介紹如何使用C語言實現一個簡單的五子棋小游戲。我們將從游戲的基本規則、數據結構設計、核心算法實現、用戶交互等方面進行講解,并提供完整的代碼示例。
五子棋的規則非常簡單:兩名玩家輪流在棋盤上下棋,一方使用黑棋,另一方使用白棋。當某一方的棋子在某一條直線上(橫、豎、斜)連續出現五個時,該方獲勝。如果棋盤被填滿且沒有一方獲勝,則游戲以平局告終。
在實現五子棋游戲時,我們需要考慮以下幾個方面:
我們使用一個15x15的二維數組來表示棋盤,數組中的每個元素可以取以下值:
0
:表示該位置為空。1
:表示該位置為黑棋。2
:表示該位置為白棋。#define BOARD_SIZE 15
int board[BOARD_SIZE][BOARD_SIZE] = {0};
我們使用一個變量current_player
來表示當前下棋的玩家,1
表示黑棋玩家,2
表示白棋玩家。
int current_player = 1; // 1: 黑棋, 2: 白棋
玩家下棋時,需要輸入棋子的行和列坐標。我們需要檢查該位置是否為空,如果為空則下棋,否則提示玩家重新輸入。
void place_piece(int row, int col, int player) {
if (board[row][col] == 0) {
board[row][col] = player;
} else {
printf("該位置已有棋子,請重新輸入!\n");
}
}
每次下棋后,我們需要檢查當前下棋的位置是否形成五子連珠。我們可以從當前下棋的位置向四個方向(橫、豎、斜)進行檢查,判斷是否有連續五個相同的棋子。
int check_win(int row, int col, int player) {
int directions[4][2] = {{1, 0}, {0, 1}, {1, 1}, {1, -1}};
for (int i = 0; i < 4; i++) {
int count = 1;
int dx = directions[i][0];
int dy = directions[i][1];
int x = row + dx;
int y = col + dy;
while (x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE && board[x][y] == player) {
count++;
x += dx;
y += dy;
}
x = row - dx;
y = col - dy;
while (x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE && board[x][y] == player) {
count++;
x -= dx;
y -= dy;
}
if (count >= 5) {
return 1;
}
}
return 0;
}
當游戲結束時,我們需要顯示獲勝方或平局信息,并詢問玩家是否繼續游戲。
void game_over(int winner) {
if (winner == 1) {
printf("黑棋獲勝!\n");
} else if (winner == 2) {
printf("白棋獲勝!\n");
} else {
printf("平局!\n");
}
printf("是否繼續游戲?(y/n): ");
char choice;
scanf(" %c", &choice);
if (choice == 'y' || choice == 'Y') {
reset_board();
} else {
exit(0);
}
}
在游戲結束后,如果需要繼續游戲,我們需要重置棋盤。
void reset_board() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
board[i][j] = 0;
}
}
current_player = 1;
}
我們需要在每次下棋后顯示當前的棋盤狀態,方便玩家查看。
void display_board() {
printf(" ");
for (int i = 0; i < BOARD_SIZE; i++) {
printf("%2d ", i);
}
printf("\n");
for (int i = 0; i < BOARD_SIZE; i++) {
printf("%2d ", i);
for (int j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == 0) {
printf(" . ");
} else if (board[i][j] == 1) {
printf(" X ");
} else {
printf(" O ");
}
}
printf("\n");
}
}
玩家需要輸入下棋的位置,我們需要對輸入進行合法性檢查。
void get_player_input(int *row, int *col) {
printf("玩家 %d,請輸入下棋位置(行 列):", current_player);
scanf("%d %d", row, col);
while (*row < 0 || *row >= BOARD_SIZE || *col < 0 || *col >= BOARD_SIZE || board[*row][*col] != 0) {
printf("輸入無效,請重新輸入:");
scanf("%d %d", row, col);
}
}
主程序邏輯包括初始化棋盤、玩家輪流下棋、勝負判斷、游戲結束處理等。
int main() {
reset_board();
while (1) {
display_board();
int row, col;
get_player_input(&row, &col);
place_piece(row, col, current_player);
if (check_win(row, col, current_player)) {
display_board();
game_over(current_player);
} else {
current_player = (current_player == 1) ? 2 : 1;
}
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define BOARD_SIZE 15
int board[BOARD_SIZE][BOARD_SIZE] = {0};
int current_player = 1; // 1: 黑棋, 2: 白棋
void display_board() {
printf(" ");
for (int i = 0; i < BOARD_SIZE; i++) {
printf("%2d ", i);
}
printf("\n");
for (int i = 0; i < BOARD_SIZE; i++) {
printf("%2d ", i);
for (int j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == 0) {
printf(" . ");
} else if (board[i][j] == 1) {
printf(" X ");
} else {
printf(" O ");
}
}
printf("\n");
}
}
void place_piece(int row, int col, int player) {
if (board[row][col] == 0) {
board[row][col] = player;
} else {
printf("該位置已有棋子,請重新輸入!\n");
}
}
int check_win(int row, int col, int player) {
int directions[4][2] = {{1, 0}, {0, 1}, {1, 1}, {1, -1}};
for (int i = 0; i < 4; i++) {
int count = 1;
int dx = directions[i][0];
int dy = directions[i][1];
int x = row + dx;
int y = col + dy;
while (x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE && board[x][y] == player) {
count++;
x += dx;
y += dy;
}
x = row - dx;
y = col - dy;
while (x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE && board[x][y] == player) {
count++;
x -= dx;
y -= dy;
}
if (count >= 5) {
return 1;
}
}
return 0;
}
void game_over(int winner) {
if (winner == 1) {
printf("黑棋獲勝!\n");
} else if (winner == 2) {
printf("白棋獲勝!\n");
} else {
printf("平局!\n");
}
printf("是否繼續游戲?(y/n): ");
char choice;
scanf(" %c", &choice);
if (choice == 'y' || choice == 'Y') {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
board[i][j] = 0;
}
}
current_player = 1;
} else {
exit(0);
}
}
void get_player_input(int *row, int *col) {
printf("玩家 %d,請輸入下棋位置(行 列):", current_player);
scanf("%d %d", row, col);
while (*row < 0 || *row >= BOARD_SIZE || *col < 0 || *col >= BOARD_SIZE || board[*row][*col] != 0) {
printf("輸入無效,請重新輸入:");
scanf("%d %d", row, col);
}
}
int main() {
while (1) {
display_board();
int row, col;
get_player_input(&row, &col);
place_piece(row, col, current_player);
if (check_win(row, col, current_player)) {
display_board();
game_over(current_player);
} else {
current_player = (current_player == 1) ? 2 : 1;
}
}
return 0;
}
通過本文的介紹,我們實現了一個簡單的五子棋小游戲。雖然這個游戲的實現相對簡單,但它涵蓋了C語言中數組、循環、條件判斷、函數等基本語法的使用。通過這個項目,讀者可以加深對C語言的理解,并為后續更復雜的項目打下基礎。
當然,這個五子棋游戲還有很多可以改進的地方,例如:
希望本文對讀者有所幫助,祝大家在編程的道路上越走越遠!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。