python小游戏200行代码_200行python代码实现2048游戏

200行python代码实现2048游戏

来源:中文源码网    浏览: 次    日期:2019年11月5日

【下载文档:  200行python代码实现2048游戏.txt 】

(友情提示:右键点上行txt文档名->目标另存为)

200行python代码实现2048游戏Python实战系列用于记录实战项目中的思路,代码实现,出现的问题与解决方案以及可行的改进方向本文为第2篇–200行Python代码实现2048

一、分析与函数设计

1.1 游戏玩法2048这款游戏的玩法很简单,每次可以选择上下左右滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。(介绍来自百度百科)

1.2 函数设计 _init _() 初始化4*4游戏地图,分数等游戏基本数据

is_gameover() 判断是否结束游戏

rannumber() 玩家每次移动时在地图上随机生成2、4

show() 在控制台打印出4*4游戏地图

print_score() 在控制台打印出当前分数

up(), upmove() 上移

down(), downmove() 下移

left(), leftmove() 左移

right(), rightmove() 右移

nextstep() 读取玩家按键

二、代码实现

注:IDE为Spyder,Python版本为3.6# -*- coding: utf-8 -*-

"""

Created on Sat Sep 29 16:29:04 2018@author: PastoralDog

"""

import randomclass game2048(object):

def __init__(self):

self.score=0

self.number=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]

self.move=0

seed=random.randint(0,15)

line=int(seed/4)

row=seed%4

self.number[line][row]=2

def is_gameover(self):

numbersum=0

for i in range(4):

for j in range(4):

if (self.number[i][j]!=0):

numbersum+=1

if(numbersum!=16): return False

for i in range(4):

for j in range(3):

if(self.number[i][j+1]==self.number[i][j]): return False

for i in range(3):

for j in range(4):

if(self.number[i+1][j]==self.number[i][j]): return False

print("游戏结束")

print("您的得分为:"+str(self.score))

self.__init__()

return True

def rannumber(self):

rannumber=random.randint(1,10)

if(rannumber<=8): rannumber=2

else: rannumber=4

done=0

count=0

for i in range(4):

for j in range(4):

if(self.number[i][j]==0):

count+=1

while(done==0 and count!=0):

ranplace=random.randint(0,15)

line=int(ranplace/4)

row=ranplace%4

if(self.number[line][row]==0):

done=1

self.number[line][row]=rannumber

def show(self):

print(self.number[0])

print(self.number[1])

print(self.number[2])

print(self.number[3])

def print_score(self):

print("得分:"+str(self.score))

def upmove(self):

for i in range(1,4):

for j in range(4):

temp=i

while(temp>=1 and self.number[temp-1][j]==0):

box=self.number[temp-1][j]

self.number[temp-1][j]=self.number[temp][j]

self.number[temp][j]=box

if(self.number[temp][j]!=0):self.move=1

temp-=1

def up(self):

self.upmove()

for i in range(1,4):

for j in range(4):

if(self.number[i-1][j]==self.number[i][j]):

if(self.number[i-1][j]!=2048):

self.score+=self.number[i][j]

self.number[i][j]=0

self.number[i-1][j]=2*self.number[i-1][j]

self.upmove()

if(self.move!=0):self.rannumber()

self.move=0

self.show()

self.is_gameover()

self.print_score()

def downmove(self):

for i in range(2,-1,-1):

for j in range(4):

temp=i

while(temp<=2 and self.number[temp+1][j]==0 ):

box=self.number[temp+1][j]

self.number[temp+1][j]=self.number[temp][j]

self.number[temp][j]=box

if(self.number[temp+1][j]!=0):self.move=1

temp+=1

def down(self):

self.downmove()

for i in range(2,-1,-1):

for j in range(4):

if(self.number[i+1][j]==self.number[i][j]):

if(self.number[i+1][j]!=2048):

self.score+=self.number[i][j]

self.number[i][j]=0

self.number[i+1][j]=2*self.number[i+1][j]

self.downmove()

if(self.move!=0):self.rannumber()

self.move=0

self.show()

self.is_gameover()

self.print_score()

def leftmove(self):

for i in range(4):

for j in range(1,4):

temp=j

while(temp>=1 and self.number[i][temp-1]==0 ):

box=self.number[i][temp-1]

self.number[i][temp-1]=self.number[i][temp]

self.number[i][temp]=box

if(self.number[i][temp-1]!=0):self.move=1

temp-=1

def left(self):

self.leftmove()

for i in range(4):

for j in range(0,3):

if(self.number[i][j+1]==self.number[i][j]):

if(self.number[i][j+1]!=2048):

self.score+=self.number[i][j]

self.number[i][j+1]=0

self.number[i][j]=2*self.number[i][j]

self.leftmove()

if(self.move!=0):self.rannumber()

self.move=0

self.show()

self.is_gameover()

self.print_score()

def rightmove(self):

for i in range(4):

for j in range(2,-1,-1):

temp=j

while(temp<=2 and self.number[i][temp+1]==0 ):

box=self.number[i][temp+1]

self.number[i][temp+1]=self.number[i][temp]

self.number[i][temp]=box

self.move=1

temp+=1

def right(self):

self.rightmove()

for i in range(4):

