ለ Dota 2014 ግጥሚያ በመጻፍ ላይ

ሰላም.

በዚህ የፀደይ ወቅት ወንዶቹ የዶታ 2 አገልጋይ ሥሪት 2014ን እንዴት ማሄድ እንደሚችሉ የተማሩበት እና በዚህ መሠረት በላዩ ላይ የሚጫወቱበት ፕሮጀክት አጋጥሞኛል። እኔ የዚህ ጨዋታ ትልቅ አድናቂ ነኝ፣ እናም ይህን ልዩ አጋጣሚ በልጅነቴ ውስጥ ለመጥለቅ አልቻልኩም።

እኔ በጣም በጥልቅ ርግቤያለሁ፣ እናም በአሮጌው የጨዋታው ስሪት ማለትም ግጥሚያ ላልተደገፉት ሁሉም ተግባራት ተጠያቂ የሆነ የ Discord bot ጻፍኩኝ።
ከቦት ጋር ከተደረጉት ሁሉም ፈጠራዎች በፊት፣ ሎቢው የተፈጠረው በእጅ ነው። ለመልእክት 10 ግብረመልሶችን ሰብስበን ሰርቨርን በእጅ ሰብስበናል ወይም የአካባቢ ሎቢ አስተናግደናል።

ለ Dota 2014 ግጥሚያ በመጻፍ ላይ

እንደ ፕሮግራም አድራጊ ተፈጥሮዬ ብዙ የእጅ ሥራዎችን መቋቋም አልቻልኩም፣ እና በአንድ ምሽት በጣም ቀላሉን የቦት ሥሪት ቀረጽኩ፣ ይህም 10 ሰዎች ሲኖሩ አገልጋዩን በራስ ሰር ከፍ አደረገው።

ወዲያውኑ በ nodejs ውስጥ ለመጻፍ ወሰንኩኝ, ምክንያቱም ፒቲንን በትክክል ስለማልወደው, እና በዚህ አካባቢ የበለጠ ምቾት ይሰማኛል.

ይህ ለ Discord ቦት መጻፍ የመጀመሪያ ልምዴ ነው፣ ግን በጣም ቀላል ሆኖ ተገኘ። ይፋዊው የ npm ሞጁል discord.js ከመልእክቶች ጋር አብሮ ለመስራት፣ ምላሾችን ለመሰብሰብ ወዘተ ምቹ የሆነ በይነገጽ ያቀርባል።

የኃላፊነት ማስተባበያ፡ ሁሉም የኮድ ምሳሌዎች “የአሁኑ” ናቸው፣ ይህ ማለት በምሽት ብዙ ድግግሞሾችን አልፈዋል።

የግጥሚያ መሰረቱ መጫወት የሚፈልጉ ተጫዋቾች የሚቀመጡበት እና ጨዋታ በማይፈልጉበት ጊዜ የሚወገዱበት “ወረፋ” ነው።

የ“ተጫዋች” ይዘት ይህንን ይመስላል። መጀመሪያ ላይ በ Discord ውስጥ የተጠቃሚ መታወቂያ ብቻ ነበር፣ ነገር ግን ከጣቢያው ላይ ጨዋታዎችን ለመጀመር/ለመፈለግ እቅድ ተይዟል፣ ነገር ግን መጀመሪያ ነገሮች ይቀድማሉ።

export enum Realm {
  DISCORD,
  EXTERNAL,
}

export default class QueuePlayer {
  constructor(public readonly realm: Realm, public readonly id: string) {}

  public is(qp: QueuePlayer): boolean {
    return this.realm === qp.realm && this.id === qp.id;
  }

  static Discord(id: string) {
    return new QueuePlayer(Realm.DISCORD, id);
  }

  static External(id: string) {
    return new QueuePlayer(Realm.EXTERNAL, id);
  }
}

እና የወረፋ በይነገጽ እዚህ አለ። እዚህ ከ "ተጫዋቾች" ይልቅ በ "ቡድን" መልክ ረቂቅ ጥቅም ላይ ይውላል. ለአንድ ነጠላ ተጫዋች ቡድኑ እራሱን እና በቡድን ውስጥ ላሉ ተጫዋቾች በቅደም ተከተል በቡድኑ ውስጥ ካሉት ተጫዋቾች ሁሉ ያካትታል።

export default interface IQueue extends EventEmitter {
  inQueue: QueuePlayer[]
  put(uid: Party): boolean;
  remove(uid: Party): boolean;
  removeAll(ids: Party[]): void;

  mode: MatchmakingMode
  roomSize: number;
  clear(): void
}

