Boxhead recréé avec Python avec Tkinter

Boxhead recréé en Python de BenR sur Vimeo.

Il y a un jeu incroyablement amusant appelé Boxhead, où essentiellement vous et/ou une autre personne combattre les hordes d’attaquer les Zombies et les démons avec des armes différentes. Pour une ordinateur science classe cette année que je prends, le projet final a été de recréer un jeu informatique en Python avec Tkinter. Boxhead semble être le choix logique et je me mis à les recréer. J’espère que vous apprécierez ce qu’il a transformé en ce jour et j’espère pour ajouter plus d’armes, niveau avec les objets et un deuxième joueur dans l’avenir.

A partir de maintenant Boxhead peut se battre seulement avec un pistolet et des mines, mais ce serait génial d’avoir accès au fusil de chasse et de roquettes.

N’hésitez pas à copier le code et de jouer vous-même ou d’ajouter des armes. Il suffit de garder à l’esprit que le programme et les images doivent être conservées dans le même dossier et les images se trouvent dans les sous-dossiers. Par exemple, les images de Boxhead sont dans un dossier distinct que les images de Zombie. Les Zombies vont dans le sous-dossier « zombies », démons dans des « diables », boxhead « boxhead » et mine/sang/diable attaque (sphère jaune) en « éléments du jeu ».

Les commandes de mouvement sont « WASD », pause « p », ONU-pause « o », basculer entre les armes, « i » et « u ». Plus important encore, cependant, « espace » est feu.

Si vous voulez jouer le jeu, toutes les images nécessaires pour aller de pair avec le code sont disponibles ici ainsi que le code.

