记得之前大二上过一门交叉学科,使用了python制作贪吃蛇小游戏(但是当时真的就是浪555大家大学的时候真的要好好学习呀),然后自己在b站学习网站跟着做了这个小游戏,整体还是很容易懂的,用pycharm的pygame制作,可以直接在终端使用
ping install pygame
等它下载完毕就好啦,这个游戏只有纯玩,没有计分的哦。下面是整体代码:
class Ponit:
row=0
col=0
def __init__(self,row,col):
self.row=row
self.col=col
def copy(self):
return Ponit(row=self.row,col=self.col) #身子覆盖自己
#初始框架
import pygame
import random
#初始化
pygame.init()
W=800
H=600
#格子设计 可变 怎么画出来?
ROW=30
COL=40
size=(W,H)
window=pygame.display.set_mode(size)
pygame.display.set_caption(('贪吃蛇')) #将窗口的名字改成游戏名
#背景颜色
bg_color=(255,255,255)
#蛇身颜色
snake_color=(128,128,128)
#定义坐标,将头和食物画出来
#核心 left=col*width top=row*height 就是左边的格子数等于所在所在列*格子长度,上边的格子数等于行数*长度
head=Ponit(row=int(ROW/2),col=int(COL/2))
head_color=(0,128,128)
#将蛇身建立成一个列表
snakes=[
Ponit(row=head.row,col=head.col+1),
Ponit(row=head.row,col=head.col+2),
Ponit(row=head.row,col=head.col+3)
]
#生成食物
def gen_food():
while 1:
pos=Ponit(row=random.randint(0,ROW-1),col=random.randint(0,COL-1))
#
is_coll=False
#所生成的食物是否跟蛇碰上了
if head.row==pos.row and head.col==pos.col:
is_coll=True
#蛇身子
for snake in snakes:
if snake.row==pos.row and snake.col==pos.col:
is_coll=True
break
if not is_coll:
break
return pos
food=gen_food() #食物出现的地方是随机的
food_color=(255,255,0)
#移动
direct='left'
#
def rect(point,color):
cell_width=W/COL
cell_height=H/ROW
left=point.col*cell_height
top=point.row*cell_height
pygame.draw.rect(
window,color,
(left,top,cell_width,cell_height)
)
pass
#游戏循环
quit=True
clock=pygame.time.Clock()
#处理事件
while quit:
for event in pygame.event.get(): #这个事件可以感受到该控制屏内的鼠标动点等
if event.type==pygame.QUIT:
quit=False
elif event.type==pygame.KEYDOWN: #移动蛇,控制上下左右,活动
#print(event)
if event.key==273 or event.key==119:
if direct=='left' or direct=='right':
direct='up'
elif event.key==274 or event.key==115:
if direct == 'left' or direct == 'right':
direct = 'down'
elif event.key==276 or event.key==97:
if direct == 'up' or direct == 'down':
direct = 'left'
elif event.key==275 or event.key==100:
if direct == 'up' or direct == 'down':
direct = 'right'
#吃东西 如果蛇头的位置与食物的位置重叠则证明已经吃到
eat=(head.row==food.row and head.col==food.col)
#重新产生食物
if eat:
food=gen_food()
#处理身子
#1.把原来的头插入到snakes的头上
snakes.insert(1,head.copy())
#2.把snakes的最后一个删掉,只有吃到了才将身子最后搞掉
if not eat:
snakes.pop()
#移动蛇
if direct=='left':
head.col-=1
elif direct=='right':
head.col+=1
elif direct=='up':
head.row-=1
elif direct=='down':
head.row+=1
#检测:
dead=False
#1.撞墙
if head.col<0 or head.row<0 or head.col>=COL or head.row>=ROW:
dead=True
#2.撞自己
for snake in snakes:
if head.col==snake.col and head.row==snake.row:
dead=True
break
if dead:
print('游戏结束')
quit=False
#渲染 draw 颜色-RGB 将画面变成白色
pygame.draw.rect(window,bg_color,(0,0,W,H))
#蛇头和食物显示出来
for snake in snakes:
rect(snake,snake_color)
rect(head,head_color)
rect(food,food_color)
#
pygame.display.flip()
#设置帧频 蛇跑出来的速度,这里是控制蛇的速度,越大就跑得越快
clock.tick(10)
Python书写尤其要注意缩进问题!难点就是小蛇移动的时候坐标的变化。
思路就是:先把整体框架绘制出来,绘制场景,蛇头,如何移动蛇头,绘制蛇体,计分检测(这块没有做出来),等复试结束有空就来试试看。