威尼斯人线上娱乐

微信小程序,贪吃蛇实现代码

13 4月 , 2019  

python小白尝试写游戏..

pygame写贪吃蛇,pygame贪吃蛇

python小白尝试写游戏..

学了点pygame不驾驭那什么样练手好,先拿贪吃蛇开刀吧.

四个玩耍能够简简单单的分成七个部分:

  • 数据(变量)
  • 拍卖数据(函数,方法)

统一筹划变量

首先预想下,画面包车型大巴那个部分须求仓储在变量里

威尼斯人线上娱乐 1

一体画面上只会有矩形,而且那些矩形井然有序,大小相等,原本三个矩形必要多个变量表示地方,这里,只要求八个变量(行数,列数)就能表示方块的地方

蛇头,食品可以用贰元元组表示,蛇身的数额不明确,只好用含有数个元组的列表表示

此外设定窗口大小800×600,每个方块都以50×50

import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("贪吃蛇")

food = (4, 5)
body = [(1, 1),(1,2)]
head = (1, 3)

BLOCK = 0, 0, 0
GREEN = 0, 255, 0
RED = 255, 0, 0
BLUE = 0, 0, 255
WHITE = 255, 255, 255

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

变量设定好了,游戏已经成功了十三分之5( ̄▽ ̄)~*

下一步

变量到镜头

pygame.draw.rect()是依据矩形4元数组绘制图像的,那就写个函数”对接”下小编的2元坐标

此间就成数学的难题了…

def new_draw_rect(zb, color,screen):
    pygame.draw.rect(screen,color,((zb[1]-1)*50+1,(zb[0]-1)*50+1,48,48))

是因为50×50时周围方块们会”粘”在一道,方块向里收一下成4八x48        ↑

绘制图形,

...
while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    screen.fill(WHITE)
    new_draw_rect(food, RED, screen)
    for i in body:
        new_draw_rect(i, BLUE, screen)
    new_draw_rect(head, GREEN, screen)

    pygame.display.update()

 由静到动

 五个难题:

1.怎么时候动

2.怎么动

难点一,曾几何时动,那里有五个思路,

  • 区间固定时间(一秒),动一次
  • 按贰回键动1次,无操作必然时间(壹秒)后,重复最终1遍操作

看起来第三种方案 简单 不错

率先,先用pygame的clock类限制帧率(十0帧),以方便计时

再就是,参与新变量times,times每一趟加1,超过一百就”动一动”

出席新变量direction,表示蛇头朝向,衔接键盘操作和”怎么动”

 PS:程序甘休此前,很难精晓要用多少变量

import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("贪吃蛇")

fclock = pygame.time.Clock()


food = (4, 5)
body = [(1, 1)]
head = (1, 2)
times = 0
direction = 'right'

BLOCK = 0, 0, 0
GREEN = 0, 255, 0
RED = 255, 0, 0
BLUE = 0, 0, 255
WHITE = 255, 255, 255

def new_draw_rect(zb, color,screen):
    pygame.draw.rect(screen,color,((zb[1]-1)*50+1,(zb[0]-1)*50+1,48,48))
    pass


while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                direction = "up"
            elif event.key == pygame.K_LEFT:
                direction = "left"
            elif event.key == pygame.K_DOWN:
                direction = "down"
            elif event.key == pygame.K_RIGHT:
                direction = "right"
    if times >= 100:
        pass#动一动
        times = 0
    else:
        times += 1

    screen.fill(WHITE)
    new_draw_rect(food, RED, screen)
    for i in body:
        new_draw_rect(i, BLUE, screen)
    new_draw_rect(head, GREEN, screen)

    fclock.tick(100)
    pygame.display.update()

 

 蛇头的运动规律 : 向周边的格子移动,上下左右切实那多少个格子由键盘显明

那就写个新函数去变通蛇头的新职分

def get_front(head,direction):
    x, y = head
    if direction == "up":
        return x-1, y
    elif direction == "left":
        return x, y-1
    elif direction == "down":
        return x+1, y
    elif direction == "right":
        return x, y+1

然后

head = get_front(head,direction)

不过蛇蛇一头扎墙里咋做…….

您的好友【front : 权且记下蛇头前方的职位】已上线

您的相知【alive : 记录存活音信】已上线

PS:front能够不是全局变量

def ask_alive(front,body):
    x, y = front
    if x < 0 or x > 12 or y < 0 or y >16 :
        return False
    if front in body:
        return False
    return True

然后那样用

微信小程序,贪吃蛇实现代码。front = get_front(head,direction)
alive = ask_alive(front,body)
if alive:
  head = front

人话 :先看看蛇头前边是还是不是有危险,有危险就死了 , 不动啦

此外alive得加到后面包车型客车if里面当限制标准,死了就不能乱动啊~

 

蛇身动的法则 :
近头端跟头走,尾端也随之走–向程序靠拢–>>用过的head参加body,同时删去body最老的成员

此间能够看看body必须有序,可变.python里面就用列表了

只要使用list的append方法,head加在body的尾声,那么body[0]就会是”最老的成员”就得使用pop(0)删去

PS. body.append(head)得写在head=front前面,在head更新前加进body

    if times >= 100 and alive:
        front = get_front(head,direction)
        alive = ask_alive(front,body)
        if alive:
            body.append(head)
            head = front
            body.pop(0)
        times = 0
    else:
        times += 1

 食品的活动规律:被吃掉后,随飞机地点置再出新 –向程序靠拢–>> 当head==
food为真时 food随机选用一个蛇之外的地点出现

