如何在c#中解决我的机器人干扰?

我发了一封电报Bot。 事实上,机器人是一个游戏,玩猜猜某些词。但问题是当我将机器人添加到两个不同的组(作为管理员)或两个用户电报,分别使用机器人和启动机器人,放置影响他们一起玩的比赛。一个人在下一场比赛中受到干扰。 例如:如果john在Mobile中启动我的bot,而john的desired_word是Newyork,长度= 7,那么当sara在Mobile中启动我的机器人时。 约翰的Len_desiredwords例如成为5。

library = NetTelegramBotApi 4.0.0 vs = 2013 v4;

不知道该干什么。

码:

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using NetTelegramBotApi; using NetTelegramBotApi.Requests; using NetTelegramBotApi.Types; using System.Net.Http; using System.Runtime.Remoting.Channels; using System.Data; using System.Data.SqlClient; using System; using System.Collections; using System.Text; using System.Text.RegularExpressions; namespace WordsBot { class Program { private static string Token ="........."; private static ReplyKeyboardMarkup Menu1; static void Main(string[] args) { Task.Run(() => RunBot()); Console.ReadLine(); } public static async Task RunBot() { var bot = new TelegramBot(Token); // var updates = await bot.MakeRequestAsync(new GetUpdates() { Offset = offset }); var me = await bot.MakeRequestAsync(new GetMe()); Console.WriteLine("User Name is {0}", me.Username); long offset = 0; int whilecount = 0; while (true) { Console.WriteLine("while is {0}", whilecount); whilecount += 1; var updates = await bot.MakeRequestAsync(new GetUpdates() { Offset = offset }); Console.WriteLine("Update Count is {0} ", updates.Count()); Console.WriteLine("-------------------------------------"); try { string desired_word = ""; int Len_desiredwords = 0 ; char [] blank1=''; string b1=""; string [] blank2=""; foreach (var update in updates) { var text = update.Message.Text; offset = update.Id + 1; if (Text == "/start") { ds_GetDersiredWords = DAL.Get_DersiredWords(); dt_GetDersiredWords = ds_GetDersiredWords.Tables[0]; desired_word=dt_GetDersiredWords.Rows[0][1].tostring();// get word random of db Len_desiredwords = desired_word.Length; // count charachter of word blank1 = desired_word.tochararray();// string to chararray for (int ii=0;ii<Len_desiredwords;ii+)// insert charachter '_' in blank1 { blank1 [ii] = '_'; } for (int jj=0;jj<Len_desiredwords;jj++ ) { blank2 = blank2 + blank1 [jj]; } var q = new SendMessage(update.Message.Chat.Id, "please Enter one charachter\n desired_word ="+blank2 ); // send to user id in telegram message. await bot.MakeRequestAsync(q); continue; } else if (Text.length==1) // if Text = one Character { for (int xx=0;xx<Len_desiredwords;xx++) { if (blank1 [xx] =system.convert.char(text))// check if charachter entered is in blank1 chararray? or no? { correct= true; index1 = xx; blank1[index1] = System.Convert.ToChar(text); for(int yy= 0 ;yy<Len_desiredwords;yy++) { blank2 = blank2 + blank1 [yy]; } } else { continue; } } if (correct==true) { var q = new SendMessage(u.Message.Chat.Id,(update.Message.Chat.Id, "correct\n please Enter Next charachter\n desired_word ="+blank2 "); await bot.MakeRequestAsync(q); continue; } else if(correct!=true) { var q = new SendMessage(u.Message.Chat.Id,(update.Message.Chat.Id, "incorrect\n please Enter Next charachter\n desired_word ="+blank2 "); await bot.MakeRequestAsync(q); continue; } } else { continue; } } catch (Exception ex) { continue; } } } 

例子:

约翰运行并开始我的机器人,我的机器人在电报中发送给约翰:

 - Welcome to Guess the word Game. - please Enter one charachter - desired_word : _ _ _ _ _ - You have 10 chances. 

约翰通过电报发送一个charachter A.

text = A,如果A正确则将机器人发送给约翰

 - Good , Correct Charachter John. - please Enter Next charachter - desired_word : _ _ A _ _ - You have 9 chances. 

好 ?

现在是时候了,sara运行我的机器人并开始。 我的机器人在电报中发送sara:

 - Welcome to Guess the word Game. - please Enter one charachter - desired_word : _ _ _ _ _ _ _ _ _ - You have 18 chances. 

现在,john发送机器人,下一个charchater Z,我的机器人发送给约翰的电报:

 - Bad , False Charachter John. - please Enter Next charachter - desired_word : _ _ _ _ _ _ _ _ _ - You have 17 chances. 

!!!!

这些小组的电报分组完成,也可以单独完成。 也许是团体或个人。

正如@Andy Lamb在评论中写道,你的问题是你只管理一个“游戏”,所以每个玩家互相交流。

您必须找到一种方法来识别每封邮件的发件人,并为每位玩家管理“游戏”。

游戏对象应该是类的实例,维护链接到单个玩家游戏的所有数据(例如,desired_word等)。 你的while (true)循环应该是这样的:

 while (true) { var updates = await bot.MakeRequestAsync(new GetUpdates() { Offset = offset }); foreach(var update in updates) { var sender = GetSender(update); var game = RetrieveGameOrInit(sender); // ... rest of your processing, but your code is a little messy and // you have to figure out how to refactor the processing by yourself game.Update(update); // do something with game, and possibly remove it if it's over. } } public string GetSender(UpdateResponseOrSomething update) { // use the Telegram API to find a key to uniquely identify the sender of the message. // the string returned should be the unique identifier and it // could be an instance of another type, depending upon Telegram // API implementation: eg an int, or a Guid. } private Dictionary _runningGamesCache = new Dictionary(); public Game RetrieveGameOrInit(string senderId) { if (!_runningGamesCache.ContainsKey(senderId)) { _runningGamesCache[senderId] = InitGameForSender(senderId); } return _runningGamesCache[senderId]; } /// Game.cs public class Game { public string SenderId { get; set; } public string DesiredWord { get; set; } // ... etc public void Update(UpdateResponseOrSomething update) { // manage the update of the game, as in your code. } } 

希望能帮助到你!