iT邦幫忙

1

新年快樂,JS與CSS大哉問:這個五子棋網頁怎麼做呀?

  • 分享至 

  • xImage

前言

新年快樂各位龍好運
祝大家超開心 幸福美滿賺大錢

問題來了

直接給連結
https://www.playok.com/p/?g=gm160127940#5

我知道它是把棋盤弄成不同點位 去紀錄黑白之間 誰下哪
可以變成json格式之類的

我想知道的是棋盤的部分 要畫線以及每一格交叉的位置能下子 是十字交叉處
而不是直接一個方塊 這部分的JS跟CSS感覺難度超大的
很想研究出來怎麼去製作 這樣可以自己弄不同樣式的棋盤跟棋子XD

希望前輩們能指點~~~感謝各位

題外話

它其實有點類似遮罩(? 有些時候玩線上遊戲 我也想用JS弄一個遮罩
把畫面分隔成很多區塊 然後這樣也可以進行一些輔助(?
有看過有人這樣做 超酷的~~

froce iT邦大師 1 級 ‧ 2024-02-15 08:48:13 檢舉
找個現代瀏覽器,對你有疑問的地方按右鍵->檢測/檢查...
這用canvas畫的。
昏倒,做一個DIV,STYLE加一個border-radius:50%,圓就出來了!
froce iT邦大師 1 級 ‧ 2024-02-16 08:17:16 檢舉
> 昏倒,做一個DIV,STYLE加一個border-radius:50%,圓就出來了!

他有問題的不是棋子,是棋盤。CSS要畫的確有點麻煩但硬要畫還是可以。
有時間的話我用vue寫一個簡單的好了。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
鬼王很慘
iT邦新手 2 級 ‧ 2024-02-15 09:43:10

讓我猜測你的認知
你懂得用div的border做直線橫線
你也會用div做button當作落子處
可是兩者要合在一起難度就很大
或許你想到的是position relative排版

但也可以換個角度想
就只有落子的div
直線橫線只是它的裝飾或背景
這樣應該就簡單很多了
撇除套件,CSS也能表現很多圖形
https://css-tricks.com/the-shapes-of-css/

我前端沒很熟,有講錯歡迎指正

這思路有點屌 被你命中了 您這樣解說 我有比較清楚了xd
好厲害 感謝!!!

0
rain_yu
iT邦新手 1 級 ‧ 2024-02-15 14:25:58

我覺得如果你有先寫好其他的部分,
你應該先將程式PO上來,再看如何解決。
同上面的回答,先使用canvas畫出格線

<!DOCTYPE html>
<html>
<head>
    <title>五子棋棋盤</title>
    <style>
        canvas {
            background-color: #8B4513; /* 咖啡色背景 */
            border: 1px solid #000;
        }
    </style>
</head>
<body>
    <canvas id="chessboard" width="400" height="400"></canvas>

    <script>
        const canvas = document.getElementById('chessboard');
        const ctx = canvas.getContext('2d');
        const size = 25; // 每個格子的大小
        const rows = 15; // 棋盤的列數
        const cols = 15; // 棋盤的行數

        // 繪製棋盤
        function drawChessboard() {
            ctx.strokeStyle = '#000000'; // 格線的顏色

            // 繪製垂直格線
            for (let col = 0; col <= cols; col++) {
                const x = col * size;
                ctx.beginPath();
                ctx.moveTo(x, 0);
                ctx.lineTo(x, canvas.height);
                ctx.stroke();
            }

            // 繪製水平格線
            for (let row = 0; row <= rows; row++) {
                const y = row * size;
                ctx.beginPath();
                ctx.moveTo(0, y);
                ctx.lineTo(canvas.width, y);
                ctx.stroke();
            }
        }

        drawChessboard();
    </script>
</body>
</html>
看更多先前的回應...收起先前的回應...

單純要畫出棋盤這個我覺得 我可以搞定
問題在於 我問題裡面特別強調的 也就是落子的互動部分...
要落在十字交叉處 這才是我問題的核心

也就是說我要先了解方法 才能去動手寫
不然光是只有棋盤 我應該用css硬做也可以
以上補充 希望能了解 感恩

rain_yu iT邦新手 1 級 ‧ 2024-02-15 14:58:53 檢舉

你看它可以精準定位到格線中央,比較像格線是圖片,
然後依照格線等比放大製作格子。
你沒給程式,說實在也不知道怎麼看妳哪裡有錯。
你不給程式,其他人應該是不會想要幫你刻一個。

然後你上網找 HTML五子棋,就會有寫好的。
它們範例也是格線使用圖片
https://blog.csdn.net/m0_49315169/article/details/118197223
https://www.zendei.com/article/19019.html

froce iT邦大師 1 級 ‧ 2024-02-15 16:41:23 檢舉

剛剛稍微看了一下code,底圖我猜是經過base64編碼過的png,所有的行為都寫在js裡。只是有經過壓縮比較難看懂而已。
基本上就是弄個區域,等分,然後算出目前游標在哪個區域裡而已。

@rain_yu 謝謝你 不過您可能誤會 我沒有要別人幫我刻XD
也不是要別人幫我糾錯 是想要了解觀念!!
我喜歡自己寫程式 只是我想先把觀念弄清楚罷了
透過你的解說我有比較了解了 感恩~~

@force 大師發言就是精闢 感恩 新年快樂 龍年發財

1
犬千賀
iT邦新手 3 級 ‧ 2024-02-15 16:19:04

你想複雜了 =D

先不管背景,單看落子的格子。會發現其實所謂交點也只是一般的正方形格子。
也就是 15x15格正方形 <div> + css:hover + js click event

背景的部分...
你可以重複剛剛<div>的作法,或者直接上一張背景圖,然後再用css位移就成了。若格子寬1cm則向右向下位移0.5cm。當然也會須要考慮border的寬,但我想這個問題還不需要這麼複雜。

使用Canvas做法也相同。總之,控制項跟圖像分開思考就會清楚得多。

0
純真的人
iT邦大師 1 級 ‧ 2024-02-16 09:00:06

看原始碼是用JS產生白棋黑棋互動規則計算
https://ithelp.ithome.com.tw/upload/images/20240216/20061369lk2ZZUVgt8.png

看F12是用canvas畫布產生整個白棋黑棋互動結果(就是一張完整的圖)
https://ithelp.ithome.com.tw/upload/images/20240216/20061369Vrzz6mPEfx.png

我追加顏色區塊~讓你更了解他的配置方式~
https://ithelp.ithome.com.tw/upload/images/20240216/200613699GWOeEOVs9.png

4
froce
iT邦大師 1 級 ‧ 2024-02-16 14:47:24

哈~真厲害~

大師太神了,我操,我幾乎跪在電腦螢幕面前==
請容許我跪拜ORZZZZZZZZ
好喜歡!

1
jerrythepotato
iT邦新手 4 級 ‧ 2024-02-16 21:58:15

你的需求寫得很不明確,有點天馬行空的發散思考,如果你覺得十字交叉處是個難點,我會假設你對陣列運用很不熟悉。

十字線作為中心點,可以視為每個索引值中間的位置(0.5, 1.5, 2.5, 3.5),若寬度為1,畫線的位置即是index + 0.5。

另一種觀點則是,用兩個陣列運算,舉例:

  1. 設計一個5x5寬度的棋盤方格陣列
  2. 設計一個6x6寬度的下子十字陣列
  3. 讓2相對於1,設定top: -0.5, left: -0.5。或者,translate(-0.5,-0.5)

以上是觀念的部分。
回到實作,聽起來你想用CSS去搞,我不知道弄起來會多複雜,建議用Canvas會快很多哦!

您的假設還滿正確的XDD 沒想到大家通靈的技術都超高
幾乎都是一語命中我的弱點 學習了!
非常感謝 算是我學的不夠熟-->導致思考卡關

0
DanSnow
iT邦好手 1 級 ‧ 2024-02-17 17:59:49

這不是直接回答你的問題,單純想提供你一個不是用 canvas 也能畫出棋盤的方法,順便秀一下我寫的黑白棋 https://github.com/DanSnow/react-reversi

你可以在 /src/components/Board/Board.tsx 找到棋盤的 code ,我是用 svg 達成的,用 svg 的話

  1. 定位更容易,你可以直接給一個相對的座標
  2. 圖層更容易疊出來
  3. svg 的元素同樣可以 listen 事件,不用像 canvas 要計算點擊位置

可以落子的位置實際上有放一個透明的棋子在那邊,當點擊透明的棋子時就會觸發落子的 code ,還可以把透明棋子的透明度調低,變成提示可以下哪邊的功能

人才真的好多 再度跪拜 學習了!!!

0
coolizz
iT邦見習生 ‧ 2024-02-19 15:13:48

兩三年前有做過類似的 side project,自己都忘了當初怎麼做,大概是用 beforeafter 讓產生線條

demo
repo

棋子滿有質感的 謝謝分享!!

我要發表回答

立即登入回答