def new_food(head,body):
    while 1:
        x = random.randint(1, 12)
        y = random.randint(1, 16)
        if (x, y) != head and (x, y) not in body:
            return x, y

 

此间存在3个隐式BUG,若是蛇充满了每三个角落,这那正是死循环
………..然后一切程序卡在那里….

本子1 : 小编采用没瞧见,不会有何样人能吃到”全屏”的(´⊙ω⊙`)  
 –来自开发者的好逸恶劳

本子二 【作者的挑选】: 修了那些BUG

def new_food(head,body):
    i = 0
    while i < 100:
        x = random.randint(1, 12)
        y = random.randint(1, 16)
        if (x, y) != head and (x, y) not in body:
            return (x, y), True
        i += 1
    else:
        return (0, 0), False

food, alive = new_food()

 

 玖捌次机遇 不然就死( ̄へ ̄)     –来自开发者的黑心

其余,蛇吃了食品就要长壹格====>>蛇头前进壹格,蛇尾不动,蛇就因故长了一格====>>当head
= food 为真时body.pop(0)不用执行

        if alive:
            body.append(head)
            head = front
            if food == head:
                food = new_food(head, body)
            else:
                body.pop(0)

 

终结撒花

细节优化

1,

什么?游戏截止了?

黑个屏,提醒下

您的知心人【back_color】已上线

back_color1起初等于WHITE , alive为假时改成BLOCK

标题栏变成”游戏结束”

    if times >= 100 and alive:
        front = get_front(head, direction)
        alive = ask_alive(front, body)
        if alive:
            body.append(head)
            head = front
            if food == head:
                food, alive = new_food(head, body)
            else:
                body.pop(0)
        else:
            back_color = BLOCK
            pygame.display.set_caption("游戏结束")
        times = 0
    else:
        times += 1

 

 

 

2,

威尼斯人线上娱乐 2

假若一先导按了一晃left……

恭喜你拿走技能【撞脖子自杀】

抑或那就

你的相知【old_direction】已上线

old_direction = "right"

def direction_yes_no(direction,old_direction):
    d = {"up": "down", "down": "up", "left": "right", "right": "left"}
    if d[direction] == old_direction:
        return old_direction
    return direction

 

PS : 字典代替if-elif结构省心省时

然后 

  if times >= 100 and alive:
        direction = direction_yes_no(direction, old_direction)
        old_direction = direction
        front = get_front(head, direction)
        alive = ask_alive(front, body)

 

人话 :
添加贰个变量记录上1回有效的输入,七个趋势关系不得法时,以老变量为准–向人设身处地–>>向右跑时,不准向左!!!

Q : direction也足以在按键事件处理时间限制制呀,例如

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                direction = "up"
                   """改为"""
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                if direction != "down"
                    direction = "up"

 

A:在意识这些法子的BUG在此之前,作者也是如此想的

要么地方的例证

威尼斯人线上娱乐 3

直接按left行不通,right–XX–>left

先按down,急迅再按left ,,right –pass–>> down –pass–>>
left

恭贺您获得技能【绕过开发者防护,高水准撞脖子自杀】

3,

Q : 笔者要刹车!!!

A : 好好玩游戏,不要动不动就半途而废

你的挚友【pause】已上线

逻辑值,P键控制

pause = False

            elif event.key == pygame.K_p:
                pause = not pause    

if times >= 100 and alive and (not pause):
    ....

 

 

下边笔者发一下百分之百的代码,代码包涵下边包车型客车优化

↓↓↓↓

告竣撒花

import pygame
import sys
import random

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("贪吃蛇")

fclock = pygame.time.Clock()


food = (4, 5)
body = [(1, 1)]
head = (1, 2)

times = 0
direction = "right"
old_direction = "right"
alive = True
pause = False

BLOCK = 0, 0, 0
GREEN = 0, 255, 0
RED = 255, 0, 0
BLUE = 0, 0, 255
WHITE = 255, 255, 255
back_color = WHITE


def new_draw_rect(zb, color,screen):
    pygame.draw.rect(screen,color,((zb[1]-1)*50+1,(zb[0]-1)*50+1,48,48))


def get_front(head, direction):
    x, y = head
    if direction == "up":
        return x-1, y
    elif direction == "left":
        return x, y-1
    elif direction == "down":
        return x+1, y
    elif direction == "right":
        return x, y+1


def ask_alive(front, body):
    x, y = front
    if x < 0 or x > 12 or y < 0 or y >16 :
        return False
    if front in body:
        return False
    return True


def new_food(head, body):
    i = 0
    while i < 100:
        x = random.randint(1, 12)
        y = random.randint(1, 16)
        if (x, y) != head and (x, y) not in body:
            return (x, y), True
        i += 1
    else:
        return (0, 0), False


def direction_yes_no(direction, old_direction):
    d = {"up": "down", "down": "up", "left": "right", "right": "left"}
    if d[direction] == old_direction:
        return old_direction
    return direction

#food = new_food(head,body)

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                direction = "up"
            elif event.key == pygame.K_LEFT:
                direction = "left"
            elif event.key == pygame.K_DOWN:
                direction = "down"
            elif event.key == pygame.K_RIGHT:
                direction = "right"
            elif event.key == pygame.K_p:
                pause = not pause
    if times >= 100 and alive and (not pause):
        direction = direction_yes_no(direction, old_direction)
        old_direction = direction
        front = get_front(head, direction)
        alive = ask_alive(front, body)
        if alive:
            body.append(head)
            head = front
            if food == head:
                food, alive = new_food(head, body)
            else:
                body.pop(0)
        else:
            back_color = BLOCK
            pygame.display.set_caption("游戏结束")
        times = 0
    else:
        times += 1

    screen.fill(back_color)
    new_draw_rect(food, RED, screen)
    for i in body:
        new_draw_rect(i, BLUE, screen)
    new_draw_rect(head, GREEN, screen)

    fclock.tick(100)
    pygame.display.update()

 

 

↑↑↑↑

↑↑↑↑

↑↑↑↑

4,

Q : 游戏甘休或然暂停后因为times >= 拾0 and alive and (not
pause)始终为假

times += 壹 径直运转,,,,会不会不太稳妥

A :
又不会溢出,,,,,,,,废除暂停时蛇能火速跑起来借使time==100这难题就大了,,亏安妥初留了些余地写成
>=  

(~ ̄▽ ̄)~ 

5,

Q : 蛇跑的太慢笔者想加快

A : 上边包车型地铁times>=100的拾0随便改一下就行

0->100动一动   变成    0->80 动一动

仍旧动前边的数

0->100动一动   变成    20->100动一动

或然将它设置成变量让它随蛇的尺寸变化而转变

6,

打字太累,,

direction那里能够使用0,1,二,三

代替 up left down right

键盘事件和get_front()得用同一套词

7,

Q : 第一个food的任务是固定的,不可能”动”吗?

A : 因为作者是先定义变量,再定义函数

food = new_food(head,body)

就得写在概念函数后边,作者不忍心让它二个变量孤单,,,,怕您看不到(写了但注释掉了)

动手术

前方说过

问题1,什么时候动,这里有两个思路,
  • 区间固定时间(一秒),动三遍
  • 按1遍键动3回,无操作必然时间(壹秒)后,重复最后一遍操作

看起来第三种方案 简单 不错

那时自笔者以为第三种方案很难,,,

写了那一个博客后实力大增ᕦ( ᴼ ڡ ᴼ )ᕤ

今昔本人哪怕了

先是个法子,

处理按键事件后times = 十0 ,例

    if event.key == pygame.K_UP:
        direction = "up"
        times = 100
    elif event.key == pygame.K_LEFT:
        direction = "left"
        times = 100  

 

while循环当轮就能动一动

暗藏操作 : 在0.01s内按下四个键,第三个按的不会”生效”

pygame : 小编得跑完事件列表的各类成分

那是假的第一方案!!!

其次个章程,

把”动一动”的任何代码,打包成函数恐怕直接写在按键处理的末端

哪怕地点times = 100的职分 例

    if event.key == pygame.K_UP:
        direction = "up"
        '动一动'
    elif event.key == pygame.K_LEFT:
        direction = "left"
        '动一动'

 

牢记主要的一点times =
0也算”动一动”的内容,第3方案里,按键后计时供给清零!!!

    if times >= 100 and alive and (not pause):
        direction = direction_yes_no(direction, old_direction)
        old_direction = direction
        front = get_front(head, direction)
        alive = ask_alive(front, body)
        if alive:
            body.append(head)
            head = front
            if food == head:
                food, alive = new_food(head, body)
            else:
                body.pop(0)
        else:
            back_color = BLOCK
            pygame.display.set_caption("游戏结束")
        times = 0
    else:
        times += 1

 

为了幸免”诈尸”

“动一动”前还得加上if alive and (not pause):

times没须要加

自作者就懒得管了(╥╯^╰╥)那篇小说写了太长期,未来早就看不懂当初的代码了

Q :
不晓得您是或不是回想笔者,优化贰正是自身问的…..是如此的,笔者对自笔者的点子还不死心….”出手术”改第一方案后能用吗?

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                direction = "up"
                   """改为"""
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                if direction != "down"
                    direction = "up"

 

A : 对于第三方式达成的第3方案照旧会有小疾病

while循环当轮就能动一动
隐藏操作 : 在0.01s内按下两个键,第一个按的不会"生效"
pygame : 我得跑完事件列表的每个元素

在0.0一s内,按下三个键,就足以一如既往触发【秘技: 撞脖子自杀】

第二方法完成的相应没难点…….

 完结撒花✿✿ヽ(°▽°)ノ✿

 

Q :
小编想在加宽荧屏在右侧显示一下日子分数之类的音信,你还有怎么着”交待”吗?

A :
在pygame展现字体相比有难度….作者只好祝你程序不出BUG…其余点(800,0)到点(800,600)别忘了画到线,提示玩家”边界”依然存在的,让玩家摔键盘动怒就糟糕了

 

Q : 小编正是对你的颜料搭配有见解,颜色稍微扎眼….

A :
小编又不是画画,,,,,,,,,,,,颜色搭配的题材,应该,,,,,,,,,应该能够包容,,,,,,,,,,

 

Q : 游戏太没挑衅性,加点障碍物呗~~

A : walls
会在ask_alive()和new_food()用到,加个if的标题,,,,此外绘制显示器那里多加个for,,,,,

我就懒得管了(╥╯^╰╥)这篇文章写了太长时间,现在已经看不懂当初的代码了

终止撒花✿✿ヽ(°▽°)ノ✿

本次真没了..✿✿ヽ(°▽°)ノ✿

如有疏漏,欢迎补充

python小白尝试写游戏.. 学了点pygame不清楚这什么样练手好,先拿贪吃蛇开刀吧.
三个游乐可以简简单单的分为八个部分…

在习作的经过中品尝着贪吃蛇游戏用JS完成了。竟然成功了。
思路:使用10px*拾px的div层担当“像素”,然后选拔40*40矩阵157个“像素”构成了娱乐的界面。
上面是代码:

关于于小程序笔者就不做牵线了,官方有详尽文书档案,大家依然先来看张图吧

学了点pygame不通晓那怎么练手好,先拿贪吃蛇开刀吧.

复制代码 代码如下:

威尼斯人线上娱乐 4

多少个戏耍可以回顾的分为四个部分:

// JavaScript Document
alert(“键盘的方向键控制方向,空格键暂停。\nLIFE制作\n”);
// 添加着力的图形块,即157个10 * 10的层组成的贰维矩阵
var rowindex = new Array(40);
var colindex;
var cell;
// 图像单元的定义
var backcolor = “black”;
for(var i = 0; i < 40; i ++ )
{
colindex = new Array(40);
for(var j = 0; j < 40; j ++ )
{
// 设置每种单元的品质
cell = document.createElement(“div”);
cell.style.backgroundColor = backcolor;
cell.style.width = “10px”;
cell.style.height = “10px”;
cell.style.position = “absolute”;
cell.style.left = “” + (j * 10 + 100) + “px”;
cell.style.top = “” + (i * 10 + 100) + “px”;
cell.style.overflow = “hidden”;
// 添加单元
document.body.appendChild(cell);
// 填充列组
colindex[j] = cell;
}
// 填充行组
rowindex[i] = colindex;
}
// 贪吃蛇类的定义,基于基本的图像单元
function snake()
{
// 定义蛇的人体,并起先化
this.bodycolor = “white”;
this.bodys = new Array();
for(var i = 20; i < 25; i ++ )
{
rowindex[20][i].style.backgroundColor = this.bodycolor;
// rowindex的第叁个坐标是行标,第1是列标
this.bodys.push(rowindex[20][i]);
}
// 定义蛇的头顶坐标,第1个是行标, 第二个是列标
this.head = [20, 20];
// 定义蛇的前进方向,0代表左、壹象征下、二代表右、叁象征上
this.direct = 0;
}
// 移动模块
function move()
{
// 依照前进方向计算尾部的坐标
switch(this.direct)
{
case 0 :
this.head[1] -= 1;
break;
case 1 :
this.head[0] += 1;
break;
case 2 :
this.head[1] += 1;
break;
case 3 :
this.head[0] -= 1;
break;
}
// 判断是或不是越界
if(this.head[0] < 0 || this.head[0] > 39 || this.head[1]
< 0 || this.head[1] > 39)
{
// 如果越界则赶回false
return false;
}
else
//
如若未有越界则检查下一个成分的属性,要是是食品则吃掉,并再生成食品。假诺是其自身则赶回false
if(this.head[0] == food[0] && this.head[1] == food[1])
{
// 要是是食物
rowindex[this.head[0]][this.head[1]].style.backgroundColor =
this.bodycolor;
this.bodys.unshift(rowindex[this.head[0]][this.head[1]]);
score++;
makefood();
return true;
}
else
// 假设是它本身
if(rowindex[this.head[0]][this.head[1]].style.backgroundColor ==
this.bodycolor)
{
if(rowindex[this.head[0]][this.head[1]] == this.bodys.pop())//
即使是它的后面部分
{
this.bodys.unshift(rowindex[this.head[0]][this.head[1]]);
return true;
}
// 假使不是尾巴部分
return false;
}
// 以上景况都不是
this.bodys.pop().style.backgroundColor = backcolor;
rowindex[this.head[0]][this.head[1]].style.backgroundColor =
this.bodycolor;
this.bodys.unshift(rowindex[this.head[0]][this.head[1]]);
return true;
}
snake.prototype.move = move;
// 生成食品模块
var foodcolor = “blue”;
var food = [20, 17];
rowindex[food[0]][food[1]].style.backgroundColor = foodcolor;
function makefood()
{
var tempfood;
var tempelement;
out :
while(true)
{
tempfood = [Math.round(Math.random() * 39), Math.round(Math.random()
* 39)];
tempelement = rowindex[tempfood[0]][tempfood[1]];
for(var i in s.bodys)
{
if(s.bodys[i] == tempelement)
{
// 假若任意变化的食物在蛇的人体上,则跳出继续
continue out;
}
// 生成食物成功
break out;
}
}
food = tempfood;
rowindex[food[0]][food[1]].style.backgroundColor = foodcolor;
}
// 转向模块和刹汽车模特块
document.onkeydown = turnorstop;
function turnorstop(event)
{
if(window.event != undefined)
{
if(parseInt(window.event.keyCode)==32)
{
alert(“休息一下”);
}
else
{
switch(parseInt(window.event.keyCode))
{
case 37 :
if(s.direct!=2)
s.direct = 0;
break;
case 38 :
if(s.direct!=1)
s.direct = 3;
break;
case 39 :
if(s.direct!=0)
s.direct = 2;
break;
case 40 :
if(s.direct!=3)
s.direct = 1;
break;
}
}
}
else
{
if(parseInt(event.which)==32)
{
alert(“休息一下”);
}
else
{
switch(parseInt(event.which))
{
case 37 :
if(s.direct!=2)
s.direct = 0;
break;
case 38 :
if(s.direct!=1)
s.direct = 3;
break;
case 39 :
if(s.direct!=0)
s.direct = 2;
break;
case 40 :
if(s.direct!=3)
s.direct = 1;
break;
}
}
}
}
// 运维游戏模块
var s = new snake();
var time = 60;//蛇的速度指数
function startmove()
{
if(s.move())
{
setTimeout(startmove, time);
威尼斯人线上娱乐,}
else
{
alert(“GAME OVER\n您的分数是:”+score+”分”);
}
}
//分数设置
var score = -1;
//运营游戏
startmove();

就是这么些样子的,游戏界面跟从前的OC版是大半的,以小编的程度,只好设计成这么了,毕竟不是正规的,话说那蛇怎么长的像个J(和)B(谐)啊

  • 数据(变量)
  • 拍卖多少(函数,方法)

在网页中年老年是该JS文件即可。

先来看望用来添加组件的wxml文件

设计变量

您大概感兴趣的篇章:

  • JS写的贪吃蛇游戏(个人练习)
  • javascript贪吃蛇完整版(源码)
  • js贪吃蛇游戏完成思路和源码
  • javascript贯彻不难的贪吃蛇游戏
  • javascript
    贪吃蛇(详细注释版)
  • 原生js达成的贪吃蛇网页版游戏全体实例
  • javascript
    实现的多浏览器支持的贪吃蛇webgame
  • js编写“贪吃蛇”的小游戏
  • javascript编写贪吃蛇游戏
  • 20行js代码完成的贪吃蛇小游戏

upleft{{btnTitle}}rightdown

先是预想下,画面包车型客车这一个部分需求仓库储存在变量里

情节是一对一简单滴,下边1个view,里面放二个画布,上面三个view,里面放陆个按钮

威尼斯人线上娱乐 5

再来看看wxss布局

整套画面上只会有矩形,而且这个矩形井井有条,大小相等,原本二个矩形需求多少个变量表示地方,那里,只要求多少个变量(行数,列数)就能表示方块的岗位

威尼斯人线上娱乐 6

蛇头,食品能够用2元元组表示,蛇身的数据不分明,只好用富含数个元组的列表表示

内容不多,其实小编对CSS也不是很精晓,很多年前读书过,不过早随着排出去了,或然还有更优的布局格局,不过凑合着用吧

其它设定窗口大小800×600,每一种方块都以50×50

意义达成

import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("贪吃蛇")

food = (4, 5)
body = [(1, 1),(1,2)]
head = (1, 3)

BLOCK = 0, 0, 0
GREEN = 0, 255, 0
RED = 255, 0, 0
BLUE = 0, 0, 255
WHITE = 255, 255, 255

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

布局如故很简单的,纵然不熟,可是多尝试几下依然得以弄出来的,接下去成效逻辑的达成才是非同通常,编制程序语言当然是js了。

变量设定好了,游戏已经实现了五成( ̄▽ ̄)~*

话说小编当年学js的时候,可是写了满满当当一本的笔记,不过……算了,过去的就让他过去吧,过去的事情不提也罢。

下一步

思路其实与OC版的平等

变量到镜头

蛇:创造五个点坐标数组,然后以坐标点为着力在画布上画矩形

pygame.draw.rect()是依照矩形4元数组绘制图像的,那就写个函数”对接”下自身的二元坐标

食物:随机3个坐标点,该点不能够在蛇身上,不然重新随机

那边就成数学的题材了…

蛇的移位:把蛇尾的坐标移到蛇头前边就行了

def new_draw_rect(zb, color,screen):
    pygame.draw.rect(screen,color,((zb[1]-1)*50+1,(zb[0]-1)*50+1,48,48))

吃到食品:每便蛇移动实现后,倘若蛇头的坐标与食品的坐标一样,则蛇增进

鉴于50×50时周围方块们会”粘”在1道,方块向里收一下成4八x4八        ↑

蛇的进步:在蛇尾后边加多个点坐标即可

制图图形,

打闹甘休:蛇头越界或撞到自身身体即游戏甘休

...
while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    screen.fill(WHITE)
    new_draw_rect(food, RED, screen)
    for i in body:
        new_draw_rect(i, BLUE, screen)
    new_draw_rect(head, GREEN, screen)

    pygame.display.update()

创建蛇

 由静到动

//创造蛇,初叶为5节,nodeWH为矩形的边长function createSnake(){ 
nodes.splice(0, nodes.length) //清空数组  for (var i =肆; i >=0; i–)
{    varnode= newNode(nodeWH* (i +0.5), nodeWH *0.5)   
nodes.push(node);

 多个难题:

}

一.如曾几何时候动

}

2.怎么动

始建食物

难题一,几时动,那里有八个思路,

functioncreateFood(){//矩形的边长为拾,画布宽度为250,中度为350,所以x只可以取五-二四伍,y只好取伍-3四伍varx
=parseInt(Math.random() *24) * nodeWH + nodeWH *0.5vary
=parseInt(Math.random() *34) * nodeWH + nodeWH
*0.5//假如食物的坐标在蛇身上,则重复创建for(vari =0; i <
nodes.length; i++) {varnode = nodes[i]if(node.x == x && node.y == y)
{      createFood()return} 
}//Node为自定义的类,有八个属性x和y,表示坐标food =newNode(x,y)}

  • 距离固定时间(1秒),动一回
  • 按2次键动叁次,无操作必然时间(一秒)后,重复最后三次操作

蛇的移动

看起来第三种方案 简单 不错

蛇的移动是有倾向的,所以用贰个变量direction来记录蛇的运动方向,游戏初始时,暗中认可是向右移动。

先是,先用pygame的clock类限制帧率(十0帧),以方便计时

上边有提起蛇的移位就是把蛇尾的坐标移到蛇头前边,可是那么些前边并不是定点的,而是依照方一直判定的,如若向右移动则左侧为前线,以此类推

同时,加入新变量times,times每一次加壹,超越一百就”动一动”

吃到食品与蛇增进

参预新变量direction,表示蛇头朝向,衔接键盘操作和”怎么动”

历次运动实现后,判断蛇头的坐标是不是与食物的坐标相等就OK了,吃到食物后蛇的长度会追加,并且要开创叁个新的食物

 PS:程序截止以前,很难了解要用多少变量

function isEatedFood(){varhead = nodes[0]if(head.x== food.x&& head.y==
food.y) {    score++    nodes.push(lastPoint)    createFood()  }}

import pygame
import sys

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("贪吃蛇")

fclock = pygame.time.Clock()


food = (4, 5)
body = [(1, 1)]
head = (1, 2)
times = 0
direction = 'right'

BLOCK = 0, 0, 0
GREEN = 0, 255, 0
RED = 255, 0, 0
BLUE = 0, 0, 255
WHITE = 255, 255, 255

def new_draw_rect(zb, color,screen):
    pygame.draw.rect(screen,color,((zb[1]-1)*50+1,(zb[0]-1)*50+1,48,48))
    pass


while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                direction = "up"
            elif event.key == pygame.K_LEFT:
                direction = "left"
            elif event.key == pygame.K_DOWN:
                direction = "down"
            elif event.key == pygame.K_RIGHT:
                direction = "right"
    if times >= 100:
        pass#动一动
        times = 0
    else:
        times += 1

    screen.fill(WHITE)
    new_draw_rect(food, RED, screen)
    for i in body:
        new_draw_rect(i, BLUE, screen)
    new_draw_rect(head, GREEN, screen)

    fclock.tick(100)
    pygame.display.update()

上面的代码中,lastPoint就是蛇每一趟活动前,蛇尾的坐标,如若移动后吃到食品,那么直接在活动前的蛇尾处加上壹节即可

 

游玩截至

 蛇头的位移规律 : 向相近的格子移动,上下左右切实可行那些格子由键盘明显

老是运动后,都要一口咬住不放蛇头是不是超越画布,也许撞到本身的身体

那就写个新函数去变通蛇头的新职责

functionisDestroy(){varhead = nodes[0]//判断是或不是撞到温馨肉体for(vari
=一; i < nodes.length; i++) {varnode = nodes[i]if(head.x == node.x
&& head.y == node.y) {      gameOver()    } 
}//判断水平方向是还是不是越界if(head.x <五|| head.x >贰四五) {   
gameOver()  }//判断垂直方向是不是越界if(head.y <5|| head.y >34五) { 
  gameOver()  }}

def get_front(head,direction):
    x, y = head
    if direction == "up":
        return x-1, y
    elif direction == "left":
        return x, y-1
    elif direction == "down":
        return x+1, y
    elif direction == "right":
        return x, y+1

界面绘制

然后

每一趟运动都要绘制,所以必要1个定时器,作者用的setInterval

head = get_front(head,direction)

functionmove(){  lastPoint = nodes[nodes.length -1]varnode =
nodes[0]varnewNode= {x:node.x, y:node.y}switch(direction)
{case’up’:newNode.y -= nodeWH;break;case’left’:newNode.x -=
nodeWH;break;case’right’:newNode.x += nodeWH;break;case’down’:newNode.y
+= nodeWH;break;  }  nodes.pop()  nodes.unshift(newNode) 
moveEnd()}functionstartGame() {if(isGameOver) {    direction
=’right’createSnake()    createFood()    score =0isGameOver =false} 
timer = setInterval(move,300)}

唯独蛇蛇一只扎墙里如何是好…….

网上说setInterval的习性并不怎么好,建议用requestAnimationFrame,然则很不满,小编不会用,准确的身为不理解怎么暂停

您的知音【front : 一时记下蛇头前方的职位】已上线

varanimateId =0functionmove(){    .    .    .    animateId =
requestAnimationFrame(move)}functionstartGame(){    .    .    .   
animateId = requestAnimationFrame(move)}

您的忘年之交【alive : 记录存活音讯】已上线

选拔方面包车型客车主意可以兑现蛇的移位与界面重绘,然则每一遍执行animateId都会被授予新的值,所以利用cancelAnimationFrame(animateId)不能够暂停,假如有懂前端开发的大神请指引下

PS:front能够不是全局变量

大致整个逻辑正是那样的,喜欢切磋的能够友善尝尝下,供给源码的请自行下载,不要问笔者怎么打开,不要问作者怎么打开,不要问笔者怎么打开!!!

def ask_alive(front,body):
    x, y = front
    if x < 0 or x > 12 or y < 0 or y >16 :
        return False
    if front in body:
        return False
    return True

下一场那样用

front = get_front(head,direction)
alive = ask_alive(front,body)
if alive:
  head = front

人话 :先看看蛇头前边是还是不是有战战兢兢,有如临深渊就死了 , 不动啦

别的alive得加到前边的if里面当限制条件,死了就不可能乱动啊~

 

蛇身动的原理 : 近头端跟头走,尾端也随后走–向程序靠拢–>>用过的head加入body,同时删去body最老的分子

那边能够看看body必须有序,可变.python里面就用列表了

假定应用list的append方法,head加在body的末尾,那么body[0]就会是”最老的积极分子”就得利用pop(0)删去

PS. body.append(head)得写在head=front前面,在head更新前加进body

    if times >= 100 and alive:
        front = get_front(head,direction)
        alive = ask_alive(front,body)
        if alive:
            body.append(head)
            head = front
            body.pop(0)
        times = 0
    else:
        times += 1

 食品的移动规律:被吃掉后,随飞机位置置再冒出 –向程序靠拢–>>
当head== food为真时 food随机选拔2个蛇之外的地点现身

def new_food(head,body):
    while 1:
        x = random.randint(1, 12)
        y = random.randint(1, 16)
        if (x, y) != head and (x, y) not in body:
            return x, y

 

那边存在叁个隐式BUG,若是蛇充满了每1个角落,那那就是死循环
………..然后整整程序卡在此间….

本子1 : 我采取没瞧见,不会有何人能吃到”全屏”的(´⊙ω⊙`)  
 –来自开发者的好逸恶劳

