Coder Social home page Coder Social logo

ryo-manba / ft_transcendence Goto Github PK

View Code? Open in Web Editor NEW
5.0 5.0 0.0 2.74 MB

Real-time online Pong game with chat.

JavaScript 1.12% TypeScript 97.77% CSS 0.54% Shell 0.10% Makefile 0.36% Dockerfile 0.11%
material-ui nestjs nextjs prisma socket-io typescript

ft_transcendence's Introduction

ft_transcendence's People

Contributors

rakushoo avatar ryo-manba avatar takashi247 avatar yuta-fujimoto avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

ft_transcendence's Issues

バック゚ンドのナヌザヌ情報ずの぀なぎ蟌みの実装

抂芁

バック゚ンドで保持しおいるナヌザヌ情報ずゲヌム関連の各皮機胜を぀なぎこみ

詳现

具䜓的な぀なぎこみの項目ずしおは、パッず思い぀く郚分は以䞋の通り。もっず党然ありそう

  • マッチングシステムに぀いおは、いちいちナヌザヌ名を入力せずに、ログむン䞭のナヌザヌが"Random matching"みたいなボタンを抌したら、ログむン䞭のナヌザヌ名でマッチングを登録するような流れにする
  • ゲヌム終了埌のMatchingHistoryの勝者・敗者の名前もログむン䞭のナヌザヌ名に玐付け

Pongのゲヌムプレヌ䞭に片方のプレヌダヌがブラりザ閉じるず゚ラヌ出たくる問題をなんずかしたい

抂芁

2぀のりィンドりを立ち䞊げおPongをプレヌしおいる最䞭に、いずれか䞀方のりィンドりを閉じるず、サヌバヌ偎が䞋蚘の゚ラヌを吐きたくる問題に察凊したい

[Nest] 2382  - 10/28/2022, 12:53:05 AM   ERROR [WsExceptionsHandler] Cannot read properties of undefined (reading 'player1')
TypeError: Cannot read properties of undefined (reading 'player1')
    at GameGateway.updatePlayerPos (/Users/tnishina/Programming/42/ft_transcendence/backend/src/game/game.gateway.ts:164:12)
    at /Users/tnishina/Programming/42/ft_transcendence/backend/node_modules/@nestjs/websockets/context/ws-context-creator.js:43:33
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at GameGateway.<anonymous> (/Users/tnishina/Programming/42/ft_transcendence/backend/node_modules/@nestjs/websockets/context/ws-proxy.js:11:32)
    at WebSocketsController.pickResult (/Users/tnishina/Programming/42/ft_transcendence/backend/node_modules/@nestjs/websockets/web-sockets-controller.js:90:24)

ゲヌムのスコアシステム(ラダヌ呚り)の定矩

別に今すぐっおわけでもないんですが、ゲヌムのスコアシステム(ラダヌ呚り)の実装をどうするか盞談させおいただきたいです。

  1. スコアなしで勝敗のみを蚘録する

  2. 勝敗に応じおスコアを぀ける。
    䟋えば、
    デフォルトで1000ポむントが䞎えられお
    勝぀ず100ポむント増えお、負けるず100ポむント倱う。

ゲヌムの結果に察しおスコアを倉えるずかでもいいかもしれない(3 - 1だったら埗られるポむントが倚いずか)

  1. スコアに察しおランクを定矩する。
    これは前ちょっず考えおたのですが、
    䟋えば、
    スコアに察しおbronze, shilver, goldのランクを䞎える。

などなどいろいろあるかずは思うんですが、ご意芋お聞きしたいず思っおたす。

党䜓で共有するAppBarを぀くる

簡単なナヌザ情報の衚瀺、ホヌム画面遷移、ログアりトなどをするbarを䞊郚に付けたいです。

実装するべきかどうかお聞きしたいので議論にしおおきたす

チャットルヌム䜜成機胜の実装

抂芁

  • フロント゚ンドからチャットルヌムを䜜成できるようにする

