欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實現(xiàn)簡單五子棋游戲

 更新時間:2022年05月05日 12:05:29   作者:adorable_  
這篇文章主要為大家詳細介紹了C++實現(xiàn)簡單五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

五子棋是世界智力運動會競技項目之一,是一種兩人對弈的純策略型棋類游戲,是世界智力運動會競技項目之一,通常雙方分別使用黑白兩色的棋子,下在棋盤直線與橫線的交叉點上,先形成5子連線者獲勝。

規(guī)則

(1)對局雙方各執(zhí)一色棋子。
(2)空棋盤開局。
(3)黑先、白后,交替下子,每次只能下一子。
(4)棋子下在棋盤的空白點上,棋子下定后,不得向其它點移動,不得從棋盤上拿掉或拿起另落別處。
(5)黑方的第一枚棋子可下在棋盤任意交叉點上。
(6)輪流下子是雙方的權利,但允許任何一方放棄下子權(即:PASS權)

五子棋對局,執(zhí)行黑方指定開局、三手可交換、五手兩打的規(guī)定。整個對局過程中黑方有禁手,白方無禁手。黑方禁手有三三禁手、四四禁手和長連禁手三種。

實現(xiàn)方案

通過縮小棋盤來抑制五子棋先行的優(yōu)勢,在這里使用15路棋盤。

(1)提供3個選擇模式

(2)輸入坐標(注意橫縱坐標之間需要空格)

(3)輸入非法坐標

(4)判斷輸贏

  • 判斷行是否滿足條件
  • 判斷列是否滿足條件
  • 判斷主對角線是否滿足條件
  • 判斷副對角線是否滿足條件

之后可選擇yes再來一局,也可以選擇no退出游戲。

源代碼如下:

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

using namespace std;

const int N = 15; //15*15的棋盤
const char ChessBoard = ' '; //棋盤標志
const char flag1 = 'o'; //玩家1或電腦標志
const char flag2 = 'x'; //玩家2標志

typedef struct Position{ //坐標
 int row; //行
 int col; //列
}Position;

class GoBang{ //五子棋類
public:
 GoBang(){
 InitChessBoard(); //初始化棋盤
 }
 void Play(){ //下棋
 Position Play1; //玩家1或電腦
 Position Play2; //玩家2
 while (1){
 int mode = ChoiceMode();
 while (1){
 if (mode == 1){ //電腦VS玩家
 ComputerChess(Play1, flag1); //電腦走
 if (GetVictory(Play1, 0, flag1)){ //0代表電腦,為真則表示電腦獲勝
 break;
 }
 PlayChess(Play2, 2, flag2); //玩家2走
 if (GetVictory(Play2, 2, flag2)){ //2代表玩家2
 break;
 }
 }
 else{ //玩家1VS玩家2
 PlayChess(Play1, 1, flag1); //玩家1走
 if (GetVictory(Play1, 1, flag1)){ //玩家1贏
 break;
 }
 PlayChess(Play2, 2, flag2); //玩家2走
 if (GetVictory(Play2, 2, flag2)){ //玩家2贏
 break;
 }
 }
 }
 cout << "======再來一局=======" << endl;
 cout << "yes or no :"; 
 char s[] = "yes";
 cin >> s;
 if (strcmp(s, "no") == 0){
 break;
 }
 }
 }

protected:
 void InitChessBoard(){ //初始化棋盤
 for (int i = 0; i < N + 1; ++i){
 for (int j = 0; j < N + 1; ++j){
 _ChessBoard[i][j] = ChessBoard;
 }
 }
 }

 int ChoiceMode(){ //選擇模式
 system("cls");
 //系統(tǒng)調用,清屏
 InitChessBoard(); //重新初始化棋盤
 cout << "*************************************************" << endl;
 cout << "******************0、退出************************" << endl;
 cout << "******************1、電腦VS玩家******************" << endl;
 cout << "******************2、玩家VS玩家******************" << endl;
 cout << "*************************************************" << endl;
 while (1){
 int i = 0;
 cout << "請選擇模式:";
 cin >> i;
 if (i == 0){ //退出
 exit(1);
 }
 if (i == 1 || i == 2){
 return i;
 }
 else{
 cout << "非法輸入,請重新輸入!" << endl;
 }
 }
 }

 void PrintChessBoard(){ //打印棋盤
 printf(" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n");
 printf(" |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");
 for (int i = 1; i < N + 1; ++i)
 {
 printf("%2d ", i);
 printf("| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |\n", _ChessBoard[i][1], _ChessBoard[i][2], _ChessBoard[i][3], _ChessBoard[i][4], _ChessBoard[i][5], _ChessBoard[i][6], _ChessBoard[i][7], _ChessBoard[i][8], _ChessBoard[i][9], _ChessBoard[i][10], _ChessBoard[i][11], _ChessBoard[i][12], _ChessBoard[i][13], _ChessBoard[i][14], _ChessBoard[i][15]);
 printf(" |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");
 }
 cout << endl;
 }