本子二 【我的挑选】: 修了那几个BUG

def new_food(head,body):
    i = 0
    while i < 100:
        x = random.randint(1, 12)
        y = random.randint(1, 16)
        if (x, y) != head and (x, y) not in body:
            return (x, y), True
        i += 1
    else:
        return (0, 0), False

food, alive = new_food()

 

 916次机会 不然就死( ̄へ ̄)     –来自开发者的黑心

别的,蛇吃了食品就要长一格====>>蛇头前进1格,蛇尾不动,蛇就因故长了一格====>>当head
= food 为真时body.pop(0)不用执行

        if alive:
            body.append(head)
            head = front
            if food == head:
                food = new_food(head, body)
            else:
                body.pop(0)

 

利落撒花

细节优化

1,

哪些?游戏甘休了?

黑个屏,提醒下

你的好友【back_color】已上线

back_color1发轫等于WHITE , alive为假时成为BLOCK

标题栏变成”游戏甘休”

    if times >= 100 and alive:
        front = get_front(head, direction)
        alive = ask_alive(front, body)
        if alive:
            body.append(head)
            head = front
            if food == head:
                food, alive = new_food(head, body)
            else:
                body.pop(0)
        else:
            back_color = BLOCK
            pygame.display.set_caption("游戏结束")
        times = 0
    else:
        times += 1

 

 

 

