python3贪吃蛇程序_python3 80行代码实现贪吃蛇

上面是实现的截图,废话不说,直接开始说一下代码

pos ={'UP': (-1,0),'DOWN':(+1,0),'LEFT':(0,-1),'RIGHT':(0,+1),

}

current= 'RIGHT'snake= [[1,1],[1,2],[1,3],[1,4],[1,5]] #ex: [[1,1],[1,2],[1,3]] [y,x]

head = snake[-1]

snake_speed= 0.1rany, ranx= -1, -1

来一些数据的初始化,蛇用列表表示,蛇的头的是列表的最后一项,速度用time.sleep()表示,速度越小,越快

defisover(head):if snake.count(head) > 1: #碰到自己身体

returnTrueif (head[0] == y-1) or (head[1] == x-1) or (head[0] == 0) or (head[1] == 0): #碰到墙

returnTruereturn False

判定游戏是否结束,碰到自己身体结束或者碰到墙结束

defrandomyx():

ranflag=Falsewhile ranflag isFalse:

rany, ranx= random.randint(1,y-2) , random.randint(1,x-2)if [rany,ranx] not insnake:

ranflag= True

随机生成贪吃蛇的点,注意:生成的点:需在框内而且不能在蛇的身上

while isover(head) isFalse:

draw()

head= [ head[0] + pos[current][0] , head[1] + pos[current][1]]

snake.append(head)if head[0] == rany and head[1] ==ranx:

randomyx()

snake_speed= snake_speed - 0.01

else:

snake.pop(0)

time.sleep(snake_speed)

上面是核心的逻辑代码,主要思想是:

1.只要蛇没有吃到东西,就头加入进去,尾掉(形成蛇走步的感觉);只要蛇吃到了东西,就头加进来,尾不出去(形成蛇长大的感觉) 

2.然后考虑current

这里首先就考虑是一个异步的情形!利用异步监听鼠标时间!

t1 = threading.Thread(target=listening, args=(head,), name='listenkeyboard')

t1.start()

deflistening(head):whileTrue:

c=stdscr.getch()if c == curses.KEY_UP and current != 'DOWN':

current= 'UP'

elif c == curses.KEY_DOWN and current != 'UP':

current= 'DOWN'

elif c == curses.KEY_LEFT and current != 'RIGHT':

current= 'LEFT'

elif c == curses.KEY_RIGHT and current != 'LEFT':

current= 'RIGHT'

这里需要注意的是:    在当前方向为上的时候,不能按下--->  按了蛇不就自己撞自己了嘛~

写完主要逻辑,之后  美化以下界面->

curses.start_color() #开启颜色

curses.init_pair(1, curses.COLOR_RED, curses.COLOR_RED)#定义点的颜色

curses.init_pair(2, curses.COLOR_BLUE, curses.COLOR_BLUE) #定义蛇的颜色

for si in snake:

stdscr.addstr(si[0],si[1],'@',curses.color_pair(2))

stdscr.addstr(rany,ranx,' ',curses.color_pair(1))

这样,一个贪吃蛇小游戏就完成了,下面是实现的全部代码,python3 snake.py,自己玩一下吧~~

importtime,curses,random,threading

pos={'UP': (-1,0),'DOWN':(+1,0),'LEFT':(0,-1),'RIGHT':(0,+1),

}

current= 'RIGHT'snake= [[1,1],[1,2],[1,3],[1,4],[1,5]] #ex: [[1,1],[1,2],[1,3]] [y,x]

head = snake[-1]

snake_speed= 0.1rany, ranx= -1, -1

defisover(head):if snake.count(head) > 1: #碰到自己身体

returnTrueif (head[0] == y-1) or (head[1] == x-1) or (head[0] == 0) or (head[1] == 0): #碰到墙

returnTruereturnFalsedefrandomyx():globalrany,ranx

ranflag=Falsewhile ranflag isFalse:

rany, ranx= random.randint(1,y-2) , random.randint(1,x-2)if [rany,ranx] not insnake:

ranflag=Truedefdraw():

stdscr.erase()

stdscr.border()for si insnake:

stdscr.addstr(si[0],si[1],'@',curses.color_pair(2))