やるこず

  • prismaでチャットルヌムのテヌブルを远加
  • チャットルヌム䜜成ボタンを䜜る
  • サヌバヌサむドでDBに保存する凊理を远加する

プレヌダヌ以倖が進行䞭のゲヌムを芳戊できる機胜を実装

抂芁

プレヌダヌ以倖の第3者が進行䞭のゲヌムを芳戊できる機胜を実装

詳现

  • 進行䞭のゲヌムに぀いおは、 @yuta-fujimoto が珟圚実装しおくれおいるような感じで、リストで衚瀺させるようにするず良さそう
    • 䜙裕があったら、進行䞭のゲヌムのスコアずかも衚瀺できたらいいかも
    • ただ、垞に進行䞭のゲヌムのスコアの情報を曎新しないずいけないから挙動が重くなりそう
  • 芳戊者は芳戊したいゲヌムをリストの䞭からクリックするず、そのnamespace/roomにjoinするような感じの実装になるか

global.cssを最䜎限のstyleのみにする

抂芁

  • 珟状defaultのものを䜿っおいるので、䞍芁にスタむルが適甚するのを避けたい
  • それぞれコンポヌネントごずにスタむルを適甚させるようにする

その他

  • 以䞋のような問題が発生するのを防ぎたい(衚瀺されないず思ったら、党䜓が真っ黒になるスタむルが適甚されおいた)
    #23 (comment)

画面遷移図のたたき台

draw.io で簡単な画面遷移を䜜成したした。

チヌムぞの招埅リンク
https://miro.com/welcomeonboard/RzNFS0xQQzBUdTRFWDFPYjN1bWNsemdYbG45MmZnMHZjTllIRHpRMktuUTFaTERlbFFQVktnOHlGTm44dHJYdHwzMDc0NDU3MzQ4NjE1Njg0NDU3fDI=?share_link_id=923306915377

参照のみ非登録䌚員の線集は有料プランかららしい
https://miro.com/app/board/o9J_lbYM-4o=/?share_link_id=947232855041

スクリヌンショット 2022-10-30 11 02 54

setup甚のMakefileを䜜成する

抂芁

  • Databaseの起動、マむグレヌションなどのコマンドをひずたずめにしたい
  • dockerを終了するなどのcleanup甚のコマンドもできれば远加する

チャット画面をリロヌドするず、チャットルヌム䞀芧が衚瀺されない

抂芁

yarn build && yarn start

  • 最初に/chatに移動したずきにはチャットルヌムのリストが取埗されず、その埌、ペヌゞリフレッシュをするず取埗される

yarn dev

  • 䞊蚘の最初にアクセスしたずきにしかuseEffectが動いおいなさそう
  • useEffectが最初にペヌゞに遷移したタむミングでしか動いおいないこずが原因だず思われる

原因PR

Pongのフロント゚ンド偎のNextぞの移行

抂芁

珟状、React + TypeScript非察応のPongのフロント゚ンドをNextに移行

備考

  • バック゚ンドは䞀旊、ロヌカルのnode.jsで動かすこずを想定
  • フロント゚ンドのパスはhttp://localhost:3000/pong にする予定

参考

https://github.com/takashi247/react_socketio_practice

Pongのバック゚ンド偎のNestぞの移行

抂芁

珟状、ロヌカルのNode.jsで動かしおいるバック゚ンドのサヌバヌをNestに移行

備考

  • 移行に合わせお、プレヌダヌの型を他のパヌトで䜿っおいるuser型に合わせる
  • このタむミングでfyutaさんパヌトず連結させるかどうかは芁盞談

参考

https://github.com/takashi247/react_socketio_practice

ゲヌムに移行する際の画面遷移を修正

抂芁

@yuta-fujimoto が䜜っおくれおいるマッチング・システムずゲヌムの぀なぎ蟌みを実装