2,

威尼斯人线上娱乐 7

若是一开首按了一下left……

恭贺您获取技能【撞脖子自杀】

要么那就

您的知心人【old_direction】已上线

old_direction = "right"

def direction_yes_no(direction,old_direction):
    d = {"up": "down", "down": "up", "left": "right", "right": "left"}
    if d[direction] == old_direction:
        return old_direction
    return direction

 

PS : 字典代替if-elif结构省心省时

然后 

  if times >= 100 and alive:
        direction = direction_yes_no(direction, old_direction)
        old_direction = direction
        front = get_front(head, direction)
        alive = ask_alive(front, body)

 

人话 :
添加三个变量记录上贰次有效的输入,四个方向关系不得法时,以老变量为准–向人走近–>>向右跑时,不准向左!!!

Q : direction也足以在按键事件处理时界定呀,例如

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                direction = "up"
                   """改为"""
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                if direction != "down"
                    direction = "up"

 

A:在意识那些点子的BUG从前,小编也是那样想的

照旧地点的例证

威尼斯人线上娱乐 8

直接按left行不通,right–XX–>left

先按down,火速再按left ,,right –pass–>> down –pass–>> left

恭贺您收获技术【绕过开发者防护,高水准撞脖子自杀】

3,

Q : 作者要暂停!!!

