Làm công thức tính điểm hố trong golf

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài
1678168164096.png
Đang có sự sai khác giữa TÍNH TAY-CÔNG THỨC-VBA (đơn cử ở hố số 1, ko xét dấu âm dương, chỉ xét trị số)
Chủ thớt thử xác nhận lại xem kết quả nào mới chính xác vậy?
 
Làm đại bằng VBA, dù chưa hiểu lắm.
Nhấn nút RUN để ra kết quả.
PHP:
Option Explicit
Sub golf()
Dim i&, j&, t&, rng, sum&, dic As Object, index, score, myScore&, res(), id As String
Set dic = CreateObject("Scripting.Dictionary")
index = Range("C4:T4").Value
score = Range("B7:V10").Value
For i = 1 To UBound(score)
    For j = 1 To UBound(score)
        id = score(i, 1) & "|" & score(j, 1)
        If Not dic.exists(id) Then
            dic.Add id, Round((score(j, 21) - score(i, 21)) * 0.7, 0)
        End If
    Next
Next
ReDim res(1 To UBound(score), 1 To 18)
For j = 2 To 19
    For i = 1 To UBound(score)
        myScore = score(i, j): sum = 0
        For t = 1 To UBound(score)
            If i <> t Then
                If score(t, j) < myScore Then
                    sum = sum + 1
                ElseIf score(t, j) > myScore Then
                    sum = sum - 1
                Else
                    id = score(i, 1) & "|" & score(t, 1)
                    If index(1, j - 1) <= Abs(dic(id)) Then sum = sum + IIf(dic(id) < 0, 1, -1)
                End If
            End If
        Next
        res(i, j - 1) = sum
    Next
Next
Range("C12").Resize(UBound(res), 18).Value = res
End Sub
Cách làm của mình như sau:
1- Tạo dictionary để lưu trữ handicap, ví dụ:
Key: Player1 | Player2
Item: -6
Hiểu là giá trị index là <=6 thì áp dụng Player1 được chấp bởi Player2 (item <0)
Nếu là +6 thì ngược lại: Player1 chấp Player2
2- Code sẽ duyệt từng cột từ 1 tới 18
Trong từng cột, 1 player (myScore) sẽ lần lượt so sánh với các player còn lại (Score(t,j)):
Nếu mScore lớn hơn: sum = sum +1
Nếu nhỏ hơn: sum = sum-1
Nếu bằng: So sánh handicap

Nếu kết quả sai thì bạn tô màu ô đó, ghi chú kết quả muốn có và giải thích nhé.
Cám ơn bác, kết quả đúng hết rồi a,
và cũng cám ơn bác hoangtuaotrang_hp_vn vì đã quan tâm giúp đỡ.


Nhân tiện đây mình cũng giải thích đây là 1 phần của cách tính độ giữa 4 người chơi với nhau trong golf ngoài tính tiền theo từng hố sẽ có tính theo tiền gậy ví dụ
1) player 1 đánh 0 gậy và player 2 đánh 3 gậy ( giả sử có 1 sẹo phạt) thì player 2 trả cho player 1 là 3 skin cộng 1 skin phạt là 4 skin ( skin đây chính là số tiền các player quy ước với nhau ít thì 100k/skin, nhiều thì vô kể). Ra sân cứ chênh nhau bao nhiêu Handicap thì người chấp đưa đúng số tiền chênh lệch bằng số skin ví dụ ông handicap 20 sẽ đưa 1 tr cho ông handicap 30 (nếu skin là 100k) rồi chơi.
2) Ngoài ra còn ghép team xoay vòng giữa các người chơi thông thường cứ 3 hố 1 team rồi thắng tiền team
3) Mình làm cái này do sắp tới cái độ trên sân này có thể bị siết lại đang đưa vào chuyên án vì nó bản chất là cờ bạc, nếu siết quá thì anh em ghi lại số điểm về thanh toán cho nhau thôi. Chứ cầm tiền đưa trên sân đưa vẫn hay nhất, có một số bác đã mang phỉnh (chips) đi đánh golf :D golf mà không độ giống như kiểu ăn món gì đó mà không cho muối, bản chất mình không cờ bạc nên đánh độ ít chỉ để mọi người đánh tập trung và không buông xuôi, ai chơi golf rồi sẽ hiểu.

Cách tính điểm chấp trong đánh hố và đánh team
Các hình thức đánh độ sau đây liên quan đến kết quả từng hố, nên sẽ phải bổ xung cánh tính điểm chấp cho từng hố theo nguyên tắc như sau:
- A HDC 18, đánh với B HDC 23, tức là A chấp B 5 gậy
- Lấy hiệu số điểm chấp nhân với 0,7 để tính số hố chấp, trong trường hợp này là 5*0,7 = 3,5. Có nghĩa là A chấp B 1 gậy cho các hố index 1,2,3, và 0,5 gậy cho hố Index 4 (A và B cùng số gậy thì B thắng).
- Kết quả nhân sẽ tính theo phương pháp làm tròn, tức là 3,6 thì chấp thành 4 hố, 3,4 thì chấp 3 hố.
- trong cùng nhóm chơi, điểm chấp sẽ được tính so với người có HDC thấp nhất. ví dụ: A(10), B(13), C(18), D(23)
- A sẽ chấp D (23-10)*0,7=9,1 => 9 hố, từ index 1 tới index 9.
- A sẽ chấp C (18-10)*0.7=5,6 => 6 hố, từ index 1 tới index 6.
- A sẽ chấp B (13-10)*0,7=2,1 => 2 hố, từ index 1 tới index 2.
=> các hố index 1,2: B,C,D đánh đồng, được A chấp 1 gậy
=> các hố index 3,4,5,6: A và B đánh đồng, C và D đánh đồng và được A/B chấp 1 gậy
=> các hố index 7,8,9: A,B,C đánh đồng, chỉ mình D được chấp 1 gậy
=> các hố index 10-18: tất cả đánh đồng
ST
 

