Bagaimana saya bisa menandai level sebagai "selesai" dengan cara yang mencegah kecurangan?

8

Pikiran pertama saya tentang menandai level selesai adalah hanya menulis informasi ke file setelah penyelesaian level dan memuatnya begitu aplikasi dibuka kembali. Tapi bagaimana saya bisa menjaga ini agar tidak rusak dan mencegah kecurangan?

Madmenyo
sumber
"Bagaimana Candy Crush melakukannya," tidak pada topik di sini, jadi saya telah menghapus aspek pertanyaan itu dan berfokus pada aspek 'mencegah kecurangan'.
Jika Anda tertarik tentang bagaimana Candy Crush menangani masalah ini secara khusus, Anda mungkin lebih beruntung bertanya di gaming.stackexchange.com
Kevin

Jawaban:

19

Menyimpan informasi penyelesaian dalam file lokal adalah metode yang sederhana dan dapat diterima untuk melakukannya. Pada dasarnya, inilah yang akan dilakukan setiap game untuk melacak kemajuan (dalam beberapa cara, meskipun format spesifik yang digunakan untuk data dan mekanisme penyimpanan akan berbeda).

Melindungi file dari gangguan lebih sulit. Jika tidak ada alasan yang meyakinkan (tidak ada keuntungan yang bisa diperoleh oleh pemain, tidak ada hadiah, dan lain-lain) Anda biasanya bisa lolos dengan tidak peduli.

Tetapi jika Anda benar- benar peduli, dan Anda serta jika Anda bisa berharap bahwa platform Anda ditutup (konsol dan perangkat iOS yang tidak di-jailbreak, misalnya) Anda juga tidak perlu terlalu khawatir. Pengguna biasanya tidak secara fisik dapat mengakses file untuk merusaknya (asalkan Anda menggunakan OS OS yang sesuai untuk menyimpan data di lokasi "pribadi" dan yang publik (misalnya, menyimpan file ini di iCloud Drive pengguna di iOS) mungkin bukan ide bagus).

Jika Anda benar-benar khawatir tentang gangguan pada titik di mana tidak boleh terjadi (misalnya, di mana ada keuntungan yang bisa diperoleh oleh pemain yang memiliki lebih banyak level selesai), Anda perlu menyimpan data di sisi server. Sisi klien yang disimpan pada akhirnya dapat dikompromikan dan tidak boleh dipercaya: ini adalah mesin pengguna, di tangan pengguna. Dinamika kontrol tidak sesuai keinginan Anda.

Tidak sepenuhnya mustahil untuk meretas file yang disimpan di sisi server, tentu saja, tetapi itu jauh lebih sulit jika Anda memiliki sistem akuntansi yang masuk akal.


sumber
Terima kasih, saya hanya tidak ingin membuatnya mudah marah dengan file progres. Telah membaca dan bertanya-tanya apakah Preferencekelas khusus LibGDXdapat membantu saya keluar. Saya bisa menyimpan boolean sederhana untuk level dan mungkin dengan skor tinggi juga.
Madmenyo
@MennoGouw: jika kita berbicara tentang android di sini, file pribadi ke aplikasi tidak dapat diakses kecuali perangkat di-root. Agaknya libGDX menggunakan file seperti itu untuk preferensi.
njzk2
Anda juga bisa menggunakan enkripsi, dengan kunci yang disimpan di server Anda tetapi data itu sendiri disimpan secara lokal. Kemudian minta kunci pada permulaan permainan dan dekripsi file simpan.
Kroltan
1
@Kroltan Tapi kemudian Anda bisa RAM-dump perangkat saat sedang digunakan, dapatkan kunci, dan mengutak-atik file. (Dalam sebuah emulator, jika perlu.)
wchargin
1
Pengguna juga dapat memodifikasi aliran yang berasal dari server web, karena meskipun koneksi dienkripsi, komputer pengguna memiliki kunci untuk mendekripsi. Maka dia hanya perlu mengubah nilai-nilai itu untuk mengatakan {"finalLevelCompleted":true}. Selesai
Kroltan
9