 void ComputerChess(Position& pos, char flag){ //電腦走
 //PrintChessBoard(); //打印棋盤
 int x = 0;
 int y = 0;
 while (1){ //循環(huán)查找空位置
 x = (rand() % N) + 1; //產生從1~N的隨機數(shù)
 srand((unsigned int)time(NULL));
 y = (rand() % N) + 1; //產生從1~N的隨機數(shù)
 srand((unsigned int)time(NULL));
 if (_ChessBoard[x][y] == ChessBoard){ //如果這個位置為空(沒有棋子),跳出循環(huán),下棋
 break;
 }
 }
 pos.row = x;
 pos.col = y;
 _ChessBoard[pos.row][pos.col] = flag;
 }

 void PlayChess(Position& pos, int player, char flag){
 PrintChessBoard(); //打印棋盤
 while (1){
 printf("請玩家%d輸入坐標:", player);
 cin >> pos.row >> pos.col;
 if (JudgeValue(pos) == 1){ //判斷坐標是否合法
 break;
 }
 cout << "坐標不合法,請重新輸入:" << endl;
 }
 _ChessBoard[pos.row][pos.col] = flag;
 }

 int JudgeValue(const Position& pos){ //判斷坐標的合法性
 //1.在棋盤上
 if (pos.row > 0 && pos.row <= N && pos.col > 0 && pos.col <= N){
 //2.所在位置為空(沒有棋子)
 if (_ChessBoard[pos.row][pos.col] == ChessBoard){
 return 1; //合法
 } 
 }
 return 0; //非法
 }

 int JudgeVictory(Position pos, char flag){ //判斷是否有玩家獲勝(底層判斷)
 int begin = 0;
 int end = 0;

 //1.判斷行是否滿足條件
 (pos.col - 4) > 0 ? begin = (pos.col - 4) : begin = 1;
 (pos.col + 4) > N ? end = N : end = (pos.col + 4);
 for (int i = pos.row, j = begin; j + 4 <= end; ++j){
 if (_ChessBoard[i][j] == flag && _ChessBoard[i][j + 1] == flag &&
 _ChessBoard[i][j + 2] == flag && _ChessBoard[i][j + 3] == flag &&
 _ChessBoard[i][j + 4] == flag)
 return 1;
 }
 //2.判斷列是否滿足條件
 (pos.row - 4) > 0 ? begin = (pos.row - 4) : begin = 1;
 (pos.row + 4) > N ? end = N : end = (pos.row + 4);
 for (int j = pos.col, i = begin ; i + 4 <= end; ++i){
 if (_ChessBoard[i][j] == flag && _ChessBoard[i + 1][j] == flag &&
 _ChessBoard[i + 2][j] == flag && _ChessBoard[i + 3][j] == flag &&
 _ChessBoard[i + 4][j] == flag)
 return 1;
 }
 //3.判斷主對角線是否滿足條件
 int len = 0; //相對長度
 int start = 0;
 int finish = 0;
 pos.row > pos.col ? len = pos.col - 1 : len = pos.row - 1;
 if (len > 4){
 len = 4;
 }
 begin = pos.row - len; //橫坐標起始位置
 start = pos.col - len; //縱坐標起始位置

 pos.row > pos.col ? len = N - pos.row : len = N - pos.col;
 if (len > 4){
 len = 4;
 }
 end = pos.row + len; //橫坐標結束位置
 finish = pos.col + len; //縱坐標結束位置

 for (int i = begin, j = start; (i + 4 <= end) && (j + 4 <= finish); ++i, ++j){
 if (_ChessBoard[i][j] == flag && _ChessBoard[i + 1][j + 1] == flag &&
 _ChessBoard[i + 2][j + 2] == flag && _ChessBoard[i + 3][j + 3] == flag &&
 _ChessBoard[i + 4][j + 4] == flag)
 return 1;
 }
 //4.判斷副對角線是否滿足條件
 (pos.row - 1) > (N - pos.col) ? len = N - pos.col : len = pos.row - 1;
 if (len > 4){
 len = 4;
 }
 begin = pos.row - len; //橫坐標起始位置
 start = pos.col + len; //縱坐標起始位置

 (N - pos.row) > (pos.col - 1) ? len = pos.col - 1 : len = N - pos.row;
 if (len > 4){
 len = 4;
 }
 end = pos.row + len; //橫坐標結束位置
 finish = pos.col - len; //縱坐標結束位置 
 for (int i = begin, j = start; (i + 4 <= end) && (j - 4 >= finish); ++i, --j){
 if (_ChessBoard[i][j] == flag && _ChessBoard[i + 1][j - 1] == flag &&
 _ChessBoard[i + 2][j - 2] == flag && _ChessBoard[i + 3][j - 3] == flag &&
 _ChessBoard[i + 4][j - 4] == flag)
 return 1;
 }
 //該位置并未下棋
 for (int x = 1; x < N + 1; ++x){
 for (int y = 1; y < N + 1; ++y){
 if (_ChessBoard[x][y] == ChessBoard){
 return 0; //未下棋
 }
 }
 }
 return -1; //和局
 }

