C語言實現(xiàn)簡單的三子棋項目
前言
三子棋是黑白棋的一種。三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就算輸了。但是,有很多時候會出現(xiàn)和棋的情況。
多文件形式
在實現(xiàn)游戲的首先,需要創(chuàng)建test.c game.c game.h三個文件。
test.c主要進行游戲的測試。
game.c主要進行游戲內(nèi)部一些函數(shù)的具體實現(xiàn)。
game.h主要是一些聲明,宏定義。
游戲邏輯
1、打印一個游戲的簡易菜單。
2、初始化棋盤。
3、打印棋盤。
4、玩家下棋(鍵盤輸入坐標) 打印棋盤,判斷輸贏。
5、電腦下棋(隨機坐標) 打印棋盤,判斷輸贏。
游戲?qū)崿F(xiàn)
1.打印菜單
在屏幕打印一個簡易菜單,提示玩家選擇。
void menu() { printf("**************************\n"); printf("******** 1.play ********\n"); printf("******** 0.exit ********\n"); printf("**************************\n"); }
2.初始化棋盤
將3x3的數(shù)組初始化為空格。
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,根據(jù)玩家所輸入將對應數(shù)組賦值為星號'*'。
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.電腦下棋
生成隨機數(shù),在所對應數(shù)組賦值為井號‘#'。
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.棋盤為滿,繼續(xù)游戲返回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);
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解C++成員函數(shù)的override和final說明符的用法
這篇文章主要介紹了詳解C++成員函數(shù)的override和final說明符的用法,分別用于重寫和禁止繼承類,要的朋友可以參考下2016-01-01C++實現(xiàn)LeetCode(133.克隆無向圖)
這篇文章主要介紹了C++實現(xiàn)LeetCode(133.克隆無向圖),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07C/C++實現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換的多種方法
在C/C++程序中,會需要把數(shù)字與字符串做出互相轉(zhuǎn)換的操作,用于實現(xiàn)程序想要的效果,下面將介紹多種方法實現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換,文中有詳細的代碼示例供大家參考,需要的朋友可以參考下2024-08-08