# Boxhead # par Ben Rothschild # Boxhead - une copie du jeu original fait en Python avec Tkinter # dernière modification 14/12/2012 de Tkinter import * Importer importation aléatoire math d’importation temps Window_Height = 550 # set fenêtre height et width Window_Width = 800 X_Window_Buffer = Y_Window_Buffer 40 = 40 toile = toile (highlightthickness = 0, hauteur = Window_Height, largeur = Window_Width) canvas.master.title("Boxhead") canvas.pack() Main = canvas.create_rectangle (0,0 Window_Width, Window_Height, fill = "#EBDCC7", belowThis = None) # créer la couleur de base analogue à celle que du pic jeu Boxhead = PhotoImage (largeur = Window_Width, hauteur = Window_Height) canvas.create_image(0,0,image=pic,anchor=NW) Zombie_Dict_Made = False # les Zombies et les Boxhead ont été créés
? boxhead_made = False Run_Game = True New_Level = False B_move_length = 2 # certains des attributs de jeu qui changent et sont utilisés pour la configuration initiale. La plupart serait mieux dans un Zombie_per_move central de la classe Game =.5 Devil_move = 1 direction = 1 shot_duration =.01 Zombie_Buffer = 30 kill_zone = 15 Number_of_Zombies = 5 total_devil_attacks = 0 blood_marks = 0 number_of_mines = 0 pause_game global # pause le jeu si vous appuyez sur « P » ou lancez-le if ' o ' est pressé pause_game = False Mines_Dict = {} # détient la totalité des mines Zombie_Dict = {} # où sont conservés les Zombies - éléments sont supprimés comme Boxhead les pousses Devil_Dict = {} # identique à Zombie_Dict mais pour les Devils Dead_Zombie_List = [] Devil_Attack_Dict = {} # les sphères les diables capable d’attaquer avec la classe Edge_limits(object): "" "dit limites en x n’importe quelle direction y aux objets afin qu’ils ne fonctionnent pas hors de l’écran de jeu" "" def __init__(self) : self.x_start = 2 * X_Window_Buffer - self.y_start 20 = 3 * self.x_end Y_Window_Buffer -35 = Window_Width - X_Window_Buffer - 20 self.y_end = Window_Height - Y_ Window_Buffer - 20 classe Buffer(object): "" "le bord tampons pour le jeu" "" def __init__ (self, x_start, y_start, x_end, y_end, fill): canvas.create_rectangle (x_start, y_start, x_end, y_end, fill = remplissage) left_buffer = Buffer(0,0,(X_Window_Buffer),(Y_Window_Buffer+Window_Height), "Black") # créer tous les tampons images right_buffer = Buffer((X_Window_Buffer+Window_Width) 0,(Window_Width-(X_Window_Buffer)),((2*Y_Window_Buffer)+Window_Height), "Black") top_buffer = Buffer(0,0,(Window_Width-X_Window_Buffer),Y_Window_Buffer,"Black") bottom_buffer = Buffer(0,(Window_Height-Y_Window_Buffer),Window_Width,Window_Height,"Black") class Blood(object): "" "que se passe-t-il lorsque vous tuez quelque chose. Elle crée un sang tache sur les coordonnées de le Zombie(s) tué / Devil(s) ils sont supprimés au début de chaque nouveau niveau "" "def __init__(self,x,y) : global base_for_blood self.image = PhotoImage (fichier ="images/game_elements/blood.gif") self.blood_spot = canvas.create_image (x, y, image = self.image) canvas.tag_lower(self.blood_spot) canvas.tag_lower(Main) class MINE(object):" "" la classe de mines. Regardez où vous montez"" "def __init__(self,x,y) : self.photo = PhotoImage (file ="images/game_elements/mine.gif") self.image = canvas.create_image (x, y, image = self.photo) # créer un rectangle noir pour la mine image canvas.tag_lower(self.image) canvas.tag_lower(Main) self.destroy = False self.x = x self.y = y def explode(self):" ""déterminer si un Zombie ou diable est assez proche de la valeur de la mine. Si c’est vrai, alors il teste pour voir si n’importe quel Zombie ou le diable dans la grande région environnante doit être tué"" "destroy_zombie = destroy_devil [] = [] self.exploded = False pour the_zombie en Zombie_Dict : Zombie = Zombie_Dict [the_zombie] si abs (self.x - Zombie.x) 0: # si la vitesse dans ce sens, c’est pas 0 il ajoute 1 à la vitesse pour qu’il soit plus rapide que le diable qui a tiré sur elle. Self.x_vel +=.75 si self.x_vel 0: self.y_vel +=.75 si self.y_vel = game_limit.x_end) et self.x_vel > 0: # Can boxhead aller dans cette direction ou il frappera le bord de la self.x_vel jeu = 0 if self.x = game_limit.y_end) et self.y_vel > 0: self.y_vel = 0 elif self.y self.shoot_y_end et abs(Zombie.x-self.shoot_x_start) self.shoot_y_start et Zombie.y self.shoot_x_end et abs(Zombie.y-self.shoot_y_start) self.shoot_x_start et Zombie.x self.shoot_y_end et abs(Zombie.x-self.shoot_x_start) self.shoot_y_start et Zombie.y self.shoot_x_end et abs(Zombie.y-self.shoot_y_start) self.shoot_x_start et Zombie.x 0: mine = MINE(self.x,self.y) Mines_Dict [number_of_mines] = mine number_of_mines += 1 self.mine_count-=1 d’autre : passer canvas.update() def key(self,key): "" "regarder l’entrée au clavier et ajuster en conséquence les Boxhead. Mouvement = feu WASD = espace pistolet = I Mines = Pause U = P réactiver = O "" "global press, press pause_game = clé si Appuyez sur == 'w': self.x_vel = 0 self.y_vel = - B_move_length self.direction = 1 si Appuyez sur == de ': self.x_vel = 0 self.y_vel = B_move_length self.direction = 2 si Appuyez sur == 'a': self.x_vel = - B_move_length self.y_vel = 0 self.direction = 3 si Appuyez sur == avait ': self.x_vel = B_move_length self.y_vel = 0 self.direction = 4 si Appuyez sur == 'espace' : self.fire_gun() si Appuyez sur == « p »: pause_game = True si Appuyez sur == ' o ': pause_game = False if Appuyez sur == « i »: self.gun = « Pistolet » self.ammo = 'Infinte' si Appuyez sur == « u »: self.gun = « Mines » self.ammo = self.mine_count def shoot_coords(self,x_start,y_start,x_end,y_end): "" "aide pour régler les coordonnées basé sur où tirer de chaque direction" "" self.shoot_x_start = x_start self.shoot_y_start = y_start self.shoot_x_end = x_end self.shoot_y_end = y_end class Zombie(object) : "" "ZOMBIES. Rien de tel qu’un tas de Zombies qui vous autour de chasser. Boxhead est plus rapidement puis Zombies, mais Zombies peuvent se déplacer en diagonale"" "def __init__(self) : self.zup = PhotoImage (file ="images/zombies/zup.gif") # il y a 8 directions Zombies pouvant déplacer dans self.zdown = PhotoImage (fichier ="images/zombies/zdown.gif") self.zleft = PhotoImage (file ="images/zombies/zleft.gif") self.zright = PhotoImage (fichier ="images/zombies/zright.gif") self.zrightup = PhotoImage (fichier ="images/zombies/zrightup.gif") self.zrightdown = PhotoImage (fichier ="images/zombies/zrightdown.gif") self.zleftup = PhotoImage (fichier ="images/zombies/zleftup.gif") self.zleftdown = PhotoImage (fichier ="images/zombies/zleftdown.gif") self.x = random.randrange (game_limit.x_start (game_limit.x_end-(game_limit.x_end / 2))) # créer des Zombies dans la gauche la moitié de l’arène self.y = random.randrange(game_limit.y_start,game_limit.y_end) self.direction = 1 self.zombie = canvas.create_image (self.x,self.y, image = self.zup) self.alive = True self.distance_to_b = 0 self.attacked = False def move(self,target): "" "cette fonction comme Boxhead1.move tests pour voir si le Zombie va frapper le bord du jeu , mais aussi des tests pour voir si le Zombie est en collision avec un autre Zombie en face d’elle. Ceci aide à éviter présentant toutes les Zombies s’empilent sur le dessus de l’autre et froming un Zombie vraiment dense. C’est ce que la très longue ligne de code ci-dessous met à l’essai"" « boxhead1 global which_zombie = collision 0 = False self.x_vel = 0 self.y_vel = 0 pour which_zombie en Zombie_Dict : test_self = Zombie_Dict [which_zombie] si abs(self.x-boxhead1.x)-abs(boxhead1.x-test_self.x) > 0 et abs(self.x-boxhead1.x)-abs(boxhead1.x-test_self.x) 0 et abs(self.y-boxhead1.y)-abs(boxhead1.y-test_self.y) target.x : self.x_vel=-Zombie_per_move elif self.x == target.x : self.x_vel = 0 if self.x > = Window_Width - 25: # x coords self.x_vel = - Zombie_per_move si self.x target.y : self.y_vel = - Zombie_per_move elif self.y == target.y : self.y_vel = 0 if self.y > = Window_Height - 25: # y coords self.y_vel = - Zombie_per_move si self.y 0 et self.x_vel == 0: canvas.itemconfigure (self.zombie, image = self.zdown) si self.x_vel 0 et self.y_vel == 0 : canvas.itemconfigure (self.zombie, image = self.zright) si self.y_vel > 0 et self.x_vel > 0: canvas.itemconfigure (self.zombie, image = self.zrightdown) si self.y_vel 0: canvas.itemconfigure (self.zombie, image = self.zrightup) si self.y_vel > 0 et self.x_vel 0 et abs(self.x-boxhead1.x)-abs(boxhead1.x-test_self.x) 0 et abs(self.y-boxhead1.y)-abs(boxhead1.y-test_self.y) target.x : self.x_vel=-Devil_move elif self.x == target.x : self.x_vel = 0 if self.x > = Window_Width - 25 : # x coords self.x_vel = - Devil_move si self.x target.y : self.y_vel = - Devil_move elif self.y == target.y : self.y_vel = 0 if self.y > = Window_Height - 25: # y coords self.y_vel = - Devil_move si self.y 0 et self.x_vel == 0: canvas.itemconfigure (self.devil, image = self.ddown) si self.x_vel 0 et self.y_vel == 0: canvas.itemconfigure (self.devil, image = self.dright) si self.y_vel > 0 et self.x_vel > 0 : canvas.itemconfigure (self.devil, image = self.drightdown) si self.y_vel 0: canvas.itemconfigure (self.devil, image = self.drightup) si self.y_vel > 0 et self.x_vel 45 : d_attack = Zombie_Attack(self.x,self.y,self.x_vel,self.y_vel) Devil_Attack_Dict [total_devil_attacks] = d_attack total_devil_attacks = 1 self.attack_fire = 0 sinon : self.attack_fire += 1 def key_press(event): "" "cette fonction passe toutes les touches du téléphone à la fonction Boxhead1.key pour une analyse plus approfondie" "" la presse de global pause_game = event.keysym boxhead1.key(press) si Appuyez sur == ' o ' : pause_game = False def init_game_parts(): "" "Ceci s’appuie tous les éléments du jeu initiales qui ne sont créés une fois quel que soit le nombre de niveaux. Par exemple, il crée le Conseil de la partition"" "mondial vers le haut, bas, droite, gauche global baisse global global droite gauche global current_shot global game_limit global score_board global boxhead1 global Zombie_Dict global game_limit up = Shot() bas = Shot() gauche = Shot() droite = Shot() current_shot = Shot() game_limit = Edge_limits() boxhead1 = Boxhead() score_board = Stats() def new_level():" ""pour chaque nouveau niveau tous les diables et les Zombies ont été tués alors neufs doivent être créées. Chaque temps 70 % plus de Zombies sont ajoutés"" "build_zombie = 0 build_devil = 0 pour i en range(Number_of_Zombies): z = Zombie() Zombie_Dict [build_zombie] = z build_zombie += 1 car moi dans la gamme (int(Number_of_Zombies / 5)): D = Devil() Devil_Dict [build_devil] = D build_devil += 1 def main_loop():" ""la fonction centrale du jeu. Il y a 2 tout en boucles. L’intérieur on n’a cassé pour un nouveau niveau et l’extérieur, tandis que la boucle n’est brisé si boxhead meurt et le jeu est terminé "" "global New_Level, Run_Game, Zombie_Dict, Dead_Zombie_List, Number_of_Zombies, boxhead1 init_game_parts() # créer toutes les images de jeu comme les tampons de bord tout en Run_Game == True : global Blood_Dict Blood_Dict = {} # créer un nouveau dictionnaire de sang vide si boxhead1.health" key_press) canvas.pack() canvas.mainloop()