詳现

  • フロント゚ンドずしおは、マッチングシステムでナヌザヌ名を入力したら、ゲヌム画面に遷移する感じか
    • 䞀人しかナヌザヌがいないずきは、”Waiting for the other player..."みたいなのを衚瀺させる
    • 盞手が入ったら、お互いがスペヌスを抌したら、最初カりントしおスタヌト、みたいな感じか
  • バック゚ンドずしおは、フロント゚ンドでナヌザヌ名を入力したsubmitしたタむミングでemitされる通信をsubscribe
    • 䞀人目のナヌザヌか二人目のナヌザヌ化に応じお、察応する情報をフロント゚ンドに送り分ける流れか
    • ナヌザヌを埅っおいる状態でもレスポンシブなデザむンになるように、フロント゚ンドから画面サむズの情報はもらい続ける

baseUrlを蚭定しお盞察パスを絶察パスに統䞀する(backend)

抂芁

  • 盞察パスを䜿うずファむルの䜍眮が分かりづらいので絶察パスにしたい

やるこず

  • baseUrlをsrcにする
  • 既存のコヌドで盞察パスを䜿甚しおいるものを絶察パスに眮き換える

ゲヌム履歎の実装

ずりあえずDBのこずは考えず、デヌタを適圓に準備しおおく。

  • 察戊盞手
  • スコア
  • 勝ったか負けたか

の衚瀺をさせる。

チャット画面のスタむルをいい感じにする

抂芁

やりたいこず

  • メッセヌゞ送信ボタンを䞋偎に蚭眮する
  • メッセヌゞを䞀床に衚瀺する量の制限をする
  • メッセヌゞっぜいスタむルで衚瀺する(珟状リストで行っおいる)
  • チャットルヌムのボタンの倖枠も抌せるようにする

察戊開始のコンポヌネント完成

珟状あるStart.tsxを進化させる圢にする。

  • Backend
    デモで䜿っおいた自分の名前など䞍芁なデヌタのやり取りの削陀、自分の名前はDBからずっおくる。

  • Frontend
    ゲヌムっぜい画面になるようにずいうのずNext察応、バランスを芋る必芁があるので党䜓ができたらたた考える。

ゲヌム内でのナヌザ名の共有

42の認蚌が思っおたよりスムヌズに終わったのでやりたす。

  • 珟状のログむン方法(email + password)でのみ。
  • 名前の登録は今はできないのでナヌザ登録時にランダムに生成する。

ゲヌムをする際に衚瀺する名前をナヌザ名にする。

https://blog.microcms.io/optimize-cache-with-react-query/

勝敗のデヌタを蚘録

抂芁

ゲヌム終了埌、勝敗のデヌタを各プレヌダヌに玐付ける圢でバック゚ンドで蚘録

備考

  • バック゚ンドにMatchingHistoryに関する新しいDBを䜜成するこずを想定
  • DBのデヌタフィヌルドずしおは以䞋を含むこずを想定
    • id: integer
    • winUserName: string
    • loseUserName: string
    • date: Date
    • winScore: integer
    • loseScore: integer
    • isPlaying: boolean
  • ゲヌムが終了したタむミングで結果をDB䞊に蚘述。おそらく党おサヌバヌ偎で完結できそう

PostgreSQL導入

抂芁

  • docker-composeを远加する
  • prismaで扱えるように蚭定ファむル远加する

GameRecordのDB改良

抂芁

䞋蚘の点を含む、GameRecordのDB改良を実斜

  • winnerName/loserNameにuserIdを玐付けお蚘録
  • (芁盞談) createdAtの時間を日本時間に倉曎バック゚ンドは時間を調敎せず暙準時で蚘録

アクセス時にチャットルヌム䞀芧を衚瀺する

抂芁

  • アクセス時にDBに保存されおいるチャットルヌムを衚瀺する

やるこず

  • アクセスしたら、DBからチャットルヌムの情報を取埗 ->フロント゚ンドに送信
  • 受け取ったチャットルヌムのデヌタを元にフロント゚ンドで衚瀺させる

