激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++面向對象實現五子棋小游戲

C++面向對象實現五子棋小游戲

2021-02-24 14:38C++教程網 C/C++

本文介紹了如何運用面向對象思想進行五子棋游戲的設計與開發,與面向過程程序設計比較,面向對象程序設計更易于實現對現實世界的描述,提高軟件的擴展性和可維護性。附上最終的程序源碼,推薦給大家,有需要的小伙伴可以參

盡量將面向對象的思想融入進程序中

ChessBoard.h

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//ChessBoard.h
#pragma once
#define ROW 15
#define COL 15
#include<iostream>
using namespace std;
 
class ChessBoard//棋盤類
{
public:
  char m_cSquare[ROW][COL]; 
public:
  ChessBoard();
  void show(); 
};

ChessBoard.cpp

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//ChessBoard.cpp
#include"ChessBoard.h"
 
ChessBoard::ChessBoard() 
  for(int i=1;i<ROW-1;i++)
    for(int j=1;j<COL-1;j++)
      m_cSquare[i][j]=' ';
  for(int j=0;j<COL;j++)
    m_cSquare[0][j]=m_cSquare[ROW-1][j]='-';
  for(int i=1;i<ROW;i++)
    m_cSquare[i][0]=m_cSquare[i][COL-1]='|'
}
 
void ChessBoard::show()
{
  system("cls");
  for(int i=0;i<ROW;i++)
  for(int j=0;j<COL;j++)
      cout<<m_cSquare[i][j]<<' ';//這里的“ <<' ' ”很重要,這樣才能使屏幕上ROW*COL輸出為方形
    cout<<endl;
  }
}

Player.h

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//Player.h
#pragma once
//宏定義四種檢測五子是否連成線的方向
#define HORIZON     0
#define VERTICAL      1
#define LEFTBOTTOMTORIGHTTOP  2
#define LEFTTOPTORIGHTBOTTOM  3
 
#include"ChessBoard.h"
#include<iostream>
using namespace std;
#include<string>
 
class Player
{
private:
  string m_name;
  char m_chessType;
  int m_x;
  int m_y;
  ChessBoard* m_ptBoard;
public:
  Player(string name,char chessType):m_name(name),m_chessType(chessType),m_ptBoard(NULL){}
  void attachToBoard(ChessBoard* ptBoard){m_ptBoard=ptBoard;}
  bool isInChessBoard(int x,int y);
  bool isLine(int x,int y);
  bool isWin();
  void setChess();
};

Player.cpp

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//Player.cpp
#include"Player.h"
 
bool Player::isInChessBoard(int x,int y)
{
  if(x<ROW-1 && x>0 && y<COL-1 && y>0)
    return true;
  else
    return false;
}
/*下面是核心代碼:如何判斷五子是否連成線。
這里采用的是以玩家此刻放下的棋子為中心,從四種方向逐個判斷是否在此方向上連成了線
這里將四個方向上的判斷都放在一起,避免了四次調用不同方向上的判斷,
但在for里面放一個switch有些別扭,可讀性上似乎不好*/
bool Player::isLine(int x,int y)
{
  for(int direc=HORIZON;direc<=LEFTTOPTORIGHTBOTTOM;direc++)//四個方向,權宜之計
  {
    int tempX,tempY,cnt=1;//cnt:連續排列的同種類的棋子的個數,達到五個則該方贏
    for(int i=-4;i<=4;i++)
    {
      if(i==0)continue;//此時循環一遍相當于什么都沒做
      switch(direc)
      {
      case HORIZON:
        tempX=x;  tempY=y+i;   break;
      case VERTICAL:
        tempX=x+i; tempY=y;    break;
      case LEFTBOTTOMTORIGHTTOP:
        tempX=x-i; tempY=y+i;   break;
      case LEFTTOPTORIGHTBOTTOM:
        tempX=x+i; tempY=y+i;   break;
      }
      if(isInChessBoard(tempX,tempY) && m_ptBoard->m_cSquare[tempX][tempY]==m_chessType)
        cnt++;
      else
        cnt=0;
      if(cnt==5)//五子成線
        return true;
    }
  }return false;
}
 
void Player::setChess()
  cout<<"請輸入玩家"<<m_name<<"的x坐標和y坐標:"<<endl;
  cin>>m_x>>m_y;
  while(cin.fail() || m_ptBoard->m_cSquare[m_x][m_y]!=' ')//輸入不是int型變量或者此位置上已有棋子
  {
    cout<<"輸入有誤,請再次輸入玩家"<<m_name<<"的x坐標和y坐標:"<<endl;
    cin.clear();  //清除fail狀態
    cin.sync();  //清除緩沖區
    cin>>m_x>>m_y;
  }
  if(isInChessBoard(m_x,m_y))
    m_ptBoard->m_cSquare[m_x][m_y]=m_chessType;
}
 
bool Player::isWin()
  return isLine(m_x,m_y)?true:false;
}

main.cpp

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//main.cpp
#include"ChessBoard.h"
#include"Player.h"
 
int main()
{
  ChessBoard board; 
  Player playA("aaa",'*');//玩家aaa的棋子形狀是'*'
  playA.attachToBoard(&board);
  Player playB("bbb",'#');//玩家bbb的棋子形狀是'#'
  playB.attachToBoard(&board); 
  board.show();
  while(1)
  {
    playA.setChess();//玩家A放下一個棋子
    if(playA.isWin())
    {  cout<<"Winer!"; break;}   
    board.show();
 
    playB.setChess();//玩家B放下一個棋子
    if(playB.isWin())
    {  cout<<"Winer!"; break;} 
    board.show();
  }
  return 1;
}

以上所述就是本文的全部內容了,希望能夠對大家熟練掌握C++有所幫助。

延伸 · 閱讀

精彩推薦
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
主站蜘蛛池模板: 黄色网址入口 | 日本欧美视频 | 久久蜜桃香蕉精品一区二区三区 | 国内精品久久久久久影视8 国产一区二区成人在线 | 久久黄色影院 | 黄色视频一级毛片 | 亚洲精品有限 | www.国产免费 | 涩涩操| 久久av电影院 | 亚洲第一页夜 | 国产一区二区三区四区波多野结衣 | 欧美一级美国一级 | 精品国产一区二区亚洲人成毛片 | 国产啊v在线观看 | 亚洲影视中文字幕 | 激情小说另类 | 国产精品成人久久久久a级 男女无遮挡羞羞视频 | 91精品国产综合久久婷婷香蕉 | 97中文字幕第一一一页 | 被啪羞羞视频在线观看 | 3344永久免费 | 韩国精品视频在线观看 | 久久精品一级片 | 97人操 | 欧美一级黄色影院 | 日韩在线观看视频网站 | 国产三级在线观看a | 大片毛片 | 久久国产精品久久精品国产演员表 | 美女色影院 | 中文字幕在线观看www | 国产一区二区亚洲 | 看免费5xxaaa毛片 | av色在线观看 | 国产成人综合在线视频 | 久久久精品精品 | 中国av中文字幕 | 99精品视频在线导航 | 国产一级大片 | 国产一级片91|