A : 好好玩游戏,不要动不动就废然则返

您的相知【pause】已上线

逻辑值,P键控制

pause = False

            elif event.key == pygame.K_p:
                pause = not pause    

if times >= 100 and alive and (not pause):
    ....

 

 

下边作者发一下方方面面包车型大巴代码,代码包括下边包车型客车优化

↓↓↓↓

甘休撒花

import pygame
import sys
import random

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("贪吃蛇")

fclock = pygame.time.Clock()


food = (4, 5)
body = [(1, 1)]
head = (1, 2)

times = 0
direction = "right"
old_direction = "right"
alive = True
pause = False

BLOCK = 0, 0, 0
GREEN = 0, 255, 0
RED = 255, 0, 0
BLUE = 0, 0, 255
WHITE = 255, 255, 255
back_color = WHITE


def new_draw_rect(zb, color,screen):
    pygame.draw.rect(screen,color,((zb[1]-1)*50+1,(zb[0]-1)*50+1,48,48))


def get_front(head, direction):
    x, y = head
    if direction == "up":
        return x-1, y
    elif direction == "left":
        return x, y-1
    elif direction == "down":
        return x+1, y
    elif direction == "right":
        return x, y+1


def ask_alive(front, body):
    x, y = front
    if x < 0 or x > 12 or y < 0 or y >16 :
        return False
    if front in body:
        return False
    return True