stdscr.addstr(rany,ranx,' ',curses.color_pair(1))

stdscr.refresh()deflistening(head):globalcurrentwhileTrue:

c=stdscr.getch()if c == curses.KEY_UP and current != 'DOWN':

current= 'UP'

elif c == curses.KEY_DOWN and current != 'UP':

current= 'DOWN'

elif c == curses.KEY_LEFT and current != 'RIGHT':

current= 'LEFT'

elif c == curses.KEY_RIGHT and current != 'LEFT':

current= 'RIGHT'

defloop(stdscr):globalhead,snake_speed

randomyx()

t1= threading.Thread(target=listening, args=(head,), name='listenkeyboard')

t1.start()while isover(head) isFalse:

draw()

head= [ head[0] + pos[current][0] , head[1] + pos[current][1]]

snake.append(head)if head[0] == rany and head[1] ==ranx:

randomyx()

snake_speed= snake_speed - 0.01

else:

snake.pop(0)

time.sleep(snake_speed)

stdscr=curses.initscr()

curses.noecho()#不输出- -

curses.cbreak() #立刻读取:暂不清楚- -

curses.start_color() #开启颜色

curses.init_pair(1, curses.COLOR_RED, curses.COLOR_RED)#定义点的颜色

curses.init_pair(2, curses.COLOR_BLUE, curses.COLOR_BLUE) #定义蛇的颜色#init_pair(n,f,b)修改颜色对n,让f为前景色,b为背景色。颜色对0天生的黑白色,不允许改。

stdscr.keypad(1) #开启keypad

stdscr.border()

curses.curs_set(0)

(y,x)=stdscr.getmaxyx()

curses.wrapper(loop)

curses.endwin()

内容来源于网络如有侵权请私信删除

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Python实现贪吃蛇游戏的代码,其中使用了Pygame库来实现游戏界面的绘制和事件的处理: ```python import pygame import random # 初始化Pygame pygame.init() # 定义游戏界面大小、背景颜色和标题 screen_width = 640 screen_height = 480 bg_color = (255, 255, 255) caption = '贪吃蛇' font_size = 36 # 定义游戏界面和字体 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption(caption) font = pygame.font.SysFont(None, font_size) # 定义贪吃蛇的初始位置、大小和移动速度 snake_size = 20 snake_x = screen_width // 2 snake_y = screen_height // 2 snake_speed = 20 snake_body = [[snake_x, snake_y]] # 定义食物的初始位置和大小 food_size = 20 food_x = random.randint(0, screen_width // food_size - 1) * food_size food_y = random.randint(0, screen_height // food_size - 1) * food_size # 定义游戏循环标志和时钟 game_over = False 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_UP: snake_speed = [-snake_size, 0] elif event.key == pygame.K_DOWN: snake_speed = [snake_size, 0] elif event.key == pygame.K_LEFT: snake_speed = [0, -snake_size] elif event.key == pygame.K_RIGHT: snake_speed = [0, snake_size] # 移动贪吃蛇 snake_x += snake_speed[0] snake_y += snake_speed[1] snake_body.insert(0, [snake_x, snake_y]) snake_body.pop() # 判断是否吃到食物 if snake_x == food_x and snake_y == food_y: food_x = random.randint(0, screen_width // food_size - 1) * food_size food_y = random.randint(0, screen_height // food_size - 1) * food_size snake_body.append([snake_x, snake_y]) # 判断是否撞墙或撞到自己 if snake_x < 0 or snake_x >= screen_width or snake_y < 0 or snake_y >= screen_height or [snake_x, snake_y] in snake_body[1:]: game_over = True # 绘制游戏界面 screen.fill(bg_color) pygame.draw.rect(screen, (255, 0, 0), (food_x, food_y, food_size, food_size)) for pos in snake_body: pygame.draw.rect(screen, (0, 255, 0), (pos[0], pos[1], snake_size, snake_size)) score_text = font.render('Score: {}'.format(len(snake_body) - 1), True, (0, 0, 0)) screen.blit(score_text, (10, 10)) pygame.display.update() # 控制游戏帧率 clock.tick(10) # 退出Pygame pygame.quit() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值