亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? views.cpp

?? c+++ game uploading now
?? CPP
字號:
/**
 @file
 Implements the View part of the Model-View-Controller pattern.
*/

#include <sstream>
#include "Views.h"
#include "lib/File.h"
#include "model/MoveListGenerator.h"
#include "model/MoveExecuter.h"

using namespace Win;
using namespace Othello;


BoardView::BoardView(HWND parentHWND)
    : SimpleControl(parentHWND, IDS_BOARD_PANE),
      _possbrush(RGB(0, 83, 166)),
      _emptybrush(RGB(0, 64, 128)),
      _hintbrush(RGB(255, 64, 128)),
      _bpiece1(RGB(35, 35, 35)),
      _ppiece1(RGB(35, 35, 35)),  
      _bpiece2(RGB(209, 209, 209)),
      _ppiece2(RGB(209, 209, 209))
{
    InitBoards();
}


void BoardView::InitBoards()
{
    _board.InitBoard();
    _game_over=false;
    _double_move=false;
    MoveEnumerator emptymarker(_board);
    UpdateCanvas canvas(_hWnd);
    Init(canvas);
}

void BoardView::Init(Canvas &canvas)
{
    const ClientRect& _rect=Rect();
    _buffer.CreateCompatible(canvas, _rect.right-_rect.left, 
                                     _rect.bottom-_rect.top);
    BitmapCanvas bmpcanvas(canvas, _buffer);
    int dx=(_rect.right-_rect.left)/8;
    int dy=(_rect.bottom-_rect.top)/8;
    RECT rect;
    for(int x=0; x<8; x++)
        for(int y=0; y<8; y++)
        {         
            //RECT(left,top,right,bottom)
            int position=TTBoard::AntiPersil[x*8+y];
            ::SetRect(&rect,x*dx,y*dy,(x+1)*dx,(y+1)*dy);
            switch(_board.table[position])
            {
            case _gui__possible:
                bmpcanvas.FillRect(rect, _possbrush);
                break;
            case _gui__hint:
                bmpcanvas.FillRect(rect, _hintbrush);
                break;
            case empty:
            case black:
            case white:
                bmpcanvas.FillRect(rect, _emptybrush);
                break;
            }
            
            if(_board.table[position]==black)
            {
                BrushHolder brhold(bmpcanvas, _bpiece1);
                PenHolder pnhold(bmpcanvas, _ppiece1);
                bmpcanvas.Ellipse(dx*x+5, dx*y+5, dx*(x+1)-5, dx*(y+1)-5);
            }
            if(_board.table[position]==white)
            {
                BrushHolder brhold(bmpcanvas, _bpiece2);
                PenHolder pnhold(bmpcanvas, _ppiece2);
                bmpcanvas.Ellipse(dx*x+5, dx*y+5, dx*(x+1)-5, dx*(y+1)-5);
            }
        }

    for(int i=1; i<=8; i++)
    {
        bmpcanvas.Line(i*dx, _rect.top, i*dx, _rect.bottom);
        bmpcanvas.Line(_rect.left, i*dy, _rect.right, i*dy);
    }
}

void BoardView::Hinted(int move)
{
    for(unsigned int i=p11; i<s89; i++)
        if(_board.table[i]==_gui__hint)
            _board.table[i]=_gui__possible;

    _board.table[move]=_gui__hint;
    UpdateCanvas canvas(_hWnd);
    Init(canvas);
    InvalidateOnParent();
}

void BoardView::Paint(Canvas &canvas)
{
    Blitter blitter(_buffer);
    blitter.BlitTo(canvas);
}

void BoardView::PixelToBoard(POINT &point)
{
    const ClientRect& _rect=Rect();
    int dx=(_rect.right-_rect.left)/8;
    int dy=(_rect.bottom-_rect.top)/8;
    point.x/=dx;
    point.y/=dy;
    point.x++;
    point.y++;
}


void BoardView::Clean()
{  
    for(unsigned int i=p11; i<s89; i++)
        switch(_board.table[i])
        {
        case black:
        case empty:
        case white:
        case sentl:
            break;
        default:
            _board.table[i]=empty;
            break;
    }
}

bool BoardView::IsGameOver()
{
    return _game_over; 
} 

