上面是实现的截图,废话不说,直接开始说一下代码
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()
内容来源于网络如有侵权请私信删除