1. 程式人生 > >python小球遊戲程式碼

python小球遊戲程式碼

#python tkinter
#python version 3.3.2
from tkinter import *
'''
    判斷
    兩個小球
    {
        圓心:A(x1,y1)  半徑:r  X軸速度:Vax  Y軸速度:Vay
        圓心:B(x2,y2)  半徑:R  X軸速度:Vbx  Y軸速度:Vby
    }
    碰撞的條件是:
    1.兩個小球的圓心距離不大於兩小球半徑之和(r+R),即:
    {
        (x2 - x1)^2 + (y2 - y1)^2 <= (r + R)^2
    }
    2.小球碰撞後,兩小球的數度交換,即:
    {
        tempVax = Vax
        tempVay = Vay
        Vax = Vbx
        Vay = Vby
        Vbx = tempVax
        Vby = tempVay
        或:
        Vax = Vax + Vbx
        Vbx = Vax - Vbx
        Vax = Vax - Vbx
        Vay = Vay + Vby
        Vby = Vay - Vby
        Vay = Vay - Vby
    }
    遊戲規則:
    五小球在畫布中移動,他們之間會產生碰撞,當然小球和上下左右都會產生碰撞
    碰撞後,小球會改變方向返回
    而最下面的遊標則用於調節小球的移動速度,遊標的範圍是[-100, 100]

   
'''
__author__ = {'author' : 'Hongten',
              'Email' : '
[email protected]
', 'Blog' : 'http://www.cnblogs.com/hongten/', 'Created' : '2013-09-28', 'Version' : '1.1'} class Pong(Frame): def createWidgets(self): #放縮率 self.scaling = 100.0 #畫布比例 self.canvas_width = 10 self.canvas_height = 5.6 ## 畫布 self.draw = Canvas(self, width=(self.canvas_width * self.scaling), height=(self.canvas_height * self.scaling), bg='white') ## 遊標(控制小球移動速度,範圍:[-100, 100]) self.speed = Scale(self, orient=HORIZONTAL, label="ball speed", from_=-200, to=200) self.speed.pack(side=BOTTOM, fill=X) #小球直徑 self.ball_d = 1.0 #小球碰撞牆壁的範圍 self.scaling_left = round(self.ball_d / 2, 1) self.scaling_right = self.canvas_width - self.scaling_left self.scaling_bottom = self.canvas_height - self.scaling_left self.scaling_top = self.scaling_left #遊標度數 self.scale_value = self.speed.get() * 0.1 #存放小球陣列 self.balls = [] #存放小球x座標陣列 self.ball_x = [] #存放小球y座標陣列 self.ball_y = [] #存放小球x軸方向速度陣列 self.ball_v_x = [] #存放小球y軸方向速度陣列 self.ball_v_y = [] # 五個小球 self.ball = self.draw.create_oval("0.60i", "0.60i", "1.60i", "1.60i", fill="red") self.second_ball = self.draw.create_oval("2.0i", "2.0i", "3.0i", "3.0i", fill='black') self.three_ball = self.draw.create_oval("4.0i", "4.0i", "5.0i", "5.0i", fill='brown') self.four_ball = self.draw.create_oval("6.0i", "2.0i", "7.0i", "3.0i", fill='green') self.five_ball = self.draw.create_oval("8.0i", "3.0i", "9.0i", "4.0i", fill='gray') #把五個小球放入陣列 self.balls.append(self.ball) self.balls.append(self.second_ball) self.balls.append(self.three_ball) self.balls.append(self.four_ball) self.balls.append(self.five_ball) #第一個小球,即self.ball的圓心座標(self.x, self.y),這裡進行了放縮,目的是為了 #在小球移動的過程中更加流暢 self.x = 1.1 self.y = 1.1 #第一個小球的速度方向 self.velocity_x = -0.2 self.velocity_y = 0.1 self.second_ball_x = 2.5 self.second_ball_y = 2.5 self.second_ball_v_x = 0.1 self.second_ball_v_y = -0.2 self.three_ball_x = 4.5 self.three_ball_y = 4.5 self.three_ball_v_x = -0.1 self.three_ball_v_y = -0.2 self.four_ball_x = 6.5 self.four_ball_y = 2.5 self.four_ball_v_x = 0.1 self.four_ball_v_y = -0.2 self.five_ball_x = 8.5 self.five_ball_y = 3.5 self.five_ball_v_x = 0.1 self.five_ball_v_y = 0.2 #更新小球的座標 self.update_ball_x_y() self.draw.pack(side=LEFT) def update_ball_x_y(self, *args): '''更新小球的座標,即把各個小球的圓心座標資訊以及速度資訊存放到陣列中, 便於在後面迴圈遍歷的時候使用。''' #第一個小球資訊 self.ball_x.append(self.x) self.ball_y.append(self.y) self.ball_v_x.append(self.velocity_x) self.ball_v_y.append(self.velocity_y) self.ball_x.append(self.second_ball_x) self.ball_y.append(self.second_ball_y) self.ball_v_x.append(self.second_ball_v_x) self.ball_v_y.append(self.second_ball_v_y) self.ball_x.append(self.three_ball_x) self.ball_y.append(self.three_ball_y) self.ball_v_x.append(self.three_ball_v_x) self.ball_v_y.append(self.three_ball_v_y) self.ball_x.append(self.four_ball_x) self.ball_y.append(self.four_ball_y) self.ball_v_x.append(self.four_ball_v_x) self.ball_v_y.append(self.four_ball_v_y) self.ball_x.append(self.five_ball_x) self.ball_y.append(self.five_ball_y) self.ball_v_x.append(self.five_ball_v_x) self.ball_v_y.append(self.five_ball_v_y) def update_ball_velocity(self, index, *args): '''更新各個小球速度資訊,即小球碰撞到四周和另外的小球索要更新的速度資訊''' #遊標值 self.scale_value = self.speed.get() * 0.1 #碰撞牆壁 if (self.ball_x[index] > self.scaling_right) or (self.ball_x[index] < self.scaling_left): self.ball_v_x[index] = -1.0 * self.ball_v_x[index] if (self.ball_y[index] > self.scaling_bottom) or (self.ball_y[index] < self.scaling_top): self.ball_v_y[index] = -1.0 * self.ball_v_y[index] ''' #TEST: for n in range(len(self.balls)): #print((self.ball_x[index] - self.ball_x[n])**2) #print(round((self.ball_x[index] - self.ball_x[n])**2 + (self.ball_y[index] - self.ball_y[n])**2, 2)) print(round((self.ball_x[index] - self.ball_x[n])**2 + (self.ball_y[index] - self.ball_y[n])**2, 2) <= round(self.ball_d**2, 2)) ''' for n in range(len(self.balls)): #小球碰撞條件,即:(x2 - x1)^2 + (y2 - y1)^2 <= (r + R)^2 if (round((self.ball_x[index] - self.ball_x[n])**2 + (self.ball_y[index] - self.ball_y[n])**2, 2) <= round(self.ball_d**2, 2)): #兩小球速度交換 temp_vx = self.ball_v_x[index] temp_vy = self.ball_v_y[index] self.ball_v_x[index] = self.ball_v_x[n] self.ball_v_y[index] = self.ball_v_y[n] self.ball_v_x[n] = temp_vx self.ball_v_y[n] = temp_vy #print(self.ball_v_x, self.ball_v_y) ''' #WRONG: for n in range(len(self.balls)): if (((self.ball_x[index] - self.ball_x[n])**2 + (self.ball_y[index] - self.ball_y[n])**2) <= self.ball_d**2): #兩小球速度交換 self.ball_v_x[index] = self.ball_v_x[index] + self.ball_v_x[n] self.ball_v_x[n] = self.ball_v_x[0] - self.ball_v_x[n] self.ball_v_x[index] = self.ball_v_x[index] - self.ball_v_x[n] self.ball_v_y[index] = self.ball_v_y[index] + self.ball_v_y[n] self.ball_v_y[n] = self.ball_v_y[index] - self.ball_v_y[n] self.ball_v_y[index] = self.ball_v_y[index] - self.ball_v_y[n] print(self.ball_v_x, self.ball_v_y) ''' def get_ball_deltax(self, index, *args): '''獲取小球X軸座標移動距離並且更新小球的圓心X座標,返回X軸所需移動距離''' deltax = (self.ball_v_x[index] * self.scale_value / self.scaling) self.ball_x[index] = self.ball_x[index] + deltax return deltax def get_ball_deltay(self, index, *args): '''獲取小球Y軸座標移動距離並且更新小球的圓心Y座標,返回Y軸所需移動距離''' deltay = (self.ball_v_y[index] * self.scale_value / self.scaling) self.ball_y[index] = self.ball_y[index] + deltay return deltay def moveBall(self, *args): '''移動第一個小球,編號為:0,這是根據陣列:self.balls確定的。''' self.update_ball_velocity(0) deltax = self.get_ball_deltax(0) deltay = self.get_ball_deltay(0) #小球移動 self.draw.move(self.ball, "%ri" % deltax, "%ri" % deltay) self.after(10, self.moveBall) def move_second_ball(self, *args): self.update_ball_velocity(1) deltax = self.get_ball_deltax(1) deltay = self.get_ball_deltay(1) self.draw.move(self.second_ball, "%ri" % deltax, "%ri" % deltay) self.after(10, self.move_second_ball) def move_three_ball(self, *args): self.update_ball_velocity(2) deltax = self.get_ball_deltax(2) deltay = self.get_ball_deltay(2) self.draw.move(self.three_ball, "%ri" % deltax, "%ri" % deltay) self.after(10, self.move_three_ball) def move_four_ball(self, *args): self.update_ball_velocity(3) deltax = self.get_ball_deltax(3) deltay = self.get_ball_deltay(3) self.draw.move(self.four_ball, "%ri" % deltax, "%ri" % deltay) self.after(10, self.move_four_ball) def move_five_ball(self, *args): self.update_ball_velocity(4) deltax = self.get_ball_deltax(4) deltay = self.get_ball_deltay(4) self.draw.move(self.five_ball, "%ri" % deltax, "%ri" % deltay) self.after(10, self.move_five_ball) def __init__(self, master=None): '''初始化函式''' Frame.__init__(self, master) Pack.config(self) self.createWidgets() self.after(10, self.moveBall) self.after(10, self.move_three_ball) self.after(10, self.move_four_ball) self.after(10, self.move_five_ball) self.after(10, self.move_second_ball) game = Pong() game.mainloop()


相關推薦

python小球遊戲程式碼

#python tkinter #python version 3.3.2 from tkinter import * ''' 判斷 兩個小球 { 圓心:A(x1,y1) 半徑:r X軸速度:Vax Y軸速度:Vay

卜若的程式碼筆記-python系列-遊戲篇-第一章:Kivy安裝以及hello world

1.安裝kivy 進入到你的python等根目錄 shift+滑鼠右鍵,喚出power shell 更新或安裝你的pip,如果已經更新完成或者安裝的請忽略 ./python -m pip install --upgrade pip 2.安裝依賴 ./pytho

Python遊戲:300行程式碼實現俄羅斯方塊 Python遊戲:貪吃蛇 Python遊戲:掃雷(附原始碼)

本文程式碼基於 python3.6 和 pygame1.9.4。 俄羅斯方塊是兒時最經典的遊戲之一,剛開始接觸 pygame 的時候就想寫一個俄羅斯方塊。但是想到旋轉,停靠,消除等操作,感覺好像很難啊,等真正寫完了發現,一共也就 300 行程式碼,並沒有什麼難的。 先來看一個遊戲截圖,有點醜,好

Python: 漸進猜數字遊戲 程式碼、測試與猜數字

  測試人員要不要懂開發?要不要寫程式碼? 作為純粹的黑盒測試人員,完全不需要懂開發,依然可以把測試做的很好。 但程式碼是軟體的核心。對程式碼的瞭解可以幫測試人員更加深入的瞭解軟體,可以從程式碼層面設

Python小球遊戲的設計與實現

人們為什麼使用Python? 之所以選擇Python的主要因素有以下幾個方面: 軟體質量:在很大程度上,Python更注重可讀性、一致性和軟體質量,從而與指令碼語言世界中的其他工具區別開發。此外,Python支援軟體開發的高階重用機制。例如面向物件

python遊戲 滾動的小球

# -*- coding: utf-8 -*- """ __author__= 'Du' __creation_time__= '2018/1/4 17:03' """ import sys import pygame from pygame.locals import

Python遊戲 井字棋(人機對戰,玩家對戰)

pan urn utf-8 erl ext print cef () nbsp # -*- coding:utf-8 -*-import timeimport random#井字棋 人機對戰def drawBoard(board): blank_board = '|

Python遊戲之 - 飛機大戰美女 !

TP 飛機大戰 inf info ima com 圖片 大戰 .com 用Python寫的"飛機大戰美女"小遊戲 Python小遊戲之 - 飛機大戰美女 !

python更新遊戲程序

zip move back ack tdi pts lena walk env #!/usr/bin/env python #coding:utf-8 import os import shutil import zipfile dm_path = ‘/data/bz-

Python開發遊戲開服腳本

second min already 文件 r+ alt tor ole watermark #!/usr/bin/env python #coding:utf-8 from pymongo import MongoClient import datetime impor

Python遊戲:測試打字速度

來看 let 測試 int 的人 time() port 輸入 style 現在寫書的人真是一點責任心都沒有,最近看了幾本書,其中的代碼都存在錯誤。 最近迷戀 Python 遊戲,買了《Python遊戲編程入門》[美] Jonathan S·Harbour 著 一書來看。

Python遊戲:貪吃蛇(附源碼)

false 快速 寬度 技術分享 如何 game 點擊 遊戲 範圍 貪吃蛇是個非常簡單的遊戲,適合練手。 首先分析一下這個遊戲 1、蛇怎麽畫? 蛇是由一個個小方塊組成的,那麽我們可以用一個 list 記錄每一個小方塊的坐標,顯示的時候將所有小方塊畫出來即可。 2、蛇怎麽移動

python 三行程式碼實現快速排序

python 三行程式碼實現快速排序 最近在看 python cookbook , 裡面的例子很精彩,這裡就幫過來,做個備忘錄 主要利用了行數的遞迴呼叫和Python的切片特性,解釋一下每行程式碼的含義: 第1行: #coding:utf-8 指定utf

Python飛機大戰程式碼

Python飛機大戰程式碼,分五個檔案存放,每個檔案代表著不同的功能! main.py import pygame import sys import traceback import myplane import enemy import bullet import supply

CCF認證201803-2 碰撞的小球 java程式碼實現。

問題描述   數軸上有一條長度為L(L為偶數)的線段,左端點在原點,右端點在座標L處。有n個不計體積的小球線上段上,開始時所有的小球都處在偶數座標上,速度方向向右,速度大小為1單位長度每秒。   當小球到達線段的端點(左端點或右端點)的時候,會立即向相反的方向移動,速度大小仍然為原來大小。   當兩個小

python TensorFlow 測試程式碼

import tensorflow as tf import numpy as np #create data x_data = np.random.rand(100).astype(np.float32) y_data = x_data*0.1 + 0.3 ###create tensorfl

10 個 Python IDE 和程式碼編輯器 python

Python 非常易學,強大的程式語言。Python 包括高效高階的資料結構,提供簡單且高效的面向物件程式設計。 Python 的學習過程少不了 IDE 或者程式碼編輯器,或者整合的開發編輯器(IDE)。這些 Python 開發工具幫助開發者加快使用 Python 開發的速度,提高效率。

day1-Python線上執行程式碼助手

1、下載指令碼:learning.py 2、將指令碼放在任意目錄下 在存放learning.py的目錄下執行命令: C:\Users\michael\Downloads> python learning.py 或者直接寫個批處理檔案,直接執行批處理檔案即可 cd C:\pyth

WiFi破解這個技術很普通!Python幾行程式碼就可以做到!進來就學會

是不是還在為WiFi密碼發愁,甚至有時候還忘掉自己家的WiFi密碼,沒關係,今天我給大家帶來幾個破解WiFi密碼的案例!我先說明下這個東西一點都不高階,甚至看起來有點糟糕,而且用的是單執行緒~。 案例一: 匯入模組 if reply != b’OK ’:判斷需要修改

python-函式和程式碼複用—七段數碼管繪製和愛心

import turtledef curvemove(): for i in range(200): turtle.right(1) turtle.forward(1)def drawGap(): turtle.penup() turtle.fd(5)def