//places the users piece at (x,y) returns true if is legal
//false if not
bool BoardView::PutPiece(int x,int y, squarevalue player)
{
    
    int position=TTBoard::AntiPersil[(x-1)*8+y-1];
    //if not legal then return false
    if(_board.table[position]!=_gui__possible &&
       _board.table[position]!=_gui__hint)
        return false;

    //this is a legal move so we are going to repaint the board
    UpdateCanvas canvas(_hWnd);

    //clean the board, get rid of _gui_ stuff
    Clean();

    //execute the move on my private board
    GuiMoveExecuter(_board, position);

    //generate movepossibilities for the computer
    //NOTE this is done only for the gui
    MoveEnumerator moves(_board);
    
    //if we found some moves, then return and let the computer think
    if(!moves.Empty())
    {
        _double_move=false;
        _game_over=false; //???
        Init(canvas);
        return true;
    }

    //clean the board, get rid of _gui_ stuff
    Clean();

    //nop we found no moves for computer that means that is still our turn!
    //so generate moves
    _board.isblacksturn=!_board.isblacksturn;
    MoveEnumerator moves2(_board);
            
    //if we did not found any that means that the game is over, before the
    //last square was played.
    if(moves2.Empty())
    {
        _game_over=true;
        _double_move=false; //???
        Init(canvas);
        return true;
    }

    //we have a double move 
    _double_move=true;
    _game_over=false; //????
    Init(canvas);
    //Paint(canvas);
    return true;
}

void BoardView::Get(Board &board)
{
    //update board
    _board=board;
    MoveEnumerator moves(_board);
    if(moves.Empty())
    {
        _game_over=true;
        _double_move=false; //???
    }
    //(re)initialize view
    UpdateCanvas canvas(_hWnd);
    Init(canvas);
}

void BoardView::SendTo(Board &board)
{
    for(unsigned int i=p11; i<s89; i++)
        if(_board.table[i]==_gui__possible||_board.table[i]==_gui__hint)
            board.table[i]=empty;
        else 
            board.table[i]=_board.table[i];

    board.isblacksturn=_board.isblacksturn;
    UpdateCanvas canvas(_hWnd);
    Init(canvas);
}

void BoardView::SaveToFile(PSTR filename)
{
    
    // sizeof("White")==sizeof("Black")
    char buffer[8*8+sizeof("Black")];
     
    for(int x=p11; x<s89; x++)
        switch(_board.table[x])
        {
            case empty:
            case _gui__possible:
            case _gui__hint:
                buffer[TTBoard::Persil[x]]='-';
                break;
            case black:
                buffer[TTBoard::Persil[x]]='X';
                break;
            case white:
                buffer[TTBoard::Persil[x]]='O';
                break;
        }
            
    if(_board.isblacksturn)
        strcpy(buffer+8*8,"Black");
    else
        strcpy(buffer+8*8,"White");

    File ofile(filename, File::write);
    ofile.Write(buffer);
}


bool BoardView::LoadFromFile(PSTR filename, Board &tmp)
{
    //sizeof("White")==sizeof("Black")
    char buffer[8*8+sizeof("Black")];
    ::ZeroMemory(buffer,8*8+sizeof("Black"));

    File ifile(filename, File::read);
    ifile.Read(buffer, sizeof(buffer));

    if(strlen(buffer) != sizeof(buffer)-1)
        return false;
    int empties=0;
    int blacks=0;
    for(int i=0; i<8*8; i++)
        switch(buffer[i])
        {
            case '-':
                tmp.table[TTBoard::AntiPersil[i]]=empty;
                empties++;
                break;
            case 'X':
                tmp.table[TTBoard::AntiPersil[i]]=black;
                blacks++;
                break;
            case 'O':
                tmp.table[TTBoard::AntiPersil[i]]=white;
                break;
            default:
                return false;
        }
    
    switch(buffer[8*8])
    {
        case 'B':
            tmp.isblacksturn=true;
            break;
        case 'W':
            tmp.isblacksturn=false;
            break;
        default:
            return false;
    }
    tmp.empties=empties;
    tmp.blacks=blacks;
    return true;
}


InfoView::InfoView(HWND parentHWND, 
                   bool &isUsersTurn, 
                   bool &isGameStarted, 
                   bool &isUserBlack,
                   bool &isGameOver)
    : SimpleControl(parentHWND,IDC_INFO_PANEL),
      _isUsersTurn(isUsersTurn), 
      _isGameStarted(isGameStarted),
      _isUserBlack(isUserBlack),
      _isGameOver(isGameOver),
      _pnrmoves(NULL)
{
    Clean();
    UpdateBuffer();
}