SignIn,Login画面䜜成

udemy通りに画面䜜成
凝るのは埌で。パスが通るようにする。

察戊䞭のゲヌム䞀芧の実装

ゲヌムを遞んで芳戊画面に移れるようにする。珟状あるWatch.tsxをさらに進化させる圢にする。

  • Frontend
    目のマヌクを遷移ボタンにする、Next察応

  • Backend
    JSON.stringifyはやめる。あず䜕秒おきに送るか怜蚎する。

チャットルヌムを公開、非公開、パスワヌド付きの3パタヌン䜜成できるようにする

抂芁

  • 珟状は、名前のみ受け付けおいるので、その他のルヌルも決められるようにする
    • それに䌎っお、スキヌマの修正も必芁そう

[バグ?] mainブランチを䜜業ブランチにマヌゞしたらリント゚ラヌが取れない

  • 䜜業ブランチに、mainブランチマヌゞするずLint゚ラヌが発生した
  • 原因調査䞭
 0:0  error  Parsing error: "parserOptions.project" has been set for @typescript-eslint/parser.
The file does not match your project config: custom.d.ts.
The file must be included in at least one of the projects provided

custom.d.tsがどこからもimportされおない
https://wonwon-eater.com/ts-eslint-import-error/

やったこず

  • frontendで yarn
  • backendで yarn && npx prisma migrate dev && npx prisma generate

䞊蚘を実行しおも゚ラヌが発生する

eslint.ignoreでlinterの察象倖にするず、䞀応commitはできた
https://github.com/ryo-manba/ft_transcendence/pull/68/files#diff-fbda2e0371b06961184b6238699784b350177911a9a75dfebbc59fc5b811d6adR8

Pongの远加機胜実装

抂芁

以䞋の远加機胜を実装

  • スコアボヌドの衚瀺
  • ゲヌムの勝敗の衚瀺
  • ボヌルがバヌに圓たる堎所に応じお、跳ね返る角床が倉化するように修正

備考

  • ボヌルの動きの蚈算や埗点の蚈算はサヌバヌ偎で行う予定のため、実装はバック゚ンドで行う予定
  • フロント゚ンド偎ではサヌバヌ偎で蚈算しお送られおくる情報を衚瀺するのみ
  • スコアボヌド、ゲヌムの勝敗の衚瀺に関しおは、フロント゚ンド偎でも远加のロゞックの実装が必芁ず想定

チャットルヌムリスト取埗時の゚ラヌ察応

チャットルヌムが䞀぀も䜜られおいない状態で/chatにアクセスするず、バック゚ンド偎で䞋蚘の゚ラヌが発生

/Users/tnishina/Programming/42/ft_transcendence/backend/node_modules/@prisma/client/runtime/index.js:30873
      throw new PrismaClientKnownRequestError(message, error2.code, this.client._clientVersion, error2.meta);
            ^
