Compare commits

...

2 Commits

Author SHA1 Message Date
cubernetes 31d9adcb62 README terms 2023-08-11 05:59:07 +02:00
cubernetes d9261a9c99 Done 2023-08-11 05:55:36 +02:00
19 changed files with 54 additions and 13 deletions

6
README.md Normal file
View File

@ -0,0 +1,6 @@
# in XTERM
- vt100: mono blink
- xterm-mono: mono
- xterm-256color: white color
- screen: white color black blink
- linix: white color black blink

Binary file not shown.

BIN
assets/sound/lost.mp3 Normal file

Binary file not shown.

BIN
assets/sound/rick.mp3 Normal file

Binary file not shown.

BIN
assets/video/rick.mp4 Normal file

Binary file not shown.

BIN
assets/video/rick2.mp4 Normal file

Binary file not shown.

22
game.py
View File

@ -2,6 +2,7 @@
import sys import sys
import random import random
import psutil
import numpy as np import numpy as np
import cv2 import cv2
@ -102,6 +103,7 @@ def show_frame(frame: np.ndarray, to_stdout: bool=False) -> None:
def main() -> int: def main() -> int:
music = start_game_sfx() music = start_game_sfx()
music_p = psutil.Process(pid=music.pid)
capture: VideoCapture = cv2.VideoCapture(0) capture: VideoCapture = cv2.VideoCapture(0)
hands: mp.solutions.hands.Hands = mp_hands.Hands(max_num_hands=1) hands: mp.solutions.hands.Hands = mp_hands.Hands(max_num_hands=1)
@ -115,6 +117,7 @@ def main() -> int:
finger_y: int = -1 finger_y: int = -1
no_collect_ratio = 0 no_collect_ratio = 0
no_finger_ratio = 0 no_finger_ratio = 0
timer = 100
i: int = 0 i: int = 0
while True: while True:
@ -124,6 +127,8 @@ def main() -> int:
if not success: if not success:
continue continue
ratio = max(no_finger_ratio, no_collect_ratio)
frame = cv2.addWeighted(frame, 1 - ratio, np.ones(frame.shape, dtype=frame.dtype), ratio, 0)
if i > 30: if i > 30:
if collected_42: if collected_42:
collected_42 = False collected_42 = False
@ -139,7 +144,7 @@ def main() -> int:
img42_y + rand_noise_y : img42_y + img42_side_len + rand_noise_y, img42_y + rand_noise_y : img42_y + img42_side_len + rand_noise_y,
img42_x + rand_noise_x : img42_x + img42_side_len + rand_noise_x, img42_x + rand_noise_x : img42_x + img42_side_len + rand_noise_x,
] = img42 ] = img42
no_collect_ratio = min(i, 200) / 200 no_collect_ratio = min(i, timer) / timer
finger_positions = list(get_finger_positions(frame, hands, add_landmarks=True)) finger_positions = list(get_finger_positions(frame, hands, add_landmarks=True))
if finger_positions == []: if finger_positions == []:
@ -147,12 +152,12 @@ def main() -> int:
no_finger_ratio = min(no_fingers, 255) / 255 no_finger_ratio = min(no_fingers, 255) / 255
else: else:
no_fingers = 0 no_fingers = 0
if no_fingers > 255:
music.kill()
return score
ratio = max(no_finger_ratio, no_collect_ratio) if ratio > 0.99:
frame = cv2.addWeighted(frame, 1 - ratio, np.ones(frame.shape, dtype=frame.dtype), ratio, 0) music.kill()
lost_sfx()
return score
for positions in finger_positions: for positions in finger_positions:
index_knuckle_1_pos: tuple[int, int] = (-1, -1) index_knuckle_1_pos: tuple[int, int] = (-1, -1)
@ -176,6 +181,11 @@ def main() -> int:
collected_42 = True collected_42 = True
i = 0 i = 0
score += 42 score += 42
if score == 4200 / 4: # that's 25 collects
music_p.suspend()
initiate_rick()
music_p.resume()
timer = 60 + (timer - 60) * .9
collect_sfx() collect_sfx()
show_frame(frame, to_stdout=(not sys.stdout.isatty())) show_frame(frame, to_stdout=(not sys.stdout.isatty()))
i += 1 i += 1

