Game
গেম ইভেন্টগুলি হল এলোমেলোভাবে তৈরি হওয়া ফ্লোটগুলির অনুবাদ একটি সম্পর্কযুক্ত ফলাফলে যা গেম স্পেসিফিক। এতে একটি ডাইসের রোলের ফলাফল থেকে শুরু করে একটি ডেকে কার্ডের ক্রম, অথবা একটি খনি খেলার প্রতিটি বোমার অবস্থান অন্তর্ভুক্ত রয়েছে।
নিচে আমাদের প্ল্যাটফর্মে প্রতিটি নির্দিষ্ট গেমের জন্য ফ্লোটগুলিকে ইভেন্টে কীভাবে অনুবাদ করি তার একটি বিস্তারিত ব্যাখ্যা দেওয়া হয়েছে।
হাইলো
একটি স্ট্যান্ডার্ড কার্ড ডেকে 52টি অনন্য সম্ভাব্য ফলাফল রয়েছে। যখন আমাদের প্ল্যাটফর্মে ব্ল্যাকজ্যাক, হিলো এবং ব্যাকারেট খেলার কথা আসে, তখন আমরা গেম ইভেন্ট তৈরি করার সময় অপরিসীম সংখ্যক ডেক ব্যবহার করি এবং তাই প্রতিটি কার্ডের টার্নের সম্ভাবনা সর্বদা সমান থাকে। এটি গণনা করতে, আমরা প্রতিটি এলোমেলোভাবে তৈরি হওয়া ফ্লোটকে 52 দিয়ে গুণ করি এবং তারপরে এই ফলাফলটিকে একটি নির্দিষ্ট কার্ডে অনুবাদ করি, নিচের সূচক অনুযায়ী:
// Index of 0 to 51 : ♦2 to ♣A
const CARDS = [
♦2, ♥2, ♠2, ♣2, ♦3, ♥3, ♠3, ♣3, ♦4, ♥4,
♠4, ♣4, ♦5, ♥5, ♠5, ♣5, ♦6, ♥6, ♠6, ♣6,
♦7, ♥7, ♠7, ♣7, ♦8, ♥8, ♠8, ♣8, ♦9, ♥9,
♠9, ♣9, ♦10, ♥10, ♠10, ♣10, ♦J, ♥J, ♠J,
♣J, ♦Q, ♥Q, ♠Q, ♣Q, ♦K, ♥K, ♠K, ♣K, ♦A,
♥A, ♠A, ♣A
];
// Game event translation
const card = CARDS[Math.floor(float * 52)];
এই খেলাগুলির সাথে জড়িত একমাত্র পার্থক্যকারী উপাদান হল, হিলো এবং ব্ল্যাকজ্যাকের ক্ষেত্রে 52টি সম্ভাব্য গেম ইভেন্ট তৈরি করতে 13টি কার্সার রয়েছে যখন খেলোয়াড়কে প্রচুর পরিমাণে কার্ড বিতরণ করতে হয়, যেখানে ব্যাকারেটে, আমাদের সর্বাধিক সংখ্যক খেলার যোগ্য কার্ড কভার করার জন্য কেবল 6টি গেম ইভেন্ট তৈরি করতে হবে।
হীরার
ডায়মন্ড খেলায়, রত্নের আকারে 7টি সম্ভাব্য ফলাফল রয়েছে। এটি অর্জন করার জন্য, আমরা সংশ্লিষ্ট রত্নে অনুবাদ করার আগে প্রতিটি উৎপন্ন ফ্লোটকে 7 দ্বারা গুণ করি এবং নিম্নলিখিত সূচকটি ব্যবহার করি:
// Index of 0 to 51 : ♦2 to ♣A
const CARDS = [
♦2, ♥2, ♠2, ♣2, ♦3, ♥3, ♠3, ♣3, ♦4, ♥4,
♠4, ♣4, ♦5, ♥5, ♠5, ♣5, ♦6, ♥6, ♠6, ♣6,
♦7, ♥7, ♠7, ♣7, ♦8, ♥8, ♠8, ♣8, ♦9, ♥9,
♠9, ♣9, ♦10, ♥10, ♠10, ♣10, ♦J, ♥J, ♠J,
♣J, ♦Q, ♥Q, ♠Q, ♣Q, ♦K, ♥K, ♠K, ♣K, ♦A,
♥A, ♠A, ♣A
];
// Game event translation
const card = CARDS[Math.floor(float * 52)];
ডাইস
আমাদের ডাইসের সংস্করণে, আমরা 00.00 থেকে 100.00 এর সম্ভাব্য রোল স্প্রেড কভার করি, যার পরিসর 10,001 সম্ভাব্য ফলাফল। গেম ইভেন্টের অনুবাদ সম্ভাব্য ফলাফলের সংখ্যার সাথে ফ্লোটকে গুণিত করে এবং তারপরে 100 দ্বারা ভাগ করে করা হয় যাতে ফলস্বরূপ সংখ্যা আমাদের উল্লিখিত ডাইস পরিসরের সীমাবদ্ধতার মধ্যে আসে।
// Game event translation
const roll = (float * 10001) / 100;
কয়েন ফ্লিপ
কয়েনফ্লিপ খেললে, 2টি সম্ভাব্য ফলাফল রয়েছে, যা মুদ্রার আকারে। এটি অর্জন করার জন্য, আমরা সংশ্লিষ্ট রত্নে অনুবাদ করার আগে প্রতিটি উৎপন্ন ফ্লোটকে 2 দ্বারা গুণ করি এবং নিম্নলিখিত সূচকটি ব্যবহার করি:
// Index of 0 & 1 : batman & joker
const COINS = [ 0, 1 ];
// Game event translation
const coin = COINS[Math.floor(float * 2)];
লিম্বো
যখন লিম্বোর কথা আসে, তখন আমরা একটি দুই স্তরের প্রক্রিয়া ব্যবহার করি। প্রথমত, আমরা ফ্লোটকে সর্বাধিক সম্ভাব্য গুণক এবং হাউস এজ উভয়ের সাথে গুণ করি। তারপর, একটি গেম ইভেন্ট তৈরি করার জন্য যা সম্ভাব্যতা বিতরণ আমরা সর্বাধিক সম্ভাব্য গুণককে প্রথম পদক্ষেপের ফলাফলের দ্বারা ভাগ করি যাতে একটি গেম ইভেন্ট তৈরি হয় যা একটি ক্র্যাশ পয়েন্টের আকারে।
// Game event translation with houseEdge of 0.99 (1%)
const floatPoint = 1e8 / (float * 1e8) * houseEdge;
// Crash point rounded down to required denominator
const crashPoint = Math.floor(floatPoint * 100) / 100;
// Consolidate all crash points below 1
const result = Math.max(crashPoint, 1);
প্লিঙ্কো
প্লিনকোর যেকোনো খেলায়, উত্পন্ন ফলাফল পতিত বলের পথের উপর ভিত্তি করে। গেম ইভেন্ট পতিত বলের পতন প্রক্রিয়ার প্রতিটি স্তরের জন্য পতিত বলের দিক নির্ধারণ করে। খেলোয়াড়রা 8 এবং 16 পিনের মধ্যে নির্বাচন করতে পারেন, যা উপরে থেকে নীচে একটি সম্পূর্ণ পথ তৈরি করতে প্রয়োজনীয় গেম ইভেন্টগুলির সংখ্যা নির্ধারণ করে। যেহেতু কেবল দুটি সম্ভাব্য দিক (বাম বা ডান) রয়েছে, অনুবাদটি প্রতিটি ফ্লোটকে 2 দ্বারা গুণন করার মাধ্যমে করা হয়, যা নিম্নলিখিত সূচকগুলিতে ম্যাপ করা হয়:
// Index of 0 to 1 : left to right
const DIRECTIONS = [ left, right ];
// Game event translation
const direction = CARDS[Math.floor(float * 2)];
কেনো
ঐতিহ্যগত কেনো গেমগুলির জন্য একটি বোর্ডে হিট হিসাবে 10টি সম্ভাব্য গেম ইভেন্ট নির্বাচন করা প্রয়োজন।
// Index of 0 to 39 : 1 to 40
const SQUARES = [
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
31, 32, 33, 34, 35, 36, 37, 38, 39, 40
];
const hit = SQUARES[Math.floor(float * 40)];
ফিশার-ইয়েটস শাফল বাস্তবায়ন পুনরাবৃত্ত সম্ভাব্য হিট উৎপন্ন হওয়া থেকে রোধ করতে ব্যবহৃত হয়।
মাইনস
একটি মাইন গেম ২৪টি পৃথক গেম ইভেন্টের সাথে তৈরি করা হয়, বোর্ডে মাইনগুলির আকারে। প্রতিটি ফ্লোট বোর্ডে এখনও অবশিষ্ট সম্ভাব্য অনন্য টাইলের সংখ্যা দ্বারা গুণিত হয়। এটি প্রাসঙ্গিক ফ্লোট সরবরাহ করে প্রতিটি গেম ইভেন্ট ফলাফলের জন্য তৈরি করা ইভেন্টের সংখ্যা ১ দ্বারা বিয়োগ করে করা হয়। খনির অবস্থান বাম থেকে ডানে, উপরে থেকে নীচে গ্রিড অবস্থান ব্যবহার করে চিত্রিত করা হয়।
ফিশার-ইয়েটস শাফল বাস্তবায়ন পুনরাবৃত্ত সম্ভাব্য হিট উৎপন্ন হওয়া থেকে রোধ করতে ব্যবহৃত হয়। নির্বাচিত সেটিংসের ভিত্তিতে 1 থেকে 24 গেম ইভেন্ট ফলাফল ব্যবহার করা হয়।
চাকা
গেম ইভেন্ট নম্বরটি ফ্লোটকে সেগমেন্টের সম্ভাব্য ফলাফলের সাথে গুণন করে গণনা করা হয়। তারপর এটি গেম ইভেন্ট ফলাফলকে মাল্টিপ্লায়ার হিসাবে নির্ধারণ করতে ব্যবহৃত হয়, নীচের সূচকটি ব্যবহার করে:
// Index per payout configuration
const PAYOUTS = {
'10': {
low: [ 1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0 ],
medium: [ 0, 1.9, 0, 1.5, 0, 2, 0, 1.5, 0, 3 ],
high: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9.9 ]
},
'20': {
low: [
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0
],
medium: [
1.5, 0, 2, 0, 2, 0, 2, 0, 1.5, 0,
3, 0, 1.8, 0, 2, 0, 2, 0, 2, 0
],
high: [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 19.8
]
},
'30': {
low: [
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0
],
medium: [
1.5, 0, 1.5, 0, 2, 0, 1.5, 0, 2, 0,
2, 0, 1.5, 0, 3, 0, 1.5, 0, 2, 0,
2, 0, 1.7, 0, 4, 0, 1.5, 0, 2, 0
],
high: [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 29.7
]
},
'40': {
low: [
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0
],
medium: [
2, 0, 3, 0, 2, 0, 1.5, 0, 3, 0,
1.5, 0, 1.5, 0, 2, 0, 1.5, 0, 3, 0,
1.5, 0, 2, 0, 2, 0, 1.6, 0, 2, 0,
1.5, 0, 3, 0, 1.5, 0, 2, 0, 1.5, 0
],
high: [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 39.6
]
},
'50': {
low: [
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0,
1.5, 1.2, 1.2, 1.2, 0, 1.2, 1.2, 1.2, 1.2, 0
],
medium: [
2, 0, 1.5, 0, 2, 0, 1.5, 0, 3, 0,
1.5, 0, 1.5, 0, 2, 0, 1.5, 0, 3, 0,
1.5, 0, 2, 0, 1.5, 0, 2, 0, 2, 0,
1.5, 0, 3, 0, 1.5, 0, 2, 0, 1.5, 0,
1.5, 0, 5, 0, 1.5, 0, 2, 0, 1.5, 0
],
high: [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 49.5
]
}
};
// Game event translation
const spin = PAYOUTS[segments][risk][float * segments];
ক্র্যাশ
আমাদের ন্যায্যতা প্রমাণ করার জন্য, আমরা 10,000,000 SHA256 হ্যাশের একটি চেইন তৈরি করেছি যেখানে প্রতিটি হ্যাশ হল পূর্ববর্তী হ্যাশের ষোলো-ভিত্তিক উপস্থাপনাটির হ্যাশ। চেইনে শেষ হ্যাশ হল: 78a9757d3be42b74a3f70239078ad9317125fe9ee630d5bdada46de963e56752
খেলার ফলাফল তৈরি করার সূত্র:
const gameHash = hashChain.pop()
const hmac = createHmac('sha256', gameHash);
// blockHash is the hash of bitcoin block 584,500
hmac.update(blockHash);
const hex = hmac.digest('hex').substr(0, 8);
const int = parseInt(hex, 16);
// 0.01 will result in 1% house edge with a lowest crashpoint of 1
const crashpoint = Math.max(1, (2 ** 32 / (int + 1)) * (1 - 0.01))
ডাবল
আমাদের ডাবলটি ইউরোপীয় সংস্করণ থেকে নেওয়া হয়েছে যেখানে চাকাটিতে 0 থেকে 14 পর্যন্ত 15টি ভিন্ন পকেট রয়েছে। গেম ইভেন্টটি 15 দ্বারা ফ্লোট গুণন করে গণনা করা হয় এবং তারপরে নিম্নলিখিত সূচকটি ব্যবহার করে একটি সম্পর্কিত পকেটে অনুবাদ করা হয়:
// Index of 0 to 14
const POCKETS = [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14
];
// Game event translation
const pocket = POCKETS[Math.floor(float * 15)];
টাওয়ার
একটি টাওয়ার খেলা 9টি আলাদা গেম ইভেন্ট নিয়ে তৈরি হয়, যা টাওয়ারের স্তরের আকারে। আমরা প্রতিটি স্তরের জন্য কঠিনতার উপর ভিত্তি করে একটি নির্দিষ্ট সংখ্যক ডিম তৈরি করি এবং ডিম যে টাইলগুলিতে থাকতে পারে, তা পূর্ণসংখ্যার আকারেও উপস্থাপন করা হয়।
প্রতিটি উৎপন্ন ফ্লোটকে পূর্ণসংখ্যায় রূপান্তরিত করা হয় যাতে প্রতিটি সারিতে ডিমের অবস্থান নির্ধারণ করা যায়। উদাহরণস্বরূপ: সহজ স্তরে এটি এভাবে চিত্রিত করা হবে: [0, 1, 3] - ডিমগুলি টাইল 1, 2 এবং 4 এ থাকবে।
// count represents the number of eggs
// size represents the number of possible squares
const LEVEL_MAP = {
easy: { count: 3, size: 4 },
medium: { count: 2, size: 3 },
hard: { count: 1, size: 2 },
expert: { count1, size: 3 },
master: { count: 1, size: 4 },}
ফিশার-ইয়েটস শাফল বাস্তবায়ন একই সারিতে ডুপ্লিকেট ডিম প্রতিরোধ করতে ব্যবহৃত হয়।