def new_food(head, body):
    i = 0
    while i < 100:
        x = random.randint(1, 12)
        y = random.randint(1, 16)
        if (x, y) != head and (x, y) not in body:
            return (x, y), True
        i += 1
    else:
        return (0, 0), False


def direction_yes_no(direction, old_direction):
    d = {"up": "down", "down": "up", "left": "right", "right": "left"}
    if d[direction] == old_direction:
        return old_direction
    return direction

#food = new_food(head,body)

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                direction = "up"
            elif event.key == pygame.K_LEFT:
                direction = "left"
            elif event.key == pygame.K_DOWN:
                direction = "down"
            elif event.key == pygame.K_RIGHT:
                direction = "right"
            elif event.key == pygame.K_p:
                pause = not pause
    if times >= 100 and alive and (not pause):
        direction = direction_yes_no(direction, old_direction)
        old_direction = direction
        front = get_front(head, direction)
        alive = ask_alive(front, body)
        if alive:
            body.append(head)
            head = front
            if food == head:
                food, alive = new_food(head, body)
            else:
                body.pop(0)
        else:
            back_color = BLOCK
            pygame.display.set_caption("游戏结束")
        times = 0
    else:
        times += 1

    screen.fill(back_color)
    new_draw_rect(food, RED, screen)
    for i in body:
        new_draw_rect(i, BLUE, screen)
    new_draw_rect(head, GREEN, screen)

    fclock.tick(100)
    pygame.display.update()

 

 

