C語言實現(xiàn)控制臺五子棋小游戲
這是一個用C語言實現(xiàn)的控制臺小游戲—-五子棋,棋盤大小和獲勝棋子數(shù)目是用宏定義的,可以自定義,所以可以輕松改為三子棋、六子棋等等。此游戲設(shè)定為人機對戰(zhàn)(PVE),電腦走棋是隨機的。
編譯環(huán)境:VS2015
此程序采用多文件編譯,共有三個文件,一個game.h頭文件,一個game.c文件和一個main.c文件,代碼分別如下:
game.h
這里是一些數(shù)據(jù)和函數(shù)的聲明
#ifndef _GAME_H_ #define _GAME_H_ #define _BOARD_ 10 //棋盤大小 #define _PIECE_ 5 //獲勝所需要連起來的棋子個數(shù) typedef struct Board{ char show[_BOARD_][_BOARD_]; //棋盤字符數(shù)組 char Pc; //電腦使用的棋子 char Player; //棋手使用的棋子 }Brd ,*pBrd; //Brd:五子棋 pBrd:五子棋指針 void init(pBrd B); void PrintBrd(const pBrd B); void Pcrand(pBrd B); int Player(pBrd B); int judge(pBrd B, int n); void menu(pBrd B); #endif // ! _GAME_H_
game.c
這里是函數(shù)的具體實現(xiàn)
#include<stdio.h> #include<stdlib.h> #include<time.h> #include "game.h" void init(pBrd B) { int i, j; for (i = 0; i < _BOARD_; i++) { for (j = 0; j < _BOARD_; j++) { B->show[i][j] = ' '; } } B->Pc = '@'; B->Player = '*'; } void PrintBrd(const pBrd B) { int i, j; printf(" "); for (i = 0; i < _BOARD_; i++) { printf(" %d", i + 1); } printf("\n"); for (i = 0; i < _BOARD_; i++) { for (j = 0; j < _BOARD_; j++) { if (j == 0)printf(" %d|", i + 1); printf(" %c |", B->show[i][j]); } if (i == 0)printf(" Player: *"); if (i == 1)printf(" AI: @"); printf("\n\n"); } } void Pcrand(pBrd B) { int i, j; srand((unsigned int)time((NULL))); int n = rand()%(_BOARD_*_BOARD_); for (i = 0; i < _BOARD_; i++) { for (j = 0; j < _BOARD_; j++) { if (n > 0)n--; else if (n == 0 && B->show[i][j] == ' ') { B->show[i][j] = B->Pc; return; } } } } int Player(pBrd B) { int i, j; printf("請輸入落子位置:\n"); printf("行:>"); scanf("%d", &i); printf("列:>"); scanf("%d", &j); i--; j--; if (B->show[i][j] != ' ' || i >= _BOARD_ || j >= _BOARD_ || i < 0 || j < 0) { printf("請輸入正確的位置!\n"); system("pause"); return 0; } B->show[i][j] = B->Player; return 1; } int judge(pBrd B, int n) { char s; int c = 0; int i, j, sum = 0; if (n == 1)s = B->Player; else if (n = 2) s = B->Pc; for (i = 0; i < _BOARD_; i++) { sum = 0; for (j = 0; j < _BOARD_; j++) { if (B->show[i][j] == s)sum++; else sum = 0; if (sum == _PIECE_)return 1; } } for (j = 0; j < _BOARD_; j++) { sum = 0; for (i = 0; i < _BOARD_; i++) { if (B->show[i][j] == s)sum++; else sum = 0; if (sum == _PIECE_)return 1; } } sum = 0; for (i = 0, j = 0; i < _BOARD_; i++, j++) { if (B->show[i][j] == s)sum++; else sum = 0; if (sum == _PIECE_)return 1; } sum = 0; for (i = 0, j = _BOARD_ - 1; i < _BOARD_; i++, j--) { if (B->show[i][j] == s)sum++; else sum = 0; if (sum == _PIECE_)return 1; } return 0; } void menu(pBrd B) { int c,n = 1; printf("****************************************\n"); printf("********* 1.play ** 0.exit *********\n"); printf("****************************************\n"); printf("請輸入選項:>"); scanf("%d", &c); while (c) { system("cls"); if (n == 1) { PrintBrd(B); if(Player(B))n=2; else continue; } else { Pcrand(B); n = 1; } if (judge(B, n)) { PrintBrd(B); if (n == 1)printf("Old Fe 666!\n"); else printf("請大俠重新來過\n"); break; } } }
main.c
程序入口
#include"game.h" int main() { Brd B; init(&B); menu(&B); printf("Thanks for playing my game.\n"); return 0; }
運行截圖
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++實現(xiàn)LeetCode(14.最長共同前綴)
這篇文章主要介紹了C++實現(xiàn)LeetCode(14.最長共同前綴),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07c++類成員函數(shù)如何做函數(shù)參數(shù)
這篇文章主要介紹了c++類成員函數(shù)如何做函數(shù)參數(shù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11Qt使用SqlLite實現(xiàn)權(quán)限管理的示例代碼
本文主要介紹了Qt使用SqlLite實現(xiàn)權(quán)限管理的示例代碼,管理員針對不同人員進行權(quán)限設(shè)定,具有一定的參考價值,感興趣的可以了解一下2023-09-09Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)通用數(shù)據(jù)庫請求
這篇文章主要為大家介紹了Qt中是如何實現(xiàn)通用數(shù)據(jù)庫請求的,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Qt有一定幫助,感興趣的小伙伴可以了解一下2022-03-03淺析Boost智能指針:scoped_ptr shared_ptr weak_ptr
雖然通過弱引用指針可以有效的解除循環(huán)引用,但這種方式必須在程序員能預(yù)見會出現(xiàn)循環(huán)引用的情況下才能使用,也可以是說這個僅僅是一種編譯期的解決方案,如果程序在運行過程中出現(xiàn)了循環(huán)引用,還是會造成內(nèi)存泄漏的2013-09-09