C語言實現簡單的三子棋項目
前言
三子棋是黑白棋的一種。三子棋是一種民間傳統遊戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,隻要將自己的三個棋子走成一條線,對方就算輸瞭。但是,有很多時候會出現和棋的情況。
多文件形式
在實現遊戲的首先,需要創建test.c game.c game.h三個文件。
test.c主要進行遊戲的測試。
game.c主要進行遊戲內部一些函數的具體實現。
game.h主要是一些聲明,宏定義。
遊戲邏輯
1、打印一個遊戲的簡易菜單。
2、初始化棋盤。
3、打印棋盤。
4、玩傢下棋(鍵盤輸入坐標) 打印棋盤,判斷輸贏。
5、電腦下棋(隨機坐標) 打印棋盤,判斷輸贏。
遊戲實現
1.打印菜單
在屏幕打印一個簡易菜單,提示玩傢選擇。
void menu() { printf("**************************\n"); printf("******** 1.play ********\n"); printf("******** 0.exit ********\n"); printf("**************************\n"); }
2.初始化棋盤
將3×3的數組初始化為空格。
void InitBoard(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; j++) { board[i][j] = ' '; } } }
3.打印棋盤
在屏幕打印當前棋盤,讓玩傢選擇下一步所要走哪一步。
void DisplayBoard(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; j++) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } } printf("\n"); } }
4.玩傢下棋
玩傢在鍵盤上輸入坐標,所輸入的合法范圍是1<=x,y<=3,根據玩傢所輸入將對應數組賦值為星號’*’。
void PlayerMove(char board[ROW][COL], int row, int col) { printf("玩傢走:>\n"); int x = 0; int y = 0; while (1) { scanf("%d%d", &x, &y); if (x >= 1 && x <= 3 && y >= 1 && y <= 3) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("坐標被占用,請重新輸入\n"); } } else { printf("下標越界,請重新輸入\n"); } } }
5.電腦下棋
生成隨機數,在所對應數組賦值為井號‘#’。
void ComputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("電腦走:>\n"); x = rand() % row; y = rand() % col; while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }
6.判斷輸贏
1.玩傢贏返回星號
2.電腦贏返回井號
3.平局返回P
4.棋盤為滿,繼續遊戲返回C
char Iswin(char board[ROW][COL], int row, int col) { int i = 0; //行 for (i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ') { return board[i][1]; } } //列 for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ') { return board[1][i]; } } //對角線 if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') { return board[1][1]; } if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ') { return board[1][1]; } if (IsFull(board, ROW, COL)) { return 'P'; } return 'C'; }
7.判斷棋盤是否滿
int IsFull(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++) { if (board[i][j] == ' ') return 0; } } return 1; }
具體代碼
test.c
#include "game.h" void menu() { printf("**************************\n"); printf("******** 1.play ********\n"); printf("******** 0.exit ********\n"); printf("**************************\n"); } void game() { char board[ROW][COL]; //初始化棋盤 InitBoard(board, ROW, COL); //打印棋盤 DisplayBoard(board, ROW, COL); //玩傢下棋 while (1) { PlayerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); if (Iswin(board, ROW, COL) != 'C') { break; } ComputerMove(board, ROW, COL); DisplayBoard(board, ROW, COL); if (Iswin(board, ROW, COL) != 'C') { break; } } if (Iswin(board, ROW, COL) == '*') { printf("玩傢贏\n"); } else if (Iswin(board, ROW, COL) == '#') { printf("電腦贏\n"); } else { printf("平局\n"); } } int main() { int input = 0; do { printf("請選擇:\n"); menu(); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出遊戲\n"); break; default: printf("輸入錯誤\n"); break; } } while (input); return 0; }
game.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void InitBoard(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; j++) { board[i][j] = ' '; } } } void DisplayBoard(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; j++) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); if (i < row - 1) { for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } } printf("\n"); } } void PlayerMove(char board[ROW][COL], int row, int col) { printf("玩傢走:>\n"); int x = 0; int y = 0; while (1) { scanf("%d%d", &x, &y); if (x >= 1 && x <= 3 && y >= 1 && y <= 3) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("坐標被占用,請重新輸入\n"); } } else { printf("下標越界,請重新輸入\n"); } } } void ComputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("電腦走:>\n"); x = rand() % row; y = rand() % col; while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } int IsFull(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++) { if (board[i][j] == ' ') return 0; } } return 1; } char Iswin(char board[ROW][COL], int row, int col) { int i = 0; //行 for (i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ') { return board[i][1]; } } //列 for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ') { return board[1][i]; } } //對角線 if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') { return board[1][1]; } if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ') { return board[1][1]; } if (IsFull(board, ROW, COL)) { return 'P'; } return 'C'; }
game.h
#pragma once #include <stdio.h> #define ROW 3 #define COL 3 void InitBoard(char board[ROW][COL], int row, int col); void DisplayBoard(char board[ROW][COL], int row, int col); void PlayerMove(char board[ROW][COL], int row, int col); void ComputerMove(char board[ROW][COL], int row, int col); char Iswin(char board[ROW][COL], int row, int col);
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。