SHARE
TWEET

Hangman.cs

frnathan13 Sep 19th, 2019 (edited) 101 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using DSharpPlus;
  2. using DSharpPlus.CommandsNext;
  3. using DSharpPlus.Entities;
  4. using DSharpPlus.Interactivity;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10.  
  11. namespace SkyLar.Entities.Games
  12. {
  13.     public class HangmanGame
  14.     {
  15.         private string _id;
  16.         private InteractivityExtension _interactivity;
  17.         private CommandContext ctx;
  18.         private string _word;
  19.         private char[] _word_temp;
  20.         private int _index;
  21.  
  22.         public static Task StartAsync(CommandContext context, string word)
  23.             => new HangmanGame(context, word).StartAsync();
  24.  
  25.         HangmanGame(CommandContext context, string word)
  26.         {
  27.             _id = $"{new Random().Next(10000, 99999):x2}";
  28.             ctx = context;
  29.             _interactivity = context.Client.GetInteractivity();
  30.  
  31.             _word = word;
  32.             _word_temp = new char[word.Length];
  33.  
  34.             for (var i = 0; i < word.Length; i++)
  35.             {
  36.                 if(char.IsWhiteSpace(word[i]))
  37.                     _word_temp[i] = ' ';
  38.                 else
  39.                     _word_temp[i] = '_';
  40.             }
  41.  
  42.             _index = 1;
  43.         }
  44.  
  45.         public async Task StartAsync()
  46.         {
  47.             if (_interactivity == null)
  48.             {
  49.                 await ctx.RespondAsync($"{ctx.User.Mention} :x: Módulo de interatividade não encontrado.");
  50.                 return;
  51.             }
  52.  
  53.             // sample embed
  54.             var deb = new DiscordEmbedBuilder()
  55.                 .WithDescription(Formatter.Sanitize(new string(_word_temp)) + ": [" + (_index + 1) + "/7]")
  56.                 .WithAuthor("SkyLar: Hangman", iconUrl: ctx.Client.CurrentUser.GetAvatarUrl(ImageFormat.Png))
  57.                 .WithFooter($"Jogando com {ctx.User.Username}#{ctx.User.Discriminator} | {_id}", ctx.User.GetAvatarUrl(ImageFormat.Jpeg))
  58.                 .WithColor(DiscordColor.Orange);
  59.  
  60.             // initial message
  61.             var msg = await ctx.RespondAsync(embed: deb);
  62.  
  63.         game:
  64.             {
  65.                 // wait for user input
  66.                 var xmsg = await _interactivity.WaitForMessageAsync(xm => xm.Author == ctx.User, TimeSpan.FromMinutes(1));
  67.  
  68.                 // is timeout? declare game ended
  69.                 if (xmsg.TimedOut)
  70.                 {
  71.                     await ctx.RespondAsync($"{ctx.User.Mention} :x: Tempo limite de jogo excedido.");
  72.                     return;
  73.                 }
  74.  
  75.                 // check if is valid content.
  76.                 if (string.IsNullOrEmpty(xmsg.Result.Content))
  77.                 {
  78.                     var xerr = await ctx.RespondAsync($"{ctx.User.Mention} :x: Você precisa fornecer uma letra.");
  79.                     await Task.Delay(3500);
  80.                     await xerr.DeleteAsync();
  81.  
  82.                     // go back to game, if message content isn't valid, just "warn" to user.
  83.                     goto game;
  84.                 }
  85.  
  86.                 // used to store if user match letter in word.
  87.                 var _state = false;
  88.  
  89.                 // current user input letter
  90.                 var _letter = xmsg.Result.Content.First();
  91.  
  92.                 for (var i = 0; i < _word.Length; i++)
  93.                 {
  94.                     // match for insensitive case char
  95.                     if (_letter == _word[i] || char.ToUpperInvariant(_letter) == _word[i] || char.ToLowerInvariant(_letter) == _word[i])
  96.                     {
  97.                         _word_temp[i] = _word[i];
  98.                         _state = true;
  99.                     }
  100.                 }
  101.  
  102.                 try
  103.                 {
  104.                     // delete user input
  105.                     await xmsg.Result.DeleteAsync();
  106.                 }
  107.                 catch { /* prevent exception thrown if bot has no permission to manage messages */ }
  108.  
  109.                 // check if final word is current built word
  110.                 if (new string(_word_temp) == _word)
  111.                 {
  112.                     await msg.DeleteAsync();
  113.                     await ctx.RespondAsync($"{ctx.User.Mention} :tada: Parabéns... Você venceu!"); // declare victory.
  114.                     return; // stop "game" label.
  115.                 }
  116.  
  117.                 // no tries :( user lost.
  118.                 if (_index > 7)
  119.                 {
  120.                     await msg.DeleteAsync();
  121.                     await ctx.RespondAsync($"{ctx.User.Mention} :cry: Infelizmente você não acertou! A palavra era `{Formatter.Sanitize(_word)}`");
  122.                     return; // stop "game" label.
  123.                 }
  124.  
  125.                 // increment tries if has no letter match in final word
  126.                 if (!_state)
  127.                     _index++;
  128.  
  129.                 // update embed with matched letters and tries count.
  130.                 deb.WithDescription(Formatter.Sanitize(new string(_word_temp)) + ": [" + (_index) + "/7]");
  131.                 await msg.ModifyAsync(embed: deb.Build());
  132.  
  133.                 // go back to next "round"
  134.                 goto game;
  135.             }
  136.         }
  137.     }
  138. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!
 
Top