⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reversiform.cpp

📁 MONA是为数不多的C++语言编写的一个很小的操作系统
💻 CPP
字号:
// This file's encoding is UTF-8.#include <gui/System/Console.h>#include <gui/System/Mona/Forms/Application.h>#include <gui/System/Mona/Forms/Button.h>#include <gui/System/Mona/Forms/Label.h>#include <gui/System/Mona/Forms/Form.h>#include "Piece.h"#include "ReversiBoard.h"using namespace System;using namespace System::Drawing;using namespace System::Mona::Forms;#define PIECE_SIZE 25#define BOARD_SIZE (PIECE_SIZE * 8)class ReversiForm : public Form, public MonAPI::Observer{private:    _A<_A<_P<Piece> > > pieces;    _P<Button> button1;    _P<Label> label1, label2, label3, label4;    _P<ReversiBoard> board;public:    ReversiForm(_P<Bitmap> white, _P<Bitmap> black)    {        this->InitializeComponent();        board.Set(new ReversiBoard(), true);        board->addObserver(this);        this->button1->add_Click(new EventHandler<ReversiForm>(this, &ReversiForm::button1_Click));        // 描画用盤面初期化        this->pieces.Alloc(8);        for (int x = 0; x < 8; x++)        {            this->pieces[x].Alloc(8);            for (int y = 0; y < 8; y++)            {                this->pieces[x][y] = new Piece(board->getPiece(x, y), x, y, white, black);                this->pieces[x][y]->set_Bounds(Rectangle(x * PIECE_SIZE, y * PIECE_SIZE, PIECE_SIZE, PIECE_SIZE));                this->pieces[x][y]->add_Click(new EventHandler<ReversiForm>(this, &ReversiForm::piece_Click));                this->get_Controls()->Add(this->pieces[x][y].get());            }        }        refreshLables();    }private:    void InitializeComponent()    {        // Form        this->set_Location(::System::Drawing::Point(20, 64));        this->set_ClientSize(Size(BOARD_SIZE, BOARD_SIZE + 20));        this->set_Text("Reversi");        // ボタン        this->button1 = new Button();        this->button1->set_Bounds(Rectangle(0, BOARD_SIZE + 2, 50, 16));        this->button1->set_Text("reset");        this->get_Controls()->Add(this->button1.get());        // ラベル        this->label1 = new Label();        this->label2 = new Label();        this->label3 = new Label();        this->label4 = new Label();        this->label1->set_Bounds(Rectangle( 60, BOARD_SIZE + 2, 40, 16));        this->label2->set_Bounds(Rectangle(105, BOARD_SIZE + 2, 20, 16));        this->label3->set_Bounds(Rectangle(130, BOARD_SIZE + 2, 40, 16));        this->label4->set_Bounds(Rectangle(175, BOARD_SIZE + 2, 20, 16));        this->label1->set_Text("  red");        this->label2->set_Text("0");        this->label3->set_Text(" white");        this->label4->set_Text("0");        this->get_Controls()->Add(this->label1.get());        this->get_Controls()->Add(this->label2.get());        this->get_Controls()->Add(this->label3.get());        this->get_Controls()->Add(this->label4.get());    }    void refreshLables()    {        switch (this->board->getCurrentHand())        {            case ReversiBoard::BLACK:                this->label1->set_ForeColor(Color::get_White());                this->label1->set_BackColor(Color::get_Blue());                this->label3->set_ForeColor(this->get_ForeColor());                this->label3->set_BackColor(this->get_BackColor());                break;            case ReversiBoard::WHITE:                this->label1->set_ForeColor(this->get_ForeColor());                this->label1->set_BackColor(this->get_BackColor());                this->label3->set_ForeColor(Color::get_White());                this->label3->set_BackColor(Color::get_Blue());                break;        }        int black = 0, white = 0;        for (int y = 0; y < 8; y++)        {            for (int x = 0; x < 8; x++)            {                switch (this->board->getPiece(x, y))                {                    case ReversiBoard::BLACK:                        black++;                        break;                    case ReversiBoard::WHITE:                        white++;                        break;                }            }        }        char buf[16];        sprintf(buf, "%d", black);        this->label2->set_Text(buf);        sprintf(buf, "%d", white);        this->label4->set_Text(buf);    }    void button1_Click(Pointer<Object> sender, Pointer<EventArgs> e)    {        board->resetBoard();        refreshLables();    }    void piece_Click(Pointer<Object> sender, Pointer<EventArgs> e)    {        _P<Piece> p = sender.get();        int x = p->GetX();        int y = p->GetY();        // 範囲チェック        if (!board->checkRange(x, y))        {            return;        }        // 現在のプレイヤーがこまをおく        int current = board->getCurrentHand();        if (!(board->setPiece(x, y, current)))        {            return;        }        // ひっくり返されるこまを一枚ずつ描画        while (board->existNotReversedPieces())        {            board->reverseNext();        }        board->setNextHand();        refreshLables();    }    void update(MonAPI::Observable* o, void* e)    {        if (e == NULL)        {            for (int x = 0; x < 8; x++)            {                for (int y = 0; y < 8; y++)                {                    this->pieces[x][y]->SetState(this->board->getPiece(x, y));                }            }        }        else        {            Point2D* point = (::Point2D*)e;            int x = point->x;            int y = point->y;            this->pieces[x][y]->SetState(this->board->getPiece(x, y));            sleep(100);        }    }public:    static void Main(Array<String> args)    {        String bundlePath = MonAPI::System::getBundlePath();        _P<Bitmap> bitmapWhite = new Bitmap(bundlePath + "/WHITE.BMP");        _P<Bitmap> bitmapBlack = new Bitmap(bundlePath + "/RED.BMP");        if (bitmapBlack->get() == NULL || bitmapWhite->get() == NULL)        {            Console::WriteLine("Can not open resource file!");            return;        }        Application::Run(new ReversiForm(bitmapWhite, bitmapBlack));    }};SET_MAIN_CLASS(ReversiForm)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -