五子棋小游戲

前言:

最近在園子里看見別人寫的一篇文章赫段,做的一個小游戲,但是只能在一個方向?qū)崿F(xiàn)五顆棋子連珠奠旺,帶著強(qiáng)烈的興趣宦棺,自己實(shí)現(xiàn)了一下,所有方向都沒有問題了

概述:
  • 環(huán)境:Android Studio 3.42
  • 語言:Java
  • 特點(diǎn):簡單箕戳,易懂某残,效果爆炸
展示:
image.png
image.png

原理:首先創(chuàng)建一個自定義五子棋的視圖ChessBoardView,在onDraw()方法里繪制棋盤的網(wǎng)格線以及棋子陵吸,并判斷游戲是否結(jié)束玻墅,然后在點(diǎn)擊事件不斷重繪,最后在xml文件里引用

  • 五子棋視圖
    創(chuàng)建視圖
public class ChessBoardView extends View {

繪制網(wǎng)格線

    //畫網(wǎng)格線
    private void drawBoardLine(Canvas canvas){

        for (int i=0;i<Constants.MAX_LINE;i++){

            int startX = (int)(mLineWidth / 2);
            int endX = (int)(mWidth - mLineWidth / 2);
            int y = (int)((0.5+i)*mLineWidth);
            canvas.drawLine(startX,y,endX,y,paint);
            canvas.drawLine(y,startX,y,endX,paint);

        }

    }

繪制棋子

    //繪制棋子
    private void drawChess(Canvas canvas){

        for (int i =0,n=mWhiteChess.size();i<n;i++){

            Point whitePoint = mWhiteChess.get(i);
            float left = (whitePoint.x+(1-rate)/2)*mLineWidth;
            float top = (whitePoint.y+(1-rate)/2)*mLineWidth;
            canvas.drawBitmap(mWhiteBitmap,left,top,null);
        }
        for (int i =0,n=mBlackChess.size();i<n;i++){

            Point blackPoint = mBlackChess.get(i);
            float left = (blackPoint.x+(1-rate)/2)*mLineWidth;
            float top = (blackPoint.y+(1-rate)/2)*mLineWidth;
            canvas.drawBitmap(mBlackBitmap,left,top,null);
        }

    }

判斷游戲是否結(jié)束

 //檢查游戲是否結(jié)束
    private void checkGameOver(){

        CheckWinner checkWinner = new CheckWinner();
        boolean whiteWin = checkWinner.checkFiveInLineWinner(mWhiteChess);
        boolean blackWin = checkWinner.checkFiveInLineWinner(mBlackChess);

        if (whiteWin || blackWin){

            mIsGameOver = true;
            mIsWhiteWinner = whiteWin;
            String text = mIsWhiteWinner ? "白棋勝利" : "黑棋勝利";
            Toast.makeText(getContext(),text,Toast.LENGTH_SHORT).show();

        }
    }

這里判斷游戲是否結(jié)束類似于五子棋的大腦壮虫,所以我們另外寫一個類澳厢,專門用來判斷五子棋的輸贏,下面我會提到

onDraw()方法調(diào)用

  @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //繪制棋盤的網(wǎng)格線
        drawBoardLine(canvas);
        //繪制棋子
        drawChess(canvas);
        checkGameOver();
    }
  • xml文件引用

    <me.jrl.demo4.ChessBoardView
        android:id="@+id/boardView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true"/>
  • 五子棋的大腦CheckWinner

創(chuàng)建CheckWinner

public class CheckWinner {

判斷當(dāng)前棋子各個方向棋子的數(shù)量,達(dá)到五個則返回true

    private boolean check(int x, int y, List<Point> points, int checkOri) {

        int count = 1;

        for (int i = 1; i < Constants.MAX_COUNT_IN_LINE; i++) {

            switch (checkOri) {

                case Constants.HORIZONTAL:
                    point1 = new Point(x - i, y);
                    break;
                case Constants.VERTICAL:
                    point1 = new Point(x, y - i);
                    break;
                case Constants.LEFT_DIAGONAL:
                    point1 = new Point(x - i, y + i);
                    break;

                case Constants.RIGHT_DIAGONAL:
                    point1 = new Point(x - i, y - i);
                    break;
                default:
                    break;
            }
            if (points.contains(point1)) {
                count++;
            } else {
                break;
            }
        }

        for (int i = 1; i < Constants.MAX_COUNT_IN_LINE; i++) {

            switch (checkOri) {

                case Constants.HORIZONTAL:
                    point2 = new Point(x + i, y);
                    break;
                case Constants.VERTICAL:
                    point2 = new Point(x, y + i);
                    break;

                case Constants.LEFT_DIAGONAL:
                    point2 = new Point(x + i, y - i);
                    break;

                case Constants.RIGHT_DIAGONAL:
                    point2 = new Point(x + i, y + i);
                    break;
            }
            if (points.contains(point2)) {
                count++;
            } else {
                break;
            }
        }

        if (count == Constants.MAX_COUNT_IN_LINE) {
            return true;
        }
        return false;
    }

最后將黑白棋盤里的棋子都用來遍歷是否在一個方向有五顆棋子

    private Point point1, point2;
    private int checkModel = Constants.HORIZONTAL;

    public boolean checkFiveInLineWinner(List<Point> points) {

        for (Point point : points) {

            int x = point.x;
            int y = point.y;


            if (check(x, y, points, checkModel)) {
                return true;
            } else if (check(x, y, points, Constants.VERTICAL)) {
                return true;
            } else if (check(x, y, points, Constants.LEFT_DIAGONAL)) {
                return true;
            } else if (check(x, y, points, Constants.RIGHT_DIAGONAL)) {
                return true;
            } else {
                return false;
            }
        }
        return false;
    }

總結(jié)

通過這個小項(xiàng)目囚似,我們可以進(jìn)一步了解Android的繪畫機(jī)制剩拢,以及MVC模型,感謝大家的閱讀饶唤,附上源碼
[提取碼:rnmk](鏈接: https://pan.baidu.com/s/13vlRZkXOBPWdliDHAeQQZw)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徐伐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子募狂,更是在濱河造成了極大的恐慌呵晨,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熬尺,死亡現(xiàn)場離奇詭異摸屠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)粱哼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門季二,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事胯舷】舔牵” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵桑嘶,是天一觀的道長炊汹。 經(jīng)常有香客問我,道長逃顶,這世上最難降的妖魔是什么讨便? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮以政,結(jié)果婚禮上霸褒,老公的妹妹穿的比我還像新娘。我一直安慰自己盈蛮,他們只是感情好废菱,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抖誉,像睡著了一般殊轴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袒炉,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天旁理,我揣著相機(jī)與錄音,去河邊找鬼梳杏。 笑死韧拒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的十性。 我是一名探鬼主播叛溢,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼劲适!你這毒婦竟也來了楷掉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤霞势,失蹤者是張志新(化名)和其女友劉穎烹植,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愕贡,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡草雕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了固以。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墩虹。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡嘱巾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诫钓,到底是詐尸還是另有隱情旬昭,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布菌湃,位于F島的核電站问拘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惧所。R本人自食惡果不足惜骤坐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纯路。 院中可真熱鬧或油,春花似錦寞忿、人聲如沸驰唬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叫编。三九已至,卻和暖如春霹抛,著一層夾襖步出監(jiān)牢的瞬間搓逾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工杯拐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霞篡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓端逼,卻偏偏與公主長得像朗兵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子顶滩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 最近一直在學(xué)習(xí)Android自定義View方面的知識余掖,正好看到一個講解制作五子棋小游戲的案例,遂學(xué)習(xí)一番礁鲁,記錄下學(xué)...
    冰鑒IT閱讀 3,168評論 5 16
  • 這些是C/C++能做的 服務(wù)器開發(fā)工程師盐欺、人工智能、云計(jì)算工程師仅醇、信息安全(黑客反黑客)冗美、大數(shù)據(jù) 、數(shù)據(jù)平臺析二、嵌入...
    小辰帶你看世界閱讀 883評論 0 0
  • 這段時間筆者一直在學(xué)習(xí) C 語言的語法,能夠使用 C 語言的構(gòu)造類型,簡單的指針使用,今天做了一個五子棋的小游戲,...
    大兵布萊恩特閱讀 724評論 0 2
  • 大一學(xué)習(xí)C++的時候安排的一個結(jié)課項(xiàng)目粉洼,讓我們做一個小程序或者小游戲。我選擇了五子棋游戲。 我設(shè)計(jì)的五子棋小游戲采...
    行也成文閱讀 429評論 0 1
  • 五絕·笑驕曹(新韻) 萬艦焰風(fēng)燒漆改,綸巾羽扇搖心铃。 伸眉昂首笑,棄甲遁驕曹挫剑。 注:伸眉昂首指揚(yáng)眉抬頭去扣,形容意氣昂...
    任爾風(fēng)云我自逍閱讀 190評論 0 4