void InfoView::Clean()
{
    _gamevalue=0;
    _bestMove=-1;
    _posSearched=0;
    _ttHits=0;
    _ttGHits=0;
    _depth=0;
    _moves=NULL; 
    if(_pnrmoves!=NULL)
        *_pnrmoves=0;
    _inBook=true;
    _timedOut=false;
}

void InfoView::LookInside(Thinker &model)
{
    _gamevalue=model.gamevalue;
    _bestMove=model.bestMove;
    _posSearched=model.posSearched;
    _ttHits=model.ttHits;
    _ttGHits=model.ttGHits;
    _depth=model.IdDepth;
    _moves=model.moves;    //overkill
    _pnrmoves= &model.nrMoves;//overkill
    _timedOut=model.timedout;
    _inBook=!model.OutOfBook();
    if(!_isUsersTurn)
        _mseconds=model.MSecRemaining();
    UpdateBuffer();
}

char *InfoView::_msgShylockIsThinking="Shylock is thinking";
char *InfoView::_msgYourTurn="Your turn";
char *InfoView::_msgBestMove="best move: ";
char *InfoView::_msgDepth="depth: ";
char *InfoView::_msgGameValue="game value: ";
char *InfoView::_msgNodes="nodes: ";
char *InfoView::_msgTTHits="ttable hits: ";
char *InfoView::_msgMoves="history: ";
char *InfoView::_msgTime="time: ";
char *InfoView::_msgTimedOut="Timed out!";
char *InfoView::_msgGameOver="Game over!";
char *InfoView::_msgFromBook="In book!";

void InfoView::Paint(Canvas &canvas)
{
    Blitter blitter(_buffer);
    blitter.BlitTo(canvas);
}

void InfoView::UpdateBuffer()
{
    //TODO clean up this mess!

    UpdateCanvas canvas(Hwnd());

    ClientRect& _rect=Rect();

    _buffer.CreateCompatible(canvas, _rect.right-_rect.left, 
                                     _rect.bottom-_rect.top);

    BitmapCanvas bmpcanvas(canvas, _buffer);

    bmpcanvas.WhiteWash(_rect);
    bmpcanvas.SetTextColor(RGB(0, 0, 128));
    bmpcanvas.SetBkrndColor(RGB(255, 255, 255));

    std::stringstream out;

    if(_isGameStarted || _isGameOver)
    {
        if(!_isGameOver)
        {
            if(_isUsersTurn)
                out<<_msgYourTurn;
            else
                out<<_msgShylockIsThinking;
        }
        else 
            out<<_msgGameOver;
        
        if(!_timedOut)
        {
            if(!_isUsersTurn)
            {
                unsigned int tmp=_mseconds / 1000;
                unsigned int sec_part=tmp % 60;
                unsigned int min_part=tmp / 60;
                out<<std::endl<<_msgTime<<min_part<<":";
                out.fill('0'); out.width(2); out<<sec_part;
                out.width(0);
            }
        }
        else
            out<<std::endl<<_msgTimedOut;
        
        if(!_inBook)
        {
            out<<std::endl<<"game value: ";
            if(_gamevalue>63)
                out<<_gamevalue-63<<"!";
            else
                if(_gamevalue<-63)
                    out<<_gamevalue+63<<"!";
                else
                    out<<_gamevalue;
            out<<std::endl;

            if(!_isGameOver)
            {

                if(!_isUsersTurn && _bestMove!=-1)
                {
                    assert(SquareNames[_bestMove]!=NULL);
                    out<<_msgBestMove<<SquareNames[_bestMove]<<std::endl;
                }
        
                out<<_msgDepth<<_depth<<std::endl;

                out<<_msgNodes<<_posSearched<<std::endl;

                out<<_msgTTHits<<_ttHits<<std::endl;

                out<<"ttghits: "<<_ttGHits<<std::endl;

                if(double(_ttHits)!=0)
                    out<<"r="<<double(_posSearched)/double(_ttHits)<<std::endl;

                if(double(_ttGHits)!=0)
                    out<<"rg="<<double(_posSearched)/double(_ttGHits)<<std::endl;
            }
        }
        else
            out<<std::endl<<_msgFromBook<<std::endl;    

        if(_moves!=NULL && *_pnrmoves!=0)
        {
            out<<_msgMoves;
            for(int i=0; i< *_pnrmoves; i++)
            {
                assert(SquareNames[_moves[i].x]!=NULL);
                out<<(_moves[i].isblack?"+":"-")
                   <<SquareNames[_moves[i].x]<<" ";
            }
            out<<std::endl;
        }
    }

    bmpcanvas.Text(out.str().c_str(), _rect, 
                   DT_EDITCONTROL|DT_LEFT|DT_WORDBREAK|
                   DT_EXPANDTABS|DT_TABSTOP|0x00000400);
}


void InfoView::SaveGameToFile(PSTR filename)
{
    std::stringstream out;
    for(int i=0; i< *_pnrmoves; i++)
    {
        assert(SquareNames[_moves[i].x]!=NULL);
        out<<(_moves[i].isblack?"+":"-")
           <<SquareNames[_moves[i].x]<<" ";
    }
    out<<std::endl;
    File ofile(filename, File::write);
    ofile.Write(out.str().c_str());
}

char* InfoView::SquareNames[10*10]=
{
    NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
    NULL,"a1","a2","a3","a4","a5","a6","a7","a8",NULL,
    NULL,"b1","b2","b3","b4","b5","b6","b7","b8",NULL,
    NULL,"c1","c2","c3","c4","c5","c6","c7","c8",NULL,
    NULL,"d1","d2","d3","d4","d5","d6","d7","d8",NULL,
    NULL,"e1","e2","e3","e4","e5","e6","e7","e8",NULL,
    NULL,"f1","f2","f3","f4","f5","f6","f7","f8",NULL,
    NULL,"g1","g2","g3","g4","g5","g6","g7","g8",NULL,
    NULL,"h1","h2","h3","h4","h5","h6","h7","h8",NULL,
    NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费高清视频在线观看| 欧美zozo另类异族| 久久欧美一区二区| 亚洲超碰97人人做人人爱| 国产一区二区久久| 欧美丰满少妇xxxxx高潮对白| 91精品国产综合久久蜜臀| 一区二区三区在线高清| 99久久精品国产导航| 国产精品少妇自拍| 国产xxx精品视频大全| 国产三级精品在线| 成人午夜电影小说| 国产精品亲子乱子伦xxxx裸| 东方aⅴ免费观看久久av| 国产亚洲综合av| 懂色一区二区三区免费观看| 中文字幕一区二区视频| 白白色亚洲国产精品| 亚洲精品中文在线影院| 欧亚一区二区三区| 五月综合激情网| 日韩一区二区三区免费看| 蜜臀精品久久久久久蜜臀| 欧美电影免费观看高清完整版在线| 男男视频亚洲欧美| 久久久久久亚洲综合| av资源网一区| 性做久久久久久久久| 久久九九全国免费| 91福利在线观看| 久久av资源站| 亚洲最大成人网4388xx| 欧美不卡一区二区三区四区| 成人黄色av网站在线| 亚洲成av人片一区二区梦乃| 欧美精品一区男女天堂| 日本道在线观看一区二区| 综合久久综合久久| 欧美xingq一区二区| 国产中文字幕精品| 亚洲视频 欧洲视频| 精品国产乱码久久久久久久| 91麻豆国产自产在线观看| 国产尤物一区二区在线| 日韩va欧美va亚洲va久久| 亚洲婷婷综合色高清在线| 久久久久久亚洲综合| 日韩一区二区在线看片| 成人性生交大片| 乱中年女人伦av一区二区| 亚洲国产日韩综合久久精品| 综合分类小说区另类春色亚洲小说欧美| 91精品在线一区二区| 欧美日韩免费一区二区三区| 91麻豆swag| 欧美亚洲国产怡红院影院| 成人黄色小视频在线观看| 国产99精品国产| 国产成人精品一区二区三区四区| 久久99国产精品麻豆| 麻豆精品新av中文字幕| 另类小说综合欧美亚洲| 中文字幕一区二区三中文字幕| 久久久久久久久久久电影| 欧美一卡二卡在线观看| 88在线观看91蜜桃国自产| 欧美色偷偷大香| 色欧美乱欧美15图片| 欧美亚洲国产怡红院影院| 欧美一区二区三区影视| 色就色 综合激情| 99国产精品久久久久久久久久久 | 亚洲国产综合在线| 免费视频一区二区| 国产曰批免费观看久久久| 成人av资源下载| 欧美日韩亚洲综合一区二区三区| 91精品91久久久中77777| 欧美精品久久99久久在免费线 | 91视频在线观看| 99精品久久免费看蜜臀剧情介绍| 99精品国产99久久久久久白柏| 欧美写真视频网站| 欧美精品一区二区三区很污很色的| 亚洲国产岛国毛片在线| 亚洲第一在线综合网站| 国产成人h网站| 欧美日韩二区三区| 国产精品久久久久久久久久久免费看 | 日韩西西人体444www| 国产精品三级av| 麻豆高清免费国产一区| 成人美女在线观看| 精品成人一区二区| 日韩精品1区2区3区| 成人夜色视频网站在线观看| 91小视频免费看| 久久无码av三级| 轻轻草成人在线| 日韩三级视频在线看| 日韩av一级片| 欧美区一区二区三区| 一区二区三区四区av| 成人18精品视频| 亚洲图片激情小说| 99久久久国产精品免费蜜臀| 亚洲三级在线观看| 91国产视频在线观看| 亚洲女性喷水在线观看一区| 99久久精品免费观看| 中文字幕一区av| 91久久精品网| 丝袜美腿亚洲一区二区图片| 欧美剧在线免费观看网站 | 欧美日韩在线亚洲一区蜜芽| 亚洲欧美在线另类| 91精品91久久久中77777| 日韩美女视频一区二区| 91黄色激情网站| 国产精品久久久久7777按摩| 99久久综合精品| 欧美国产精品中文字幕| 国产精品一区二区男女羞羞无遮挡| 久久精品视频免费| 9i看片成人免费高清| 午夜一区二区三区视频| 日韩一区二区三区免费观看| 国产一区福利在线| 亚洲免费看黄网站| 日韩一区二区电影| 成人精品视频一区二区三区尤物| 亚洲激情六月丁香| 日韩一区二区三免费高清| 成人午夜看片网址| 天天操天天色综合| 国产女同互慰高潮91漫画| 欧美又粗又大又爽| 国产麻豆成人传媒免费观看| 伊人色综合久久天天人手人婷| 欧美tk—视频vk| 欧美午夜电影一区| 97久久久精品综合88久久| 日韩成人一区二区| 一区二区三区波多野结衣在线观看| 欧美久久久一区| 色综合久久中文综合久久97| 国产精品综合一区二区| 久久精品国内一区二区三区| 一二三区精品福利视频| 国产精品色婷婷久久58| 精品三级av在线| 精品视频1区2区3区| 99国产欧美另类久久久精品| 高清久久久久久| 国产福利一区在线| 国产一区二区福利| 国产精品自产自拍| 国产成a人亚洲| 成人国产精品视频| www.日韩在线| 色婷婷综合五月| 97se亚洲国产综合在线| 成人动漫一区二区三区| 9i在线看片成人免费| 色嗨嗨av一区二区三区| 欧美亚洲综合久久| 制服丝袜中文字幕一区| 欧美一区二区视频在线观看2022| 欧美日韩久久一区| 欧美成人欧美edvon| 国产日韩欧美亚洲| 亚洲综合激情另类小说区| 午夜影院在线观看欧美| 国产精品自在在线| 91丨九色丨蝌蚪富婆spa| 91麻豆精品久久久久蜜臀| 国产视频亚洲色图| 一区二区三区中文免费| 日本sm残虐另类| 福利一区福利二区| 99久久精品免费看| 51精品视频一区二区三区| 国产精品久久三| 美女一区二区三区在线观看| 99久久国产免费看| 精品国产一区久久| 丝袜国产日韩另类美女| 成人免费电影视频| 久久久久久久综合日本| 婷婷成人综合网| 91黄色免费版| 中文字幕在线观看一区| 狠狠色丁香久久婷婷综合丁香| 色欧美88888久久久久久影院| 久久精品人人做人人综合| 午夜精品久久久久久久久久| 成人免费视频一区二区| 国产精品久久久久久久久搜平片 | 亚洲影视在线播放|