for j in range(2,-1,-1):

if(self.number[i][j+1]==self.number[i][j]):

if(self.number[i][j+1]!=2048):

self.score+=self.number[i][j]

self.number[i][j]=0

self.number[i][j+1]=2*self.number[i][j+1]

self.rightmove()

if(self.move!=0):self.rannumber()

self.move=0

self.show()

self.is_gameover()

self.print_score()

def nextstep(self,step):

if(step=='w'): self.up()

elif(step=='s'): self.down()

elif(step=='a'): self.left()

elif(step=='d'): self.right()

else: pass

if __name__ == '__main__':

game=game2048()

game.show()

while(True):

step=input()

if(step=='b'):break

game.nextstep(step)三、问题与解决方案

1.地图的储存与表示:目前没有界面设计,因此就用二维数组直接储存与表示2.数组越界:调试代码中遇到过五六次,除了牢记要边缘检测外, and 语句左右条件顺序也要有讲究。例:while(temp<=2 and self.number[temp+1][j]==0 ) 注:self.number为4*4的二维数组

当temp=3时,语句在temp<=2 被阻塞,不会执行self.number[temp+1][j]==0,此时没有问题;

若语句改为while(self.number[temp+1][j]==0 and temp<=2), 先执行self.number[temp+1][j]==0,此时编译器报错数组越界四、可行的改进方向

1.添加可视化界面,可考虑Tkinter,QT等2.拓展游戏地图大小为N x N本人水平有限,欢迎大家提出问题与建议。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持中文源码网。

亲,试试微信扫码分享本页! *^_^*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴听到你对小游戏的兴趣!下面是一个简单的外星入侵游戏,只有200左右的Python代码: ```python import pygame import random # 初始化Pygame pygame.init() # 设置窗口大小 screen_width = 800 screen_height = 600 screen = pygame.display.set_mode((screen_width, screen_height)) # 加载背景图像 background_image = pygame.image.load("background.png") # 加载玩家图像 player_image = pygame.image.load("player.png") player_width = player_image.get_width() player_height = player_image.get_height() # 加载外星人图像 alien_image = pygame.image.load("alien.png") alien_width = alien_image.get_width() alien_height = alien_image.get_height() # 加载子弹图像 bullet_image = pygame.image.load("bullet.png") bullet_width = bullet_image.get_width() bullet_height = bullet_image.get_height() # 设置字体 font = pygame.font.Font(None, 36) # 定义玩家类 class Player: def __init__(self, x, y): self.x = x self.y = y def draw(self): screen.blit(player_image, (self.x, self.y)) def move_left(self): self.x -= 5 if self.x < 0: self.x = 0 def move_right(self): self.x += 5 if self.x > screen_width - player_width: self.x = screen_width - player_width # 定义外星人类 class Alien: def __init__(self, x, y): self.x = x self.y = y def draw(self): screen.blit(alien_image, (self.x, self.y)) def move_down(self): self.y += 50 def reset(self): self.x = random.randint(0, screen_width - alien_width) self.y = random.randint(-200, -alien_height) # 定义子弹类 class Bullet: def __init__(self, x, y): self.x = x self.y = y def draw(self): screen.blit(bullet_image, (self.x, self.y)) def move_up(self): self.y -= 10 # 创建玩家对象 player = Player(screen_width // 2 - player_width // 2, screen_height - player_height - 50) # 创建外星人对象列表 aliens = [] for i in range(10): alien = Alien(random.randint(0, screen_width - alien_width), random.randint(-200, -alien_height)) aliens.append(alien) # 创建子弹对象列表 bullets = [] # 设置游戏结束标志 game_over = False # 设置分数 score = 0 # 设置计时器 clock = pygame.time.Clock() # 游戏循环 while not game_over: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: player.move_left() elif event.key == pygame.K_RIGHT: player.move_right() elif event.key == pygame.K_SPACE: bullet = Bullet(player.x + player_width // 2 - bullet_width // 2, player.y) bullets.append(bullet) # 绘制背景 screen.blit(background_image, (0, 0)) # 绘制玩家 player.draw() # 绘制外星人 for alien in aliens: alien.draw() # 绘制子弹 for bullet in bullets: bullet.draw() # 移动外星人 for alien in aliens: alien.move_down() if alien.y > screen_height: alien.reset() score -= 10 # 移动子弹 for bullet in bullets: bullet.move_up() if bullet.y < -bullet_height: bullets.remove(bullet) # 检测碰撞 for alien in aliens: for bullet in bullets: if bullet.x + bullet_width > alien.x and bullet.x < alien.x + alien_width and \ bullet.y + bullet_height > alien.y and bullet.y < alien.y + alien_height: aliens.remove(alien) bullets.remove(bullet) score += 100 # 绘制分数 score_text = font.render("Score: " + str(score), True, (255, 255, 255)) screen.blit(score_text, (10, 10)) # 更新屏幕 pygame.display.update() # 设置帧率 clock.tick(60) # 退出Pygame pygame.quit() ``` 你需要准备三张图片:`background.png`、`player.png`、`alien.png`和一张子弹的图片`bullet.png`,并将它们放在同一目录下。这个游戏只有基础功能,但足以作为一个小练习来学习Pygame的基础知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值