C語言實(shí)現(xiàn)簡單的五子棋小游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)五子棋小游戲的具體代碼,供大家參考,具體內(nèi)容如下
我們需要一個(gè)二維數(shù)組去儲(chǔ)存當(dāng)前的棋盤狀態(tài),然后打印出來。
我們游戲的邏輯是初始化棋盤,打印棋盤,人下棋,打印棋盤,判斷是否游戲結(jié)束,電腦下棋,打印棋盤,判斷是否游戲結(jié)束,然后回到人下棋過程,結(jié)束游戲后,判斷誰贏誰輸還是平局。
判斷輸贏的邏輯是遍歷行,遍歷列,遍歷主對(duì)角線,遍歷反對(duì)角線,如果都判斷不出輸贏,那么就繼續(xù)游戲。
game.h
#include <stdio.h> #include <stdlib.h> #include <time.h> ? //棋盤大小 #define ROW 10 #define COL 10 ? //初始化 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);
game.c
#define _CRT_SECURE_NO_WARNINGS 1 ? #include "game.h" ? void InitBoard(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++) ?? ??? ?{ ?? ??? ??? ?board[i][j] = ' '; ?? ??? ?} ?? ?} } ? void DisplayBoard(char board[ROW][COL], int row, int col) { ?? ?int i = 0; ?? ?for (i = 0; i < row; i++) ?? ?{ ?? ??? ?//1.打印一行的數(shù)據(jù)? ?? ??? ?int j = 0; ?? ??? ?for (j = 0; j < col; j++) ?? ??? ?{ ?? ??? ??? ?printf(" %c ", board[i][j]); ?? ??? ??? ?if (j < col - 1) ?? ??? ??? ?{ ?? ??? ??? ??? ?printf("|"); ?? ??? ??? ?} ?? ??? ?} ?? ??? ?printf("\n"); ?? ??? ?//2.打印分割行 ?? ??? ?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) { ?? ?int x = 0; ?? ?int y = 0; ?? ?printf("玩家下棋:>\n"); ?? ?while (1) ?? ?{ ?? ??? ?printf("請(qǐng)輸入要下的坐標(biāo):>"); ?? ??? ?scanf("%d%d", &x, &y); ?? ??? ?//判斷x,y坐標(biāo)的合法性 ?? ??? ?if ((x >= 1 && x <= row) && (y >= 1 && y <= col)) ?? ??? ?{ ?? ??? ??? ?if (board[x - 1][y - 1] == ' ') ?? ??? ??? ?{ ?? ??? ??? ??? ?board[x - 1][y - 1] = '*'; ?? ??? ??? ??? ?break; ?? ??? ??? ?} ?? ??? ??? ?else ?? ??? ??? ?{ ?? ??? ??? ??? ?printf("該坐標(biāo)被占用\n"); ?? ??? ??? ?} ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?printf("坐標(biāo)非法,請(qǐng)重新輸入:\n"); ?? ??? ?} ? ? ?? ?? ?} } ? void ComputerMove(char board[ROW][COL], int row, int col) { ?? ?int x = 0; ?? ?int y = 0; ?? ?printf("電腦下棋:>\n"); ?? ?while (1) ?? ?{ ?? ??? ?x = rand() % row; ?? ??? ?y = rand() % col; ?? ??? ?if (board[x][y] == ' ') ?? ??? ?{ ?? ??? ??? ?board[x][y] = '#'; ?? ??? ??? ?break; ?? ??? ?} ?? ??? ? ?? ?} } ? //返回1表示棋盤滿了 //返回0表示棋盤沒滿 static 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; ?? ?int j = 0; ?? ?//橫 ?? ?for (i = 0; i < row; i++) ?? ?{ ?? ??? ?for (j = 0; j < col - 4; j++) ?? ??? ?{ ?? ??? ??? ?if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2]? ?? ??? ??? ??? ?&& board[i][j + 2] == board[i][j + 3] && board[i][j + 3] == board[i][j + 4] ?? ??? ??? ??? ?&& board[i][j] != ' ') ?? ??? ??? ?{ ?? ??? ??? ??? ?return board[i][j]; ?? ??? ??? ?} ?? ??? ?} ?? ?} ? ?? ?//豎 ?? ?for (i = 0; i < row - 4; i++) ?? ?{ ?? ??? ?for (j = 0; j < col; j++) ?? ??? ?{ ?? ??? ??? ?if (board[i][j] == board[i + 1][j] && board[i + 1][j] == board[i + 2][j] ?? ??? ??? ??? ?&& board[i + 2][j] == board[i + 3][j] && board[i + 3][j] == board[i + 4][j] ?? ??? ??? ??? ?&& board[i][j] != ' ') ?? ??? ??? ?{ ?? ??? ??? ??? ?return board[i][j]; ?? ??? ??? ?} ?? ??? ?} ?? ?} ? ?? ?//兩個(gè)對(duì)角線 ?? ?for (i = 0; i < row - 4; i++) ?? ?{ ?? ??? ?for (j = 0; j < col - 4; j++) ?? ??? ?{ ?? ??? ??? ?if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2] ?? ??? ??? ??? ?&& board[i + 2][j + 2] == board[i + 3][j + 3] && board[i + 3][j + 3] == board[i + 4][j + 4] ?? ??? ??? ??? ?&& board[i][j] != ' ') ?? ??? ??? ?{ ?? ??? ??? ??? ?return board[i][j]; ?? ??? ??? ?} ?? ??? ?} ?? ?} ? ?? ?for (i = 0; i < row - 4; i++) ?? ?{ ?? ??? ?for (j = col-1; j >= 4; j--) ?? ??? ?{ ?? ??? ??? ?if (board[i][j] == board[i + 1][j - 1] && board[i + 1][j - 1] == board[i + 2][j - 2] ?? ??? ??? ??? ?&& board[i + 2][j - 2] == board[i + 3][j - 3] && board[i + 3][j - 3] == board[i + 4][j - 4] ?? ??? ??? ??? ?&& board[i][j] != ' ') ?? ??? ??? ?{ ?? ??? ??? ??? ?return board[i][j]; ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ? ?? ?//判斷是否平局 ?? ?if (1 == IsFull(board, ROW, COL)) ?? ?{ ?? ??? ?return 'Q'; ?? ?} ?? ?return 'C'; }
test.c
#define _CRT_SECURE_NO_WARNINGS 1 ? #include "game.h" ? void menu() { ?? ?printf("***********************\n"); ?? ?printf("*******五子棋游戲*******\n"); ?? ?printf("**** 1.play ?0.exit ***\n"); ?? ?printf("***********************\n"); } ? // # | * | //---|---|--- // * | ? | //---|---|--- // ? | ? | ?? //? //告訴我們四種游戲的狀態(tài) //玩家贏-'*' //電腦贏-'#' //平局 ?-'Q' //繼續(xù) ?-'C' ? ? //游戲的整個(gè)算法實(shí)現(xiàn) void game() { ?? ?char ?ret = 0;//接收四種狀態(tài)的返回值 ?? ?//數(shù)組-存放走出的棋盤信息 ?? ?char board[ROW][COL] = { 0 };//全部空格 ?? ?InitBoard(board, ROW, COL);//初始化棋盤 ?? ?//打印棋盤 ?? ?DisplayBoard(board, ROW, COL); ?? ?//下棋 ?? ?while (1) ?? ?{ ?? ??? ?//玩家下棋 ?? ??? ?PlayerMove(board, ROW, COL); ?? ??? ?DisplayBoard(board, ROW, COL); ?? ??? ?//判斷玩家是否贏 ?? ??? ?ret = IsWin(board, ROW, COL); ?? ??? ?if (ret != 'C') ?? ??? ?{ ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?//電腦下棋 ?? ??? ?ComputerMove(board, ROW, COL); ?? ??? ?DisplayBoard(board, ROW, COL); ?? ??? ?//判斷電腦是否贏 ?? ??? ?ret = IsWin(board, ROW, COL); ?? ??? ?if (ret != 'C') ?? ??? ?{ ?? ??? ??? ?break; ?? ??? ?} ?? ?} ?? ?if (ret == '*') ?? ?{ ?? ??? ?printf("玩家贏\n"); ?? ?} ?? ?else if (ret == '#') ?? ?{ ?? ??? ?printf("電腦贏\n"); ?? ?} ?? ?else ?? ?{ ?? ??? ?printf("平局\n"); ?? ?} } ? void test() { ?? ?int input = 0; ?? ?srand((unsigned int)time(NULL)); ?? ?do ?? ?{ ?? ??? ?menu(); ?? ??? ?printf("請(qǐng)選擇:>"); ?? ??? ?scanf("%d", &input); ?? ??? ?switch(input) ?? ??? ?{ ?? ??? ??? ?case 1: ?? ??? ??? ??? ?game(); ?? ??? ??? ??? ?break; ?? ??? ??? ?case 0: ?? ??? ??? ??? ?printf("退出游戲\n"); ?? ??? ??? ??? ?break; ?? ??? ??? ?default: ?? ??? ??? ??? ?printf("選擇錯(cuò)誤,請(qǐng)重新選擇!\n"); ?? ??? ??? ??? ?break; ?? ??? ?} ?? ?} while (input); } ? int main() { ?? ?test(); ?? ?return 0; }
功能測試
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++中的string庫函數(shù)常見函數(shù)的作用和使用方法
這篇文章主要介紹了C++中的string庫函數(shù)常見函數(shù)的作用和使用方法,庫函數(shù)的靈活應(yīng)用是程序員的一大重要技能,本文通過實(shí)例實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2022-04-04如何利用C語言實(shí)現(xiàn)最簡單的HTTP服務(wù)器詳解
這篇文章主要給大家介紹了關(guān)于如何利用C語言實(shí)現(xiàn)最簡單的HTTP服務(wù)器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C語言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11利用C++11原子量如何實(shí)現(xiàn)自旋鎖詳解
當(dāng)自旋鎖嘗試獲取鎖時(shí)以忙等待(busy waiting)的形式不斷地循環(huán)檢查鎖是否可用,下面這篇文章主要給大家介紹了關(guān)于利用C++11原子量如何實(shí)現(xiàn)自旋鎖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-06-06C++中char*轉(zhuǎn)換為LPCWSTR的解決方案
最近在學(xué)習(xí)C++,遇到了一個(gè)char*轉(zhuǎn)換為LPCWSTR的問題,通過查找資料終于解決了,所以下面這篇文章主要介紹了C++中char*轉(zhuǎn)LPCWSTR的解決方案,文中通過詳細(xì)的示例代碼介紹的很詳細(xì),有需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01在Ubuntu中安裝VSCode并配置C/C++開發(fā)環(huán)境的方法步驟
這篇文章主要介紹了在Ubuntu中安裝VSCode并配置C/C++開發(fā)環(huán)境的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05c++中vector<int>和vector<int*>的用法及區(qū)別
這篇文章主要介紹了c++中vector<int>和vector<int*>的用法及區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2013-10-10