zoukankan      html  css  js  c++  java
  • 课后作业-结对编程项目总结

    项目介绍:

           贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体叉蛇头撞倒自己身体游戏结束.

            程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇.

    项目代码:


    #coding=UTF-8
    from Tkinter import *
    from random import randint
    import tkMessageBox
    class Grid(object):
    def __init__(self, master=None,height=16, width=24, offset=10, grid_width=50, bg="#808080"):
    self.height = height
    self.width = width
    self.offset = offset
    self.grid_width = grid_width
    self.bg = bg
    self.canvas = Canvas(master, width=self.width*self.grid_width+2*self.offset, height=self.height*self.grid_width+
    2*self.offset, bg=self.bg)
    self.canvas.pack(side=RIGHT, fill=Y)
    def draw(self, pos, color, ):
    x = pos[0] * self.grid_width + self.offset
    y = pos[1] * self.grid_width + self.offset
    #outline属性要与网格的背景色(self.bg)相同,要不然会很丑
    self.canvas.create_rectangle(x, y, x + self.grid_width, y + self.grid_width, fill=color, outline=self.bg)
    class Food(object):
    def __init__(self, grid, color = "#23D978"):
    self.grid = grid
    self.color = color
    self.set_pos()
    self.type = 1
    def set_pos(self):
    x = randint(0, self.grid.width - 1)
    y = randint(0, self.grid.height - 1)
    self.pos = (x, y)
    def display(self):
    self.grid.draw(self.pos, self.color)
    class Snake(object):
    def __init__(self, grid, color = "#000000"):
    self.grid = grid
    self.color = color
    self.body = [(8, 11), (8, 12), (8, 13)]
    self.direction = "Up"
    for i in self.body:
    self.grid.draw(i, self.color)
    #这个方法用于游戏重新开始时初始化贪吃蛇的位置
    def initial(self):
    while not len(self.body) == 0:
    pop = self.body.pop()
    self.grid.draw(pop, self.grid.bg)
    self.body = [(8, 11), (8, 12), (8, 13)]
    self.direction = "Up"
    self.color = "#000000"
    for i in self.body:
    self.grid.draw(i, self.color)
    #蛇像一个指定点移动
    def move(self, new):
    self.body.insert(0, new)
    pop = self.body.pop()
    self.grid.draw(pop, self.grid.bg)
    self.grid.draw(new, self.color)
    #蛇像一个指定点移动,并增加长度
    def add(self ,new):
    self.body.insert(0, new)
    self.grid.draw(new, self.color)
    #蛇吃到了特殊食物1,剪短自身的长度
    def cut_down(self,new):
    self.body.insert(0, new)
    self.grid.draw(new, self.color)
    for i in range(0,3):
    pop = self.body.pop()
    self.grid.draw(pop, self.grid.bg)
    #蛇吃到了特殊食物2,回到最初长度
    def init(self, new):
    self.body.insert(0, new)
    self.grid.draw(new, self.color)
    while len(self.body) > 3:
    pop = self.body.pop()
    self.grid.draw(pop, self.grid.bg)
    #蛇吃到了特殊食物3,改变了自身的颜色,纯属好玩
    def change(self, new, color):
    self.color = color
    self.body.insert(0, new)
    for item in self.body:
    self.grid.draw(item, self.color)
    class SnakeGame(Frame):
    def __init__(self, master):
    Frame.__init__(self, master)
    self.grid = Grid(master)
    self.snake = Snake(self.grid)
    self.food = Food(self.grid)
    self.gameover = False
    self.score = 0
    self.status = ['run', 'stop']
    self.speed = 300
    self.grid.canvas.bind_all("<KeyRelease>", self.key_release)
    self.display_food()
    #用于设置变色食物
    self.color_c = ("#FFB6C1","#6A5ACD","#0000FF","#F0FFF0","#FFFFE0","#F0F8FF","#EE82EE","#000000","#5FA8D9","#32CD32")
    self.i = 0
    #界面左侧显示分数
    self.m = StringVar()
    self.ft1 = ('Fixdsys', 40, "bold")
    self.m1 = Message(master, textvariable=self.m, aspect=5000, font=self.ft1, bg="#696969")
    self.m1.pack(side=LEFT, fill=Y)
    self.m.set("Score:"+str(self.score))
    #这个方法用于游戏重新开始时初始化游戏
    def initial(self):
    self.gameover = False
    self.score = 0
    self.m.set("Score:"+str(self.score))
    self.snake.initial()
    #type1:普通食物 type2:减少2 type3:大乐透,回到最初状态 type4:吃了会变色
    def display_food(self):
    self.food.color = "#23D978"
    self.food.type = 1
    if randint(0, 40) == 5:
    self.food.color = "#FFD700"
    self.food.type = 3
    while (self.food.pos in self.snake.body):
    self.food.set_pos()
    self.food.display()
    elif randint(0, 4) == 2:
    self.food.color = "#EE82EE"
    self.food.type = 4
    while (self.food.pos in self.snake.body):
    self.food.set_pos()
    self.food.display()
    elif len(self.snake.body) > 10 and randint(0, 16) == 5:
    self.food.color = "#BC8F8F"
    self.food.type = 2
    while (self.food.pos in self.snake.body):
    self.food.set_pos()
    self.food.display()
    else:
    while (self.food.pos in self.snake.body):
    self.food.set_pos()
    self.food.display()
    def key_release(self, event):
    key = event.keysym
    key_dict = {"Up": "Down", "Down": "Up", "Left": "Right", "Right": "Left"}
    #蛇不可以像自己的反方向走
    if key_dict.has_key(key) and not key == key_dict[self.snake.direction]:
    self.snake.direction = key
    self.move()
    elif key == 'p':
    self.status.reverse()
    def run(self):
    #首先判断游戏是否暂停
    if not self.status[0] == 'stop':
    #判断游戏是否结束
    if self.gameover == True:
    message = tkMessageBox.showinfo("Game Over", "your score: %d" % self.score)
    if message == 'ok':
    self.initial()
    if self.food.type == 4:
    color = self.color_c[self.i]
    self.i = (self.i+1)%10
    self.food.color = color
    self.food.display()
    self.move(color)
    else:
    self.move()
    self.after(self.speed, self.run)
    def move(self, color="#EE82EE"):
    # 计算蛇下一次移动的点
    head = self.snake.body[0]
    if self.snake.direction == 'Up':
    if head[1] - 1 < 0:
    new = (head[0], 16)
    else:
    new = (head[0], head[1] - 1)
    elif self.snake.direction == 'Down':
    new = (head[0], (head[1] + 1) % 16)
    elif self.snake.direction == 'Left':
    if head[0] - 1 < 0:
    new = (24, head[1])
    else:
    new = (head[0] - 1, head[1])
    else:
    new = ((head[0] + 1) % 24, head[1])
    #撞到自己,设置游戏结束的标志位,等待下一循环
    if new in self.snake.body:
    self.gameover=True
    #吃到食物
    elif new == self.food.pos:
    if self.food.type == 1:
    self.snake.add(new)
    elif self.food.type == 2:
    self.snake.cut_down(new)
    elif self.food.type == 4:
    self.snake.change(new, color)
    else:
    self.snake.init(new)
    self.display_food()
    self.score = self.score+1
    self.m.set("Score:" + str(self.score))
    #什么都没撞到,继续前进
    else:
    self.snake.move(new)
    if __name__ == '__main__':
    root = Tk()
    snakegame = SnakeGame(root)
    snakegame.run()
    snakegame.mainloop()

    项目图示:

      

    游戏图示:

    总结:

          这款游戏的优点,就是简单的画面和容易的操作很容易使玩家就上手,适合不通年龄段的玩家娱乐。当然这款游戏也存在有不足的地方,有些功能还是没有实现。通过这次设计过程中,我查阅了大量的资料,对Python有了更深刻的认识,通过这次的设计,更提高了我在程序设计和调试方面的技巧,更重要的是我认识了自己的不足,在编程方面我还需要努力学习来充实自己,来获取更大的收获。

  • 相关阅读:
    【leetcode】对称二叉树
    【leetcode】判断回文数
    053686
    053685
    053684
    053683
    053682
    053681
    053680
    053477
  • 原文地址:https://www.cnblogs.com/qazwsx1997/p/7773866.html
Copyright © 2011-2022 走看看