አውድ ለመለዋወጥ ክስተቶችን ለመጠቀም ወሰንኩ። ለጉዳዮች ተስማሚ ነበር - በዝግጅቱ ላይ “ለ 10 ሰዎች ጨዋታ ተገኝቷል” ፣ አስፈላጊውን መልእክት በግል መልዕክቶች ውስጥ ለተጫዋቾቹ መላክ እና መሰረታዊ የንግድ ሥራ አመክንዮዎችን ማከናወን ይችላሉ - ዝግጁነትን ለመፈተሽ ተግባር ይጀምሩ ፣ ሎቢውን ያዘጋጁ ለማስጀመር እና ወዘተ.

ለ IOC እኔ ኢንቨርስፋይጄኤስን እጠቀማለሁ። ከዚህ ቤተ መፃህፍት ጋር በመስራት አስደሳች ተሞክሮ አለኝ። ፈጣን እና ቀላል!

በአገልጋያችን ላይ ብዙ ወረፋዎች አሉን - 1x1፣ መደበኛ/ደረጃ የተሰጠው እና ሁለት ብጁ ሁነታዎችን ጨምረናል። ስለዚህ በተጠቃሚ እና በጨዋታ ፍለጋ መካከል ያለ ነጠላ የክፍል አገልግሎት አለ።

constructor(
    @inject(GameServers) private gameServers: GameServers,
    @inject(MatchStatsService) private stats: MatchStatsService,
    @inject(PartyService) private partyService: PartyService
  ) {
    super();
    this.initQueue(MatchmakingMode.RANKED);
    this.initQueue(MatchmakingMode.UNRANKED);
    this.initQueue(MatchmakingMode.SOLOMID);
    this.initQueue(MatchmakingMode.DIRETIDE);
    this.initQueue(MatchmakingMode.GREEVILING);
    this.partyService.addListener(
      "party-update",
      (event: PartyUpdatedEvent) => {
        this.queues.forEach((q) => {
          if (has(q.queue, (t) => t.is(event.party))) {
            // if queue has this party, we re-add party
            this.leaveQueue(event.qp, q.mode)
            this.enterQueue(event.qp, q.mode)
          }
        });
      }
    );

    this.partyService.addListener(
      "party-removed",
      (event: PartyUpdatedEvent) => {
        this.queues.forEach((q) => {
          if (has(q.queue, (t) => t.is(event.party))) {
            // if queue has this party, we re-add party
            q.remove(event.party)
          }
        });
      }
    );
  }

(ሂደቶቹ ምን እንደሚመስሉ ለማወቅ ኮድ ኑድልል)

እዚህ ለእያንዳንዱ የተተገበሩ የጨዋታ ሁነታዎች ወረፋውን አስጀምራለሁ, እና እንዲሁም ወረፋዎችን ለማስተካከል እና አንዳንድ ግጭቶችን ለማስወገድ በ "ቡድኖች" ላይ ለውጦችን አዳምጣለሁ.

ስለዚህ፣ በደንብ ተከናውኗል፣ ከርዕሱ ጋር ምንም ግንኙነት የሌላቸውን የኮድ ቁርጥራጮች አስገባሁ፣ እና አሁን በቀጥታ ወደ ግጥሚያ እንሂድ።

ጉዳዩን እናስብ፡-

1) ተጠቃሚው መጫወት ይፈልጋል.

2) ፍለጋውን ለመጀመር, Gateway= Discord ይጠቀማል, ማለትም ለመልእክቱ ምላሽ ይሰጣል.

ለ Dota 2014 ግጥሚያ በመጻፍ ላይ

3) ይህ መግቢያ በር ወደ RoomService ሄዶ "ከክርክር የመጣ ተጠቃሚ ወደ ወረፋ፣ ሁነታ: ደረጃ ያልተሰጠው ጨዋታ መግባት ይፈልጋል" ይላል።

4) RoomService የመተላለፊያ መንገዱን ጥያቄ ተቀብሎ ተጠቃሚውን (በይበልጥ በትክክል የተጠቃሚውን ቡድን) ወደሚፈለገው ወረፋ ይገፋዋል።

5) የሚጫወቱት በቂ ተጫዋቾች ባሉበት ቁጥር ወረፋው ይፈትሻል። ከተቻለ አንድ ክስተት መልቀቅ፡-

private onRoomFound(players: Party[]) {
    this.emit("room-found", {
      players,
    });
  }

6) RoomService ይህንን ክስተት በጉጉት በመጠባበቅ እያንዳንዱን ሰልፍ በደስታ እያዳመጠ ነው። የተጫዋቾች ዝርዝር እንደ ግብአት እንቀበላለን፣ ከነሱ ምናባዊ "ክፍል" እንፈጥራለን እና በእርግጥ አንድ ክስተት እንሰራለን፡

queue.addListener("room-found", (event: RoomFoundEvent) => {
      console.log(
        `Room found mode: [${mode}]. Time to get free room for these guys`
      );
      const room = this.getFreeRoom(mode);
      room.fill(event.players);

      this.onRoomFormed(room);
    });