Articles Liés

Traitement de données avec RasPi et particules (anciennement Spark)

Traitement de données avec RasPi et particules (anciennement Spark)

Salutations ! Bienvenue chez Instructable un autre de NextFab. Dans ce Instructable nous va passer vitesses un peu et faire un Instructable qui est beaucoup plus fondamentaux basée que n'importe qui peut ramasser puis étoffer.Le Raspberry Pi 2 B est
LPD8806 Vumètre avec PC & Arduino + GUI

LPD8806 Vumètre avec PC & Arduino + GUI

Si vous aimez ce projet Merci de voter pour elle dans le « concours de capteurs 2016 » et « Arc en ciel concours 2016 » comme il m'a fallu beaucoup de temps pour le rendre (en appuyant sur le bouton supérieur droit qui dit « Voter »).J'ai toujours vo
AutoFrost CNC Cake Decorator

AutoFrost CNC Cake Decorator

Inspirée par une idée fausse d'une CNC « Cupcake », ce projet de semestre 1 mécatronique prend en entrée depuis une interface graphique comme peinture, envoie des commandes par le biais de Arduino et fonctionne par l'intermédiaire de moteurs pas à pa
Boom et pince bot

Boom et pince bot

Préhenseur robotique ont toujours été amusant choses à jouer avec. En ajoutant un à un robot, c'est comme avoir un jouet Tonka de télécommande de mon enfance. Dans le passé, pinces, où la majeur face à construire et construire, mais avec les impriman
Bot pince télécommande