File đính kèm

  • z4152029787724_d3e33c33b4bf2cad7cdad5b82b72f5d9.jpg
    z4152029787724_d3e33c33b4bf2cad7cdad5b82b72f5d9.jpg
    151 KB · Đọc: 13
Lần chỉnh sửa cuối:
Trích: "player 1 đánh 0 gậy và player 2 đánh 3 gậy ( giả sử có 1 sẹo phạt) thì player 3 trả cho player 2 là 3 skin..."
Hỏi:
Player 3 ở đâu vào trả tiền cho player 2? Và player 1 và player 2 ai hơn ai?
 
Trích: "player 1 đánh 0 gậy và player 2 đánh 3 gậy ( giả sử có 1 sẹo phạt) thì player 3 trả cho player 2 là 3 skin..."
Hỏi:
Player 3 ở đâu vào trả tiền cho player 2? Và player 1 và player 2 ai hơn ai?
Xin lỗi bác lỗi đánh máy ạ player 2 trả cho player 1 ạ chứ ko phải player 3
 
Làm đại bằng VBA, dù chưa hiểu lắm.
Nhấn nút RUN để ra kết quả.
PHP:
Option Explicit
Sub golf()
Dim i&, j&, t&, rng, sum&, dic As Object, index, score, myScore&, res(), id As String
Set dic = CreateObject("Scripting.Dictionary")
index = Range("C4:T4").Value
score = Range("B7:V10").Value
For i = 1 To UBound(score)
    For j = 1 To UBound(score)
        id = score(i, 1) & "|" & score(j, 1)
        If Not dic.exists(id) Then
            dic.Add id, Round((score(j, 21) - score(i, 21)) * 0.7, 0)
        End If
    Next
Next
ReDim res(1 To UBound(score), 1 To 18)
For j = 2 To 19
    For i = 1 To UBound(score)
        myScore = score(i, j): sum = 0
        For t = 1 To UBound(score)
            If i <> t Then
                If score(t, j) < myScore Then
                    sum = sum + 1
                ElseIf score(t, j) > myScore Then
                    sum = sum - 1
                Else
                    id = score(i, 1) & "|" & score(t, 1)
                    If index(1, j - 1) <= Abs(dic(id)) Then sum = sum + IIf(dic(id) < 0, 1, -1)
                End If
            End If
        Next
        res(i, j - 1) = sum
    Next
Next
Range("C12").Resize(UBound(res), 18).Value = res
End Sub
Cách làm của mình như sau:
1- Tạo dictionary để lưu trữ handicap, ví dụ:
Key: Player1 | Player2
Item: -6
Hiểu là giá trị index là <=6 thì áp dụng Player1 được chấp bởi Player2 (item <0)
Nếu là +6 thì ngược lại: Player1 chấp Player2
2- Code sẽ duyệt từng cột từ 1 tới 18
Trong từng cột, 1 player (myScore) sẽ lần lượt so sánh với các player còn lại (Score(t,j)):
Nếu mScore lớn hơn: sum = sum +1
Nếu nhỏ hơn: sum = sum-1
Nếu bằng: So sánh handicap

Nếu kết quả sai thì bạn tô màu ô đó, ghi chú kết quả muốn có và giải thích nhé.
Bạn ơi cho mình hỏi nếu chỉ có 3 người chơi và 2 người chơi thì code trên cần sửa đoạn nào nhỉ?
Thanks bạn
 
Gửi lại file mới đi bạn
nó vẫn vậy bạn à chỉ là nếu có 3 người so 3 người với nhau và có 2 người thì so 2 người với nhau, nếu cái code nó chung được cho cả 3 trường hợp chơi 4 người, chơi 3 người và chơi 2 người được thì tốt thanks bạn
 

File đính kèm

nó vẫn vậy bạn à chỉ là nếu có 3 người so 3 người với nhau và có 2 người thì so 2 người với nhau, nếu cái code nó chung được cho cả 3 trường hợp chơi 4 người, chơi 3 người và chơi 2 người được thì tốt thanks bạn
Bạn hướng dẫn mình cách chạy VBA với, mình tải về nhưng báo lỗi macro. Mình không rành lắm, cảm ơn bạn nhiều. File này mình rất cần bạn ạ.
 
Em đang nghĩ công thức cách tính điểm hố golf tự động cho người chơi khi nhập điểm mà nó hơi vượt quá khả năng mình ( cột màu cam em đã làm mẫu tay 3 hố đầu) , trong file excel em đã giải thích quy tắc tính, bác nào biết chơi golf thì hiểu ngay nhưng ai chưa chơi thì hơi khó hiểu chút. Mong các bác giúp thanks.
bác làm được chưa bác, giờ mà có giải pháp chơi everthing thì ngon bác nhỉ. ngồi ăn tổng kết thì quá tuyệt vời :D
Bài đã được tự động gộp:

Bác nào mà viết được phần mềm này bán sẽ được giá nhé.
 
Web KT

Bài viết mới nhất

Back
Top Bottom