↑↑↑↑

↑↑↑↑

↑↑↑↑

4,

Q : 游戏截止只怕暂停后因为times >= 100 and alive and (not
pause)始终为假

times += 1 径直运维,,,,会不会不太伏贴

A :
又不会溢出,,,,,,,,撤销暂停时蛇能便捷跑起来如果time==拾0那难题就大了,,亏妥当初留了些余地写成
>=  

(~ ̄▽ ̄)~ 

5,

Q : 蛇跑的太慢笔者想加快

A : 上面包车型大巴times>=100的100随便改一下就行

0->100动一动   变成    0->80 动一动

大概动前边的数

0->100动一动   变成    20->100动一动

照旧将它设置成变量让它随蛇的尺寸变化而生成

6,

打字太累,,

direction那里能够使用0,一,2,三

代替 up left down right

键盘事件和get_front()得用同一套词

7,

Q : 第8个food的地点是永恒的,不能够”动”吗?

A : 因为小编是先定义变量,再定义函数

food = new_food(head,body)

就得写在概念函数后边,小编不忍心让它多个变量孤单,,,,怕您看不到(写了但注释掉了)

动手术

眼前说过

难点1,哪一天动,那里有多个思路,

  • 区间固定时间(一秒),动一回
  • 按三次键动一回,无操作必然时间(一秒)后,重复最终1遍操作