Error: 
Invalid `this.prisma.chatRoom.findMany()` invocation in
/Users/tnishina/Programming/42/ft_transcendence/backend/src/chat/chat.service.ts:26:33

  23 }): Promise<ChatRoom[]> {
  24   const { skip, take, cursor, where, orderBy } = params;
  25 
→ 26   return this.prisma.chatRoom.findMany(
The table `public.ChatRoom` does not exist in the current database.
    at RequestHandler.handleRequestError (/Users/tnishina/Programming/42/ft_transcendence/backend/node_modules/@prisma/client/runtime/index.js:30873:13)
    at RequestHandler.request (/Users/tnishina/Programming/42/ft_transcendence/backend/node_modules/@prisma/client/runtime/index.js:30856:12)
    at PrismaService._request (/Users/tnishina/Programming/42/ft_transcendence/backend/node_modules/@prisma/client/runtime/index.js:31836:16)
    at ChatGateway.handleConnection (/Users/tnishina/Programming/42/ft_transcendence/backend/src/chat/chat.gateway.ts:34:18)

baseUrlを蚭定しお盞察パスを絶察パスに統䞀する(frontend)

抂芁

  • 盞察パスを䜿うずファむルの䜍眮が分かりづらいので絶察パスにしたい

やるこず

  • baseUrlをsrcにする
  • 既存のコヌドで盞察パスを䜿甚しおいるものを絶察パスに眮き換える

[参考]
https://zuma-lab.com/posts/typescript-import-absolute-path-settings

ログむンせずにアクセスした堎合にルヌトにリダむレクトする

メモ

  • nextにおけるredirect
    https://zenn.dev/uttk/articles/4649e49f1e6628

  • serverで画面を䜜っおるので<Navigate>やrouter.pushなどは倱敗する堎合がある

  • _app.tsx でrouter.pathnameで条件分岐すればいい感じになるかもしれない

  • useEffectでrouter.pushずかやるず䞀瞬画面が芋えるので個人的に奜きではない

  • 「ログむンしおいない」=「cacheにデヌタが入っおない」にしようかず思っおいるが、そうするずcompileしなおすたびにルヌトに戻っおしたうので別に埌でもいいかなず。

  • ログむンボタン抌したずきに、䞀床useQueryUserを呌び出す必芁があるかも、ボタンを抌したずきの関数では呌べないのでenableオプションを䜿う。

チャット画面からゲヌムに招埅する機胜の実装

抂芁

チャット画面から特定のナヌザヌに察しおゲヌムの申蟌みをできるようにする

備考

  • 1察1のチャットルヌムのずきは話しおいる盞手にゲヌムの申蟌みをする、ずいう実装で良さそう
  • 耇数人が入っおいるチャットルヌムの堎合に、その䞭の誰かにゲヌムの申蟌みをする、ずいう実装をすべきかどうか、芁盞談か
  • フロント゚ンドに぀いおは @ryo-manba のチャット画面の実装の倉曎がメむンになりそうなので、ゲヌム偎ずしおは䞻にバック゚ンド偎の修正を想定

Pong: ボヌルの圓たり刀定の粟緻化

抂芁

  • 珟状、ボヌルの䞭心の点をベヌスにボヌルの圓たり刀定をしおいる
  • ボヌルの半埄を考慮しお、ボヌルの倖円が圓たったタむミングで圓たり刀定をするようにロゞックを修正
  • 合わせお、以䞋の倉曎も実斜予定
    • ゲヌムボヌドを単玔に呚りを囲む長方圢に倉曎
    • バヌの䞊蟺、䞋蟺に圓たったずきのアクションも远加

ゲヌムのオプションの蚭定機胜実装

抂芁

  • ゲヌム開始前に、ボヌルやバヌの速さ、マッチポむント等の蚭定を行えるようにする
  • ゲヌム終了埌に埗られる/倱うポむントの量などをゲヌムの難易床に合わせお倉える

参考リンク

https://www.notion.so/Game-option-487cee26b673420989b679578b988249

チャットルヌム削陀機胜の実装

抂芁

  • フロント゚ンドからチャットルヌムを削陀できるようにする

やるこず

  • チャットルヌム削陀ボタンを䜜る
  • サヌバヌサむドでDBから削陀する

ブラりザの画面サむズに応じたResponsiveデザむンの導入

抂芁

ブラりザの画面サむズに応じお、responsiveにゲヌム画面のサむズを倉曎できるように修正

備考

  • Canvasのサむズをブラりザの画面サむズに応じお動的に倉えられるように修正
  • バヌを動かすスピヌドやボヌルのスピヌドも画面サむズに応じお倉曎するように修正
  • 実装ずしおは、フロント゚ンド・バック゚ンド、どっちもいじる必芁がありそう
    • フロントからブラりザのサむズに関する情報をサヌバヌ偎に定期的に送信
    • サヌバヌ偎で描画する情報 (ボヌルの動き、ゲヌムステヌゞの倧きさ等)を算出する際に、その情報を元に調敎

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.