7) ስለዚህ ወደ "ከፍተኛ" ባለስልጣን - ክፍል ደረስን bot. በአጠቃላይ እሱ በመግቢያ መንገዶች (በሩሲያኛ ምን ያህል አስቂኝ እንደሚመስል ሊገባኝ አልቻለም) እና የግጥሚያ ንግድ ሎጂክ መካከል ያለውን ግንኙነት ይመለከታል። ቦቱ ክስተቱን ሰምቶ ለሁሉም ተጠቃሚዎች ዝግጁነት ፍተሻ እንዲልክ DiscordGateway ያዝዛል።

ለ Dota 2014 ግጥሚያ በመጻፍ ላይ

8) አንድ ሰው ጨዋታውን በ 3 ደቂቃ ውስጥ ካልተቀበለው ወይም ካልተቀበለው ወደ ወረፋው አንመልሰውም። ሁሉንም ወደ ወረፋው እንመልሳለን እና እንደገና 10 ሰዎች እስኪኖሩ ድረስ እንጠብቃለን። ሁሉም ተጫዋቾች ጨዋታውን ከተቀበሉ አስደሳችው ክፍል ይጀምራል።

የወሰኑ አገልጋይ ውቅር

የእኛ ጨዋታዎች በ VDS ከዊንዶውስ አገልጋይ 2012 ጋር ይስተናገዳሉ ። ከዚህ በመነሳት ብዙ ድምዳሜዎችን ማድረግ እንችላለን-

  1. በእሱ ላይ ምንም ዶከር የለም, እሱም ልቤን ነካኝ
  2. በኪራይ እንቆጥባለን

ስራው በሊኑክስ ላይ ከ VPS በ VDS ላይ ሂደትን ማካሄድ ነው. በፍላስክ ውስጥ ቀላል አገልጋይ ጻፍኩ። አዎ፣ Python አልወደውም፣ ግን ምን ማድረግ ትችላለህ? ይህን አገልጋይ በላዩ ላይ መፃፍ ፈጣን እና ቀላል ነው።

እሱ 3 ተግባራትን ያከናውናል-

  1. ውቅረት ያለው አገልጋይ መጀመር - ካርታ መምረጥ ፣ ጨዋታውን ለመጀመር የተጫዋቾች ብዛት እና የተሰኪዎች ስብስብ። አሁን ስለ ተሰኪዎች አልጽፍም - ያ የተለየ ታሪክ ነው በሊትር ቡና ሌሊት ከእንባ እና ከተቀደደ ፀጉር ጋር ተደባልቆ።
  2. ያልተሳኩ ግንኙነቶች ሲኖሩ አገልጋዩን ማቆም/እንደገና ማስጀመር፣ ይህም በእጅ ብቻ ነው የምንይዘው።

እዚህ ሁሉም ነገር ቀላል ነው, የኮድ ምሳሌዎች እንኳን ተገቢ አይደሉም. 100 መስመር ስክሪፕት

ስለዚህ 10 ሰዎች ተሰብስበው ጨዋታውን ሲቀበሉ አገልጋዩ ተጀመረ እና ሁሉም ለመጫወት ጓጉቷል ከጨዋታው ጋር የሚገናኙበት አገናኝ በግል መልእክት ተልኳል።

ለ Dota 2014 ግጥሚያ በመጻፍ ላይ

አገናኙን ጠቅ በማድረግ ተጫዋቹ ከጨዋታ አገልጋይ ጋር ይገናኛል, እና ያ ነው. ከ ~ 25 ደቂቃዎች በኋላ, ከተጫዋቾች ጋር ያለው ምናባዊ "ክፍል" ይጸዳል.

ለጽሁፉ አስከፊነት አስቀድሜ ይቅርታ እጠይቃለሁ, እዚህ ለረጅም ጊዜ አልጻፍኩም, እና አስፈላጊ ክፍሎችን ለማጉላት በጣም ብዙ ኮድ አለ. ኑድል ፣ በአጭሩ።

በርዕሱ ላይ ፍላጎት ካየሁ ፣ ሁለተኛ ክፍል ይኖራል - ስቃዬን ይይዛል ለ srcds (ምንጭ የወሰነ አገልጋይ) እና ምናልባትም ፣ የደረጃ አሰጣጥ ስርዓት እና ሚኒ-dotabuff ፣ የጨዋታ ስታቲስቲክስ ያለው ጣቢያ።

አንዳንድ አገናኞች፡-

  1. የእኛ ድረ-ገጽ (ስታቲስቲክስ፣ የመሪዎች ሰሌዳ፣ ትንሽ ማረፊያ ገጽ እና ደንበኛ ማውረድ)
  2. Discord አገልጋይ

ምንጭ: hab.com

አስተያየት ያክሉ