 bool GetVictory(Position& pos, int player, char flag){ //判斷具體哪位玩家贏
 if (JudgeVictory(pos, flag) != 0){ //判斷有無人獲勝
 if (JudgeVictory(pos, flag) == 1){ //判斷是否有人獲勝,1表示獲勝
 PrintChessBoard(); //打印棋盤
 if (player == 0){
 cout << "電腦獲勝!" << endl;
 }
 else{
 printf("恭喜玩家%d獲勝!\n", player);
 }
 }
 else{
 printf("和局!\n");
 }
 return true; //有人獲勝
 } 
 return false; //沒人獲勝
 }

private:
 char _ChessBoard[N + 1][N + 1]; //棋盤
};

int main(){
 GoBang g;
 g.Play();
 system("pause");
 return 0;
}

更多有趣的經(jīng)典小游戲實現(xiàn)專題,分享給大家:

C++經(jīng)典小游戲匯總

python經(jīng)典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經(jīng)典游戲 玩不停

javascript經(jīng)典小游戲匯總

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 關于C語言中的指針與二維數(shù)組

    關于C語言中的指針與二維數(shù)組

    這篇文章主要介紹了關于C語言中的指針與二維數(shù)組,C語言中,指針是一個復雜但又靈活多變的知識點,我們知道,在一維數(shù)組中,對于一個數(shù)組a[],*a,a,&a,都表示a的首地址,但如果與二維數(shù)組混合使用,就顯得更為復雜了,需要的朋友可以參考下
    2023-07-07
  • C++中防止頭文件重復包含的幾種方法

    C++中防止頭文件重復包含的幾種方法

    在 C/C++ 編程中,當一個項目比較大時,往往都是分文件,這時候有可能不小心把同一個頭文件 include 多次,或者頭文件嵌套包含,這些會導致一系列的問題,如符號重定義、編譯錯誤等,因此,防止頭文件的重復包含是至關重要的,本文給大家介紹了C++中防止頭文件重復包含的兩種方法
    2024-05-05
  • C語言植物大戰(zhàn)數(shù)據(jù)結構快速排序圖文示例

    C語言植物大戰(zhàn)數(shù)據(jù)結構快速排序圖文示例

    這篇文章主要為大家介紹了C語言植物大戰(zhàn)數(shù)據(jù)結構快速排序圖文示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 詳解C語言中strpbrk()函數(shù)的用法

    詳解C語言中strpbrk()函數(shù)的用法

    這篇文章主要介紹了詳解C語言中strpbrk()函數(shù)的用法,是C語言入門學習中的基礎知識,需要的朋友可以參考下
    2015-08-08
  • C語言數(shù)據(jù)結構之Hash散列表

    C語言數(shù)據(jù)結構之Hash散列表

    這篇文章主要介紹了C語言數(shù)據(jù)結構之Hash散列表,散列表(哈希表)其思想主要是基于數(shù)組支持按照下標隨機訪問數(shù)據(jù),時間復雜度為O(1)的特性,可以說是數(shù)組的一種拓展,需要的朋友可以參考下
    2023-08-08
  • C++實現(xiàn)LeetCode(48.旋轉圖像)

    C++實現(xiàn)LeetCode(48.旋轉圖像)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(48.旋轉圖像),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • C++模擬Linux Shell編寫一個自定義命令

    C++模擬Linux Shell編寫一個自定義命令

    這篇文章主要介紹了C++如何模擬Linux Shell實現(xiàn)編寫一個自定義命令,本文通過實例代碼進行命令行解析,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • Qt5代碼移植到Qt6的實現(xiàn)

    Qt5代碼移植到Qt6的實現(xiàn)

    本文主要介紹了Qt5代碼移植到Qt6的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • C語言算術運算符整理

    C語言算術運算符整理

    算術運算符用于各類數(shù)值運算,包括加(+)、減(-)、乘(*)、除(/)、求余(或稱模運算,%)、自增(++)、自減(--)共七種
    2023-03-03
  • C語言頭文件<string.h>函數(shù)詳解

    C語言頭文件<string.h>函數(shù)詳解

    本文主要介紹了C語言頭文件<string.h>函數(shù)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07

最新評論