View File

@ -15,6 +15,8 @@ def start_game() -> None:
proc.communicate() proc.communicate()
def show_highscore() -> None: def show_highscore() -> None:
with open('./.score', 'w') as f:
f.write('0')
Popen([ Popen([
'tmux', 'tmux',
'display-popup', 'display-popup',
@ -30,7 +32,7 @@ def main() -> NoReturn:
while True: while True:
if found_hands(): if found_hands():
start_game() start_game()
sleep(1) sleep(2)
if __name__ == '__main__': if __name__ == '__main__':
main() main()

BIN
mpv-shot0001.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
mpv-shot0002.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
mpv-shot0003.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
mpv-shot0004.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
mpv-shot0005.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -14,6 +14,7 @@ opencv-python==4.8.0.76
packaging==23.1 packaging==23.1
Pillow==10.0.0 Pillow==10.0.0
protobuf==3.20.3 protobuf==3.20.3
psutil==5.9.5
pycparser==2.21 pycparser==2.21
pyparsing==3.0.9 pyparsing==3.0.9
python-dateutil==2.8.2 python-dateutil==2.8.2

View File

@ -5,7 +5,7 @@
TERM_FONT='SauceCodePro Nerd Font Mono' TERM_FONT='SauceCodePro Nerd Font Mono'
TERM_FONT_SIZE='10' TERM_FONT_SIZE='10'
OUT_TERM='xterm-mono' OUT_TERM='screen'
TERM_FULLSCREEN='-fullscreen' TERM_FULLSCREEN='-fullscreen'
xterm \ xterm \
-bg black \ -bg black \

View File

@ -1,4 +1,5 @@
from time import sleep import sys
import time
from enum import Enum from enum import Enum
from subprocess import Popen from subprocess import Popen
from typing import Generator from typing import Generator
@ -40,16 +41,37 @@ def save_score(score: int) -> None:
score_file.write(str(score)) score_file.write(str(score))
def start_game_sfx() -> Popen: def start_game_sfx() -> Popen:
Popen(['paplay', './assets/sfx/start.mp3']).communicate() Popen(['paplay', './assets/sound/start.mp3']).communicate()
sleep(.5) time.sleep(.5)
return Popen(['paplay', './assets/sfx/background_music.mp3']) return Popen(['paplay', './assets/sound/background_music.mp3'])
def collect_sfx() -> None: def collect_sfx() -> None:
Popen(['paplay', './assets/sfx/collect.mp3']) Popen(['paplay', './assets/sound/collect.mp3'])
def lost_sfx() -> None:
Popen(['paplay', './assets/sound/lost.mp3']).communicate()
def show_matrix() -> None: def show_matrix() -> None:
Popen(['tmatrix']) Popen(['tmatrix'])
def initiate_rick() -> None:
Popen(['paplay', './assets/sound/rick.mp3'])
cap = cv2.VideoCapture('./assets/video/rick2.mp4')
fps: int = int(cap.get(cv2.CAP_PROP_FPS))
desired_delay: float = 1 / fps
while True:
start_time = time.time()
ret, frame = cap.read()
if not ret:
break
sys.stdout.buffer.write(frame.tobytes())
elapsed_time = time.time() - start_time
remaining_delay = max(desired_delay - elapsed_time, 0)
time.sleep(remaining_delay)
cap.release()
def found_hands() -> bool: def found_hands() -> bool:
capture: VideoCapture = cv2.VideoCapture(0) capture: VideoCapture = cv2.VideoCapture(0)
hands = mp_hands.Hands(max_num_hands=1) hands = mp_hands.Hands(max_num_hands=1)