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有了更深刻的认识,通过这次的设计,更提高了我在程序设计和调试方面的技巧,更重要的是我认识了自己的不足,在编程方面我还需要努力学习来充实自己,来获取更大的收获。

  • 相关阅读:
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
  • 原文地址:https://www.cnblogs.com/qazwsx1997/p/7773866.html
Copyright © 2011-2022 走看看