Bot pince télécommande

A quelques mois en arrière mon fils m'a demandé de lui faire un bot contrôlé à distance. Il m'a donné une liste de ce qu'il voulait et nous réduit à une liste gérable:) C'est ce que j'ai fini par bâtiment pour lui...Répondre à pinces, un robot mobile
Analogique/Raspberry pi Conseil de conversion analogique/numérique et affichage de tension de GUI

Analogique/Raspberry pi Conseil de conversion analogique/numérique et affichage de tension de GUI

Cette instructable est sur la construction et l'exploitation d'un jury de A/D 16/18 BIT 4 canaux « différentiel ». Il est basé sur le MCP3428/MCP3424 et communique à la PI framboise via I2C. Le dessin a été choisi pour permettre une planche ou un num
Simple serpent Accueil

Simple serpent Accueil

J'ai réalisé que notre serpent de maïs se multipliaient quand tout à coup, elle ne cadrait pas dans son préféré cacher. Elle a rampé, recroquevillé et il sauté hors de lui.Il n'est pas juste cornies ; beaucoup d'espèces de serpent comme un coin douil
Blaster DL-44 de LEGO électronique (lumière & Sound)

Blaster DL-44 de LEGO électronique (lumière & Sound)

Mise à jour : ce projet est maintenant disponible sur les idées de LEGO --donc être sûr de le soutenir si vous souhaitez le voir vendus dans les magasins un jour !Construit à l'origine pour Star Wars Day 2014, je vous présente un projet que j'ai été
Fallout 3 Repconn Rocket Toy

