파 이 썬 손 으로 2048 미니 게임 을 가르쳐 드릴 게 요.
파 이 썬 버 전:3.6.4
관련 모듈:
pygame 모듈;
파 이 썬 자체 모듈 도 있 습 니 다.
2.환경 구축
Python 을 설치 하고 환경 변수 에 추가 하면 pip 설치 에 필요 한 관련 모듈 을 설치 하면 됩 니 다.
원리 소개
"방향 키 를 사용 하여 사각형 을 이동 합 니 다.두 숫자 가 같은 사각형 이 부 딪 히 면 하나의 숫자 가 원래 의 두 배 인 새로운 사각형 으로 합 쳐 집 니 다.""게임 을 할 때 가능 한 한 이 숫자 사각형 을 많이 합치 면 됩 니 다."
게임 규칙 을 대충 알 고 나 면 이 게임 을 시작 할 수 있 습 니 다.우선 게임 초기 화 작업 을 하고 자신 이 좋아 하 는 게임 배경 음악 을 재생 합 니 다.
#
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('2048 ―― ')
#
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1, 30)
이어서 우 리 는 2048 게임 유형 을 정의 하 는데 그 중에서 2048 의 각종 게임 규칙 을 실현 하 는 것 을 책임 진다.
'''2048 '''
class Game2048(object):
def __init__(self, matrix_size=(4, 4), max_score_filepath=None, **kwargs):
# matrix_size: (num_rows, num_cols)
self.matrix_size = matrix_size
#
self.max_score_filepath = max_score_filepath
#
self.initialize()
구체 적 으로 말 하면 우 리 는 먼저 2 차원 목록 으로 현재 의 게임 상 태 를 저장 합 니 다.
self.game_matrix = [['null' for _ in range(self.matrix_size[1])] for _ in range(self.matrix_size[0])]
그 중에서 null 은 현재 블록 에 숫자 가 없다 는 것 을 나타 낸다.그렇지 않 으 면 해당 위 치 는 현재 숫자 로 표시 합 니 다.2048 작은 게임 의 현재 게임 상 태 는 4*4 의 목록 으로 표시 할 수 있 음 이 분명 하 다.![在这里插入图片描述](https://s1.md5.ltd/image/6313b9073eddecb3cf06631f0bc15af7.png)
게임 이 시작 되 기 전에 우 리 는 이 2 차원 목록 에서 무 작위 로 두 개의 위 치 를 선택 하여 숫자 를 생 성 해 야 한다(즉,2 또는 4).
''' '''
def randomGenerateNumber(self):
empty_pos = []
for i in range(self.matrix_size[0]):
for j in range(self.matrix_size[1]):
if self.game_matrix[i][j] == 'null': empty_pos.append([i, j])
i, j = random.choice(empty_pos)
self.game_matrix[i][j] = 2 if random.random() > 0.1 else 4
self.randomGenerateNumber()
self.randomGenerateNumber()
그리고 유저 가 방향 키(↑↓←→)를 눌 렀 을 때 이 2 차원 목록 은 유저 의 조작 명령 에 따라 업데이트 되 며 주로 두 부분 으로 나 뉜 다.모든 숫자 블록 을 이동 하고 필요 한 합병 과 점 수 를 기록 합 니 다.
무 작위 로 숫자 가 없 는 위치 에서 숫자 를 생 성 합 니 다.
구체 적 으로 말 하면 코드 는 다음 과 같다.
''' '''
def update(self):
game_matrix_before = copy.deepcopy(self.game_matrix)
self.move()
if game_matrix_before != self.game_matrix: self.randomGenerateNumber()
그 중에서 모든 숫자 를 이동 하고 필요 한 합병 코드 는 다음 과 같다.
''' , '''
def move(self):
#
def extract(array):
array_new = []
for item in array:
if item != 'null': array_new.append(item)
return array_new
#
def merge(array):
score = 0
if len(array) < 2: return array, score
for i in range(len(array)-1):
if array[i] == 'null':
break
if array[i] == array[i+1]:
array[i] *= 2
array.pop(i+1)
array.append('null')
score += array[i]
return extract(array), score
# return
if self.move_direction is None: return
#
if self.move_direction == 'up':
for j in range(self.matrix_size[1]):
col = []
for i in range(self.matrix_size[0]):
col.append(self.game_matrix[i][j])
col = extract(col)
col.reverse()
col, score = merge(col)
self.score += score
col.reverse()
col = col + ['null',] * (self.matrix_size[0] - len(col))
for i in range(self.matrix_size[0]):
self.game_matrix[i][j] = col[i]
#
elif self.move_direction == 'down':
for j in range(self.matrix_size[1]):
col = []
for i in range(self.matrix_size[0]):
col.append(self.game_matrix[i][j])
col = extract(col)
col, score = merge(col)
self.score += score
col = ['null',] * (self.matrix_size[0] - len(col)) + col
for i in range(self.matrix_size[0]):
self.game_matrix[i][j] = col[i]
#
elif self.move_direction == 'left':
for idx, row in enumerate(copy.deepcopy(self.game_matrix)):
row = extract(row)
row.reverse()
row, score = merge(row)
self.score += score
row.reverse()
row = row + ['null',] * (self.matrix_size[1] - len(row))
self.game_matrix[idx] = row
#
elif self.move_direction == 'right':
for idx, row in enumerate(copy.deepcopy(self.game_matrix)):
row = extract(row)
row, score = merge(row)
self.score += score
row = ['null',] * (self.matrix_size[1] - len(row)) + row
self.game_matrix[idx] = row
self.move_direction = None
머리 쓰 는 게 귀찮아(어차피 4*4 만 한 TT)그래서 이 2 차원 목록 을 직접 옮 겨 다 니 며 우리 가 원 하 는 모든 조작 을 실현 했다.마지막 으로 우 리 는 함 수 를 하나 더 써 서 현재 의 게임 상태 에 따라 게임 이 끝 났 는 지 아 닌 지 를 판단 하면 된다.
''' '''
@property
def isgameover(self):
for i in range(self.matrix_size[0]):
for j in range(self.matrix_size[1]):
if self.game_matrix[i][j] == 'null': return False
if (i == self.matrix_size[0] - 1) and (j == self.matrix_size[1] - 1):
continue
elif (i == self.matrix_size[0] - 1):
if (self.game_matrix[i][j] == self.game_matrix[i][j+1]):
return False
elif (j == self.matrix_size[1] - 1):
if (self.game_matrix[i][j] == self.game_matrix[i+1][j]):
return False
else:
if (self.game_matrix[i][j] == self.game_matrix[i+1][j]) or (self.game_matrix[i][j] == self.game_matrix[i][j+1]):
return False
return True
사실은 매우 간단 하 다.만약 에 2 차원 목록 이 숫자 로 채 워 지고 숫자 가 더 이상 합병 되 지 않 으 면 이 게임 은 끝난다.그렇지 않 으 면 게임 은 끝나 지 않 는 다.2048 게임 종 류 를 정의 하고 우리 의 게임 은 기본적으로 다 쓴 셈 이다.게임 주 순환 에서 사용자 조작 에 따라 현재 게임 상 태 를 업데이트 하고 게임 에 필요 한 모든 요 소 를 화면 에 표시 하면 됩 니 다.
#
clock = pygame.time.Clock()
is_running = True
while is_running:
screen.fill(pygame.Color(cfg.BG_COLOR))
# --
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:
game_2048.setDirection({pygame.K_UP: 'up', pygame.K_DOWN: 'down', pygame.K_LEFT: 'left', pygame.K_RIGHT: 'right'}[event.key])
# --
game_2048.update()
if game_2048.isgameover:
game_2048.saveMaxScore()
is_running = False
# --
drawGameMatrix(screen, game_2048.game_matrix, cfg)
start_x, start_y = drawScore(screen, game_2048.score, game_2048.max_score, cfg)
drawGameIntro(screen, start_x, start_y, cfg)
# --
pygame.display.update()
clock.tick(cfg.FPS)
return endInterface(screen, cfg)
효과 도마지막 효 과 는 대략 이렇다.
![在这里插入图片描述](https://s1.md5.ltd/image/2c0b4849f2c93eb9a8da4c98fe2bdbeb.png)
![在这里插入图片描述](https://s1.md5.ltd/image/8fbdfbfa4c36d6566ca068114de95e96.png)
이 걸 가지 고 놀 면 난 요리 닭 이 야,헤헤~
파 이 썬 의 손 으로 2048 작은 게임 을 실현 하 는 방법 을 알려 드 리 는 이 글 은 여기까지 입 니 다.더 많은 파 이 썬 2048 작은 게임 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.