Anda dapat membuat file replay sebagai bukti kerja saat pemain sedang bermain. Mulai game, simpan kondisi awal termasuk nama level dan seed pseudorandom, rekam status input stempel waktu yang tepat (gerakan mouse, penekanan tombol atau tombol, dll.) Yang dilewatkan oleh layer input game Anda ke layer logikanya, dan berhenti merekam begitu tujuan tercapai. Anda dapat mengompresi log input dengan pengkodean run-length (RLE) sehingga hanya perubahan dalam status tombol (menekan, melepaskan, dan sejenisnya) menyebabkan peristiwa log. Dari kondisi awal dan log input, Anda dapat memverifikasi penyelesaian tujuan dengan memutar ulang input ke dalam fisika game dan AI.

Log seperti ini memiliki beberapa aplikasi yang tidak asing bagi pemain video game, terutama gim yang ditiru. Pemain dapat melakukan rewatch game secara lokal dari log untuk mencari kekurangan strategi atau untuk membual ke teman-teman lokal. Mode menarik permainan Anda dapat terdiri dari log untuk level yang dipilih. Netplay dalam game yang menggunakan mesin GGPO disusun dengan cara yang sama, dengan penundaan beberapa frame antara input dan mesin game untuk memungkinkan waktu bagi input pemain lain untuk tiba melalui Internet. Dan Anda dapat meminta peserta papan peringkat untuk mengunggah log, dan kemudian server Anda akan menjalankannya secara cepat di atas salinan cut-down dari permainan tanpa mesin grafis. Untuk mencegah serangan replay di mana satu pemain mengunggah log orang lain, informasi yang digunakan untuk seed generator nomor pseudorandom game dapat menyertakan ID pengguna papan peringkat pemain. Dengan cara ini server dapat membandingkannya,

Beberapa pemain yang sangat berdedikasi akan secara manual membuat log input yang merupakan bukti kerja. Ini disebut "speedrun berbantuan alat". Jika Anda tidak ingin TAS di papan peringkat publik, Anda dapat meminta permainan di tingkat kompetisi tertinggi dilakukan saat terhubung ke Internet. Server akan mengirim nilai kunci setiap beberapa detik, dan klien akan mengirim log input secara real time seolah-olah itu adalah netplay, dienkripsi dengan kunci itu. Kunci ini berubah setiap beberapa detik, dan dalam gim yang menggunakan semacam elemen acak, ini mungkin menghasilkan ulang pembuat nomor pseudorandom. Jika jeda terus-menerus antara mengirim kunci dan menerima paket input yang sesuai melebihi beberapa detik, kita dapat mengasumsikan bahwa pengguna mencoba sesuatu yang "lucu".

Damian Yerrick
sumber
TAS lebih dari sekadar membuat log secara manual untuk diputar ulang, itu artinya game telah dimanipulasi sedemikian rupa sehingga Anda dapat menyimpan status dan memainkannya bingkai demi bingkai untuk tindakan sempurna setiap kali. Ini bukan poin Anda, tetapi perlu disebutkan. en.wikipedia.org/wiki/Tool-assisted_speedrun
TankorSmash
3

Jika Anda ingin melakukan ini sepenuhnya di sisi klien dan Anda tidak menganggap penyimpanan pribadi yang disediakan oleh platform Anda cukup aman (misalnya jika ada uang aktual yang terlibat dalam menyelesaikan level), yang Anda butuhkan adalah bukti kerja. File simpan Anda harus berisi informasi yang dirancang sedemikian rupa sehingga membuat informasi tersebut sulit untuk dihitung kecuali Anda telah menyelesaikan level yang terkait, tetapi mudah diverifikasi oleh pihak ketiga yang tidak harus telah menyelesaikan level tersebut (lebih disukai tanpa harus tahu solusinya sendiri). Semakin besar perbedaan dalam kesulitan menghitung bukti kerja sebelum dan sesudah menyelesaikan level, semakin aman bukti kerja tersebut.