看起来第一种方案  style=”text-decoration: line-through”>简单 不错

其时自家觉着第两种方案很难,,,

写了那个博客后实力大增ᕦ( ᴼ ڡ ᴼ )ᕤ

今天自家正是了

第3个方法,

拍卖按键事件后times = 100 ,例

    if event.key == pygame.K_UP:
        direction = "up"
        times = 100
    elif event.key == pygame.K_LEFT:
        direction = "left"
        times = 100  

 

while循环当轮就能动一动

躲藏操作 : 在0.0壹s内按下三个键,第伍个按的不会”生效”

pygame : 作者得跑完事件列表的每一个成分

那是假的第三方案!!!

第一个主意,

把”动一动”的方方面面代码,打包成函数或许直接写在按键处理的前边

纵然上面times = 拾0的岗位 例

    if event.key == pygame.K_UP:
        direction = "up"
        '动一动'
    elif event.key == pygame.K_LEFT:
        direction = "left"
        '动一动'

 

切记首要的一点times =
0也算”动一动”的始末,第二方案里,按键后计时须要清零!!!

    if times >= 100 and alive and (not pause):
        direction = direction_yes_no(direction, old_direction)
        old_direction = direction
        front = get_front(head, direction)
        alive = ask_alive(front, body)
        if alive:
            body.append(head)
            head = front
            if food == head:
                food, alive = new_food(head, body)
            else:
                body.pop(0)
        else:
            back_color = BLOCK
            pygame.display.set_caption("游戏结束")
        times = 0
    else:
        times += 1

 

为了以免”诈尸”

“动一动”前还得加上if alive and (not pause):

times没须求加

本身就懒得管了(╥╯^╰╥)那篇作品写了太短期,今后已经看不懂当初的代码了

Q :
不驾驭你是否回忆笔者,优化2正是自家问的…..是如此的,笔者对自家的法子还不死心….”动手术”改第一方案后能用吗?

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                direction = "up"
                   """改为"""
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                if direction != "down"
                    direction = "up"

 

A : 对于第二艺术达成的第1方案还是会有小病痛

while循环当轮就能动一动

藏匿操作 : 在0.0一s内按下多个键,第1个按的不会”生效”

pygame : 笔者得跑完事件列表的各类元素

在0.0壹s内,按下几个键,就能够壹如既往触发【秘技: 撞脖子自杀】

其次办法完成的应当没问题…….

 完成撒花✿✿ヽ(°▽°)ノ✿

 

Q :
作者想在加宽显示器在右手展现一下时刻分数之类的新闻,你还有什么”交待”吗?

A :
在pygame展现字体比较有难度….小编只能祝你程序不出BUG…其余点(800,0)到点(800,600)别忘了画到线,提醒玩家”边界”仍然存在的,让玩家摔键盘动怒就不好了

 

Q : 笔者正是对您的颜色搭配有眼光,颜色稍微扎眼….

A :
作者又不是美术,,,,,,,,,,,,颜色搭配的标题,应该,,,,,,,,,应该能够原谅,,,,,,,,,,

 

Q : 游戏太没挑衅性,加点障碍物呗~~

A : walls
会在ask_alive()和new_food()用到,加个if的难点,,,,其余绘制显示器那里多加个for,,,,,

本身就懒得管了(╥╯^╰╥)那篇作品写了太长期,未来早已看不懂当初的代码了

竣事撒花✿✿ヽ(°▽°)ノ✿

这一次真没了..✿✿ヽ(°▽°)ノ✿

如有疏漏,欢迎补充


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图