Fallout 3 Repconn Rocket Toy

Souvent, un projet qui commence comme une chose peut se retrouver comme quelque chose d'autre entièrement. Cette fusée est un parfait exemple de cela. A l'origine, j'avais l'intention sur la création d'un rouleau à pâtisserie français, pour un ami qu
Chasse de Haggis

Chasse de Haggis

j'ai perfectionné mon haggis capture technique depuis de nombreuses années et je pense avoir trouvé le moyen le plus efficace et sans cruauté d'attraper le Haggis.Éléments requis ;1. pelle2. poivre (noir de préférence mais blanc travaillera également
Bonheur dans une pilule

Bonheur dans une pilule

va Instructabrarians !Voici un voyage de nostalgie pour les fans des années 90.  N'oubliez pas ces dimestore Magic Grow animaux et dinosaures que vous avez obtenu lorsque vous trouveriez dans Safeway lorsque vous étiez enfant ?  Ils sont venus en alv
Poulet à la méditerranéenne

Poulet à la méditerranéenne

vous pouvez obtenir donc beaucoup le prélavés, haché, et assaisonné de produits au supermarché, vous avez à peine de sortir un couteau pour faire de ce repas. Au lieu de devoir découper les olives, les oignons et les tomates, je peux prendre un pot d
Brewduino

Brewduino

Alors, j'ai besoin d'un moyen de contrôler la température dans mon récipient de fermentation.Maison de brassage est assez indulgent dedans est la plage de température, mais ma chambre est tout simplement trop froid pour elle. Alors, j'ai besoin d'un
Lire la vidéo avec Python et GPIO

Lire la vidéo avec Python et GPIO

Bonjour à nouveau. Aujourd'hui je vais montrer un projet en cours, que je suis en train. Ma société m'a accordé le plaisir à construire un kit de démonstration pour l'un de nos gammes de produits. Je travaille dans l'industrie de la basse tension qui