Sayangnya, bukti kerja ini harus sedemikian rupa sehingga dikaitkan dengan gameplay, jadi tidak ada cara umum yang dapat dilakukan untuk game yang sewenang-wenang, dan game executable Anda tidak boleh mengandung solusi untuk game dengan cara apa pun, atau sebaliknya itu cukup mudah untuk mengekstrak bukti kerja dari executable. Dalam kebanyakan kasus, Anda hampir selalu harus secara khusus merancang gameplay Anda di sekitar persyaratan khusus ini untuk membuat bukti kerja menjadi cheat-proof, sehingga Anda juga akan kehilangan beberapa kebebasan kreatif.

Sebagai contoh, katakanlah permainan Sudoku, bukti kerja dapat berupa papan Sudoku yang telah dilengkapi (perhatikan bahwa papan harus dibuat oleh pihak ketiga yang tepercaya, karena sebagian besar algoritma pembuatan papan Sudoku perlu menghitung ulang solusi, ini melemahkan bukti dari bekerja jika dilakukan pada klien). Atau permainan anjak angka komposit besar, bukti kerja adalah faktor utama (saya sebut game RSA vs NSA).

Agar benar-benar aman, gim Anda harus mengandung beberapa elemen acak, karena jika gim Anda benar-benar deterministik, dimungkinkan untuk curang menyalin hasil kerja dari orang lain yang telah menyelesaikan level (ini adalah serangan replay).

Tujuan pembuktian kerja adalah untuk membuat curang setidaknya sama sulitnya dengan membuat bot untuk permainan. Jadi, untuk curang pada permainan Sudoku, Anda harus memiliki pemecah Sudoku, dll.

Ini sangat sulit. Jika ini adalah permainan pemain tunggal, lebih baik jaga kebebasan kreatif Anda dan jangan khawatir tentang kecurangan. Ini permainan mereka, mereka telah membelinya dan jika mereka curang, itu tidak mempengaruhi garis bawah Anda. Atau alihkan ke game berbasis server, dan lakukan semua logika game penting Anda di server.

Lie Ryan
sumber
1

Jika Anda lebih suka menggunakan file eksternal untuk menyimpan informasi dan itu berada di tempat yang dapat dirusak oleh pengguna, Anda mungkin ingin membaca tentang cara kerja enkripsi dan menggunakannya untuk mencegah siapa pun dapat membuat perubahan yang berarti pada mengajukan. Sesuatu seperti Feistel Cipher harus menjadi titik awal yang baik dan akan cukup untuk menghentikan seseorang tanpa banyak waktu dan pengetahuan dari mengubah file simpan. http://en.wikipedia.org/wiki/Feistel_cipher

Selain itu Josh telah memukul kuku di kepala ketika datang ke penyimpanan sisi klien dan server.

Arsipkan
sumber
0

Jika seseorang dapat memilih biner dan mencari tahu algoritma - Anda tidak akan pernah bisa mencegahnya, jadi jangan repot-repot.

Untuk berhenti cukup gunakan hash kriptografi!

Misalkan Anda memiliki ini:

function computeHash(levels) {
    code = "";
    for(level in levels) {
       code = hash(code+level+level.isComplete()+"MAGICSALT")
    }
}

Ini sangat sederhana tetapi itu berarti Anda harus menulis kode di akhir file, Anda kemudian mengurai file itu seperti biasa, dan lakukan computeHash(levelListReadFromFile);

JIKA kode hash = yang dibaca di file maka itu SANGAT MUNGKIN "sah". Maksud saya ... seseorang dengan hex editor tidak akan memecahkannya, itu akan membawa seseorang yang mengetahui barang-barang mereka.

Selalu mendukung penyimpanan lokal BTW - kecuali itu MMO jelas, orang tidak ingin Anda menggunakan data mereka, pergi di kereta, dan melakukan segala macam hal. Saya benci program yang membutuhkan akses internet tanpa alasan.

Alec Teal
sumber
Mengapa downvoter ???
Alec Teal