mirror of
https://github.com/Fare-spec/cours.git
synced 2025-12-07 02:40:38 +00:00
urgent commit
This commit is contained in:
174
casse-brique/.gitignore
vendored
Normal file
174
casse-brique/.gitignore
vendored
Normal file
@@ -0,0 +1,174 @@
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
cover/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
db.sqlite3-journal
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
.pybuilder/
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# IPython
|
||||
profile_default/
|
||||
ipython_config.py
|
||||
|
||||
# pyenv
|
||||
# For a library or package, you might want to ignore these files since the code is
|
||||
# intended to run in multiple environments; otherwise, check them in:
|
||||
# .python-version
|
||||
|
||||
# pipenv
|
||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||
# install all needed dependencies.
|
||||
#Pipfile.lock
|
||||
|
||||
# UV
|
||||
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
||||
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||
# commonly ignored for libraries.
|
||||
#uv.lock
|
||||
|
||||
# poetry
|
||||
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
||||
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||
# commonly ignored for libraries.
|
||||
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
||||
#poetry.lock
|
||||
|
||||
# pdm
|
||||
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
||||
#pdm.lock
|
||||
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
||||
# in version control.
|
||||
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
|
||||
.pdm.toml
|
||||
.pdm-python
|
||||
.pdm-build/
|
||||
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||
__pypackages__/
|
||||
|
||||
# Celery stuff
|
||||
celerybeat-schedule
|
||||
celerybeat.pid
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
.spyproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
# mkdocs documentation
|
||||
/site
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# pytype static type analyzer
|
||||
.pytype/
|
||||
|
||||
# Cython debug symbols
|
||||
cython_debug/
|
||||
|
||||
# PyCharm
|
||||
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
||||
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
||||
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||
#.idea/
|
||||
|
||||
# Ruff stuff:
|
||||
.ruff_cache/
|
||||
|
||||
# PyPI configuration file
|
||||
.pypirc
|
||||
373
casse-brique/LICENSE
Normal file
373
casse-brique/LICENSE
Normal file
@@ -0,0 +1,373 @@
|
||||
Mozilla Public License Version 2.0
|
||||
==================================
|
||||
|
||||
1. Definitions
|
||||
--------------
|
||||
|
||||
1.1. "Contributor"
|
||||
means each individual or legal entity that creates, contributes to
|
||||
the creation of, or owns Covered Software.
|
||||
|
||||
1.2. "Contributor Version"
|
||||
means the combination of the Contributions of others (if any) used
|
||||
by a Contributor and that particular Contributor's Contribution.
|
||||
|
||||
1.3. "Contribution"
|
||||
means Covered Software of a particular Contributor.
|
||||
|
||||
1.4. "Covered Software"
|
||||
means Source Code Form to which the initial Contributor has attached
|
||||
the notice in Exhibit A, the Executable Form of such Source Code
|
||||
Form, and Modifications of such Source Code Form, in each case
|
||||
including portions thereof.
|
||||
|
||||
1.5. "Incompatible With Secondary Licenses"
|
||||
means
|
||||
|
||||
(a) that the initial Contributor has attached the notice described
|
||||
in Exhibit B to the Covered Software; or
|
||||
|
||||
(b) that the Covered Software was made available under the terms of
|
||||
version 1.1 or earlier of the License, but not also under the
|
||||
terms of a Secondary License.
|
||||
|
||||
1.6. "Executable Form"
|
||||
means any form of the work other than Source Code Form.
|
||||
|
||||
1.7. "Larger Work"
|
||||
means a work that combines Covered Software with other material, in
|
||||
a separate file or files, that is not Covered Software.
|
||||
|
||||
1.8. "License"
|
||||
means this document.
|
||||
|
||||
1.9. "Licensable"
|
||||
means having the right to grant, to the maximum extent possible,
|
||||
whether at the time of the initial grant or subsequently, any and
|
||||
all of the rights conveyed by this License.
|
||||
|
||||
1.10. "Modifications"
|
||||
means any of the following:
|
||||
|
||||
(a) any file in Source Code Form that results from an addition to,
|
||||
deletion from, or modification of the contents of Covered
|
||||
Software; or
|
||||
|
||||
(b) any new file in Source Code Form that contains any Covered
|
||||
Software.
|
||||
|
||||
1.11. "Patent Claims" of a Contributor
|
||||
means any patent claim(s), including without limitation, method,
|
||||
process, and apparatus claims, in any patent Licensable by such
|
||||
Contributor that would be infringed, but for the grant of the
|
||||
License, by the making, using, selling, offering for sale, having
|
||||
made, import, or transfer of either its Contributions or its
|
||||
Contributor Version.
|
||||
|
||||
1.12. "Secondary License"
|
||||
means either the GNU General Public License, Version 2.0, the GNU
|
||||
Lesser General Public License, Version 2.1, the GNU Affero General
|
||||
Public License, Version 3.0, or any later versions of those
|
||||
licenses.
|
||||
|
||||
1.13. "Source Code Form"
|
||||
means the form of the work preferred for making modifications.
|
||||
|
||||
1.14. "You" (or "Your")
|
||||
means an individual or a legal entity exercising rights under this
|
||||
License. For legal entities, "You" includes any entity that
|
||||
controls, is controlled by, or is under common control with You. For
|
||||
purposes of this definition, "control" means (a) the power, direct
|
||||
or indirect, to cause the direction or management of such entity,
|
||||
whether by contract or otherwise, or (b) ownership of more than
|
||||
fifty percent (50%) of the outstanding shares or beneficial
|
||||
ownership of such entity.
|
||||
|
||||
2. License Grants and Conditions
|
||||
--------------------------------
|
||||
|
||||
2.1. Grants
|
||||
|
||||
Each Contributor hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license:
|
||||
|
||||
(a) under intellectual property rights (other than patent or trademark)
|
||||
Licensable by such Contributor to use, reproduce, make available,
|
||||
modify, display, perform, distribute, and otherwise exploit its
|
||||
Contributions, either on an unmodified basis, with Modifications, or
|
||||
as part of a Larger Work; and
|
||||
|
||||
(b) under Patent Claims of such Contributor to make, use, sell, offer
|
||||
for sale, have made, import, and otherwise transfer either its
|
||||
Contributions or its Contributor Version.
|
||||
|
||||
2.2. Effective Date
|
||||
|
||||
The licenses granted in Section 2.1 with respect to any Contribution
|
||||
become effective for each Contribution on the date the Contributor first
|
||||
distributes such Contribution.
|
||||
|
||||
2.3. Limitations on Grant Scope
|
||||
|
||||
The licenses granted in this Section 2 are the only rights granted under
|
||||
this License. No additional rights or licenses will be implied from the
|
||||
distribution or licensing of Covered Software under this License.
|
||||
Notwithstanding Section 2.1(b) above, no patent license is granted by a
|
||||
Contributor:
|
||||
|
||||
(a) for any code that a Contributor has removed from Covered Software;
|
||||
or
|
||||
|
||||
(b) for infringements caused by: (i) Your and any other third party's
|
||||
modifications of Covered Software, or (ii) the combination of its
|
||||
Contributions with other software (except as part of its Contributor
|
||||
Version); or
|
||||
|
||||
(c) under Patent Claims infringed by Covered Software in the absence of
|
||||
its Contributions.
|
||||
|
||||
This License does not grant any rights in the trademarks, service marks,
|
||||
or logos of any Contributor (except as may be necessary to comply with
|
||||
the notice requirements in Section 3.4).
|
||||
|
||||
2.4. Subsequent Licenses
|
||||
|
||||
No Contributor makes additional grants as a result of Your choice to
|
||||
distribute the Covered Software under a subsequent version of this
|
||||
License (see Section 10.2) or under the terms of a Secondary License (if
|
||||
permitted under the terms of Section 3.3).
|
||||
|
||||
2.5. Representation
|
||||
|
||||
Each Contributor represents that the Contributor believes its
|
||||
Contributions are its original creation(s) or it has sufficient rights
|
||||
to grant the rights to its Contributions conveyed by this License.
|
||||
|
||||
2.6. Fair Use
|
||||
|
||||
This License is not intended to limit any rights You have under
|
||||
applicable copyright doctrines of fair use, fair dealing, or other
|
||||
equivalents.
|
||||
|
||||
2.7. Conditions
|
||||
|
||||
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
|
||||
in Section 2.1.
|
||||
|
||||
3. Responsibilities
|
||||
-------------------
|
||||
|
||||
3.1. Distribution of Source Form
|
||||
|
||||
All distribution of Covered Software in Source Code Form, including any
|
||||
Modifications that You create or to which You contribute, must be under
|
||||
the terms of this License. You must inform recipients that the Source
|
||||
Code Form of the Covered Software is governed by the terms of this
|
||||
License, and how they can obtain a copy of this License. You may not
|
||||
attempt to alter or restrict the recipients' rights in the Source Code
|
||||
Form.
|
||||
|
||||
3.2. Distribution of Executable Form
|
||||
|
||||
If You distribute Covered Software in Executable Form then:
|
||||
|
||||
(a) such Covered Software must also be made available in Source Code
|
||||
Form, as described in Section 3.1, and You must inform recipients of
|
||||
the Executable Form how they can obtain a copy of such Source Code
|
||||
Form by reasonable means in a timely manner, at a charge no more
|
||||
than the cost of distribution to the recipient; and
|
||||
|
||||
(b) You may distribute such Executable Form under the terms of this
|
||||
License, or sublicense it under different terms, provided that the
|
||||
license for the Executable Form does not attempt to limit or alter
|
||||
the recipients' rights in the Source Code Form under this License.
|
||||
|
||||
3.3. Distribution of a Larger Work
|
||||
|
||||
You may create and distribute a Larger Work under terms of Your choice,
|
||||
provided that You also comply with the requirements of this License for
|
||||
the Covered Software. If the Larger Work is a combination of Covered
|
||||
Software with a work governed by one or more Secondary Licenses, and the
|
||||
Covered Software is not Incompatible With Secondary Licenses, this
|
||||
License permits You to additionally distribute such Covered Software
|
||||
under the terms of such Secondary License(s), so that the recipient of
|
||||
the Larger Work may, at their option, further distribute the Covered
|
||||
Software under the terms of either this License or such Secondary
|
||||
License(s).
|
||||
|
||||
3.4. Notices
|
||||
|
||||
You may not remove or alter the substance of any license notices
|
||||
(including copyright notices, patent notices, disclaimers of warranty,
|
||||
or limitations of liability) contained within the Source Code Form of
|
||||
the Covered Software, except that You may alter any license notices to
|
||||
the extent required to remedy known factual inaccuracies.
|
||||
|
||||
3.5. Application of Additional Terms
|
||||
|
||||
You may choose to offer, and to charge a fee for, warranty, support,
|
||||
indemnity or liability obligations to one or more recipients of Covered
|
||||
Software. However, You may do so only on Your own behalf, and not on
|
||||
behalf of any Contributor. You must make it absolutely clear that any
|
||||
such warranty, support, indemnity, or liability obligation is offered by
|
||||
You alone, and You hereby agree to indemnify every Contributor for any
|
||||
liability incurred by such Contributor as a result of warranty, support,
|
||||
indemnity or liability terms You offer. You may include additional
|
||||
disclaimers of warranty and limitations of liability specific to any
|
||||
jurisdiction.
|
||||
|
||||
4. Inability to Comply Due to Statute or Regulation
|
||||
---------------------------------------------------
|
||||
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Software due to
|
||||
statute, judicial order, or regulation then You must: (a) comply with
|
||||
the terms of this License to the maximum extent possible; and (b)
|
||||
describe the limitations and the code they affect. Such description must
|
||||
be placed in a text file included with all distributions of the Covered
|
||||
Software under this License. Except to the extent prohibited by statute
|
||||
or regulation, such description must be sufficiently detailed for a
|
||||
recipient of ordinary skill to be able to understand it.
|
||||
|
||||
5. Termination
|
||||
--------------
|
||||
|
||||
5.1. The rights granted under this License will terminate automatically
|
||||
if You fail to comply with any of its terms. However, if You become
|
||||
compliant, then the rights granted under this License from a particular
|
||||
Contributor are reinstated (a) provisionally, unless and until such
|
||||
Contributor explicitly and finally terminates Your grants, and (b) on an
|
||||
ongoing basis, if such Contributor fails to notify You of the
|
||||
non-compliance by some reasonable means prior to 60 days after You have
|
||||
come back into compliance. Moreover, Your grants from a particular
|
||||
Contributor are reinstated on an ongoing basis if such Contributor
|
||||
notifies You of the non-compliance by some reasonable means, this is the
|
||||
first time You have received notice of non-compliance with this License
|
||||
from such Contributor, and You become compliant prior to 30 days after
|
||||
Your receipt of the notice.
|
||||
|
||||
5.2. If You initiate litigation against any entity by asserting a patent
|
||||
infringement claim (excluding declaratory judgment actions,
|
||||
counter-claims, and cross-claims) alleging that a Contributor Version
|
||||
directly or indirectly infringes any patent, then the rights granted to
|
||||
You by any and all Contributors for the Covered Software under Section
|
||||
2.1 of this License shall terminate.
|
||||
|
||||
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
|
||||
end user license agreements (excluding distributors and resellers) which
|
||||
have been validly granted by You or Your distributors under this License
|
||||
prior to termination shall survive termination.
|
||||
|
||||
************************************************************************
|
||||
* *
|
||||
* 6. Disclaimer of Warranty *
|
||||
* ------------------------- *
|
||||
* *
|
||||
* Covered Software is provided under this License on an "as is" *
|
||||
* basis, without warranty of any kind, either expressed, implied, or *
|
||||
* statutory, including, without limitation, warranties that the *
|
||||
* Covered Software is free of defects, merchantable, fit for a *
|
||||
* particular purpose or non-infringing. The entire risk as to the *
|
||||
* quality and performance of the Covered Software is with You. *
|
||||
* Should any Covered Software prove defective in any respect, You *
|
||||
* (not any Contributor) assume the cost of any necessary servicing, *
|
||||
* repair, or correction. This disclaimer of warranty constitutes an *
|
||||
* essential part of this License. No use of any Covered Software is *
|
||||
* authorized under this License except under this disclaimer. *
|
||||
* *
|
||||
************************************************************************
|
||||
|
||||
************************************************************************
|
||||
* *
|
||||
* 7. Limitation of Liability *
|
||||
* -------------------------- *
|
||||
* *
|
||||
* Under no circumstances and under no legal theory, whether tort *
|
||||
* (including negligence), contract, or otherwise, shall any *
|
||||
* Contributor, or anyone who distributes Covered Software as *
|
||||
* permitted above, be liable to You for any direct, indirect, *
|
||||
* special, incidental, or consequential damages of any character *
|
||||
* including, without limitation, damages for lost profits, loss of *
|
||||
* goodwill, work stoppage, computer failure or malfunction, or any *
|
||||
* and all other commercial damages or losses, even if such party *
|
||||
* shall have been informed of the possibility of such damages. This *
|
||||
* limitation of liability shall not apply to liability for death or *
|
||||
* personal injury resulting from such party's negligence to the *
|
||||
* extent applicable law prohibits such limitation. Some *
|
||||
* jurisdictions do not allow the exclusion or limitation of *
|
||||
* incidental or consequential damages, so this exclusion and *
|
||||
* limitation may not apply to You. *
|
||||
* *
|
||||
************************************************************************
|
||||
|
||||
8. Litigation
|
||||
-------------
|
||||
|
||||
Any litigation relating to this License may be brought only in the
|
||||
courts of a jurisdiction where the defendant maintains its principal
|
||||
place of business and such litigation shall be governed by laws of that
|
||||
jurisdiction, without reference to its conflict-of-law provisions.
|
||||
Nothing in this Section shall prevent a party's ability to bring
|
||||
cross-claims or counter-claims.
|
||||
|
||||
9. Miscellaneous
|
||||
----------------
|
||||
|
||||
This License represents the complete agreement concerning the subject
|
||||
matter hereof. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent
|
||||
necessary to make it enforceable. Any law or regulation which provides
|
||||
that the language of a contract shall be construed against the drafter
|
||||
shall not be used to construe this License against a Contributor.
|
||||
|
||||
10. Versions of the License
|
||||
---------------------------
|
||||
|
||||
10.1. New Versions
|
||||
|
||||
Mozilla Foundation is the license steward. Except as provided in Section
|
||||
10.3, no one other than the license steward has the right to modify or
|
||||
publish new versions of this License. Each version will be given a
|
||||
distinguishing version number.
|
||||
|
||||
10.2. Effect of New Versions
|
||||
|
||||
You may distribute the Covered Software under the terms of the version
|
||||
of the License under which You originally received the Covered Software,
|
||||
or under the terms of any subsequent version published by the license
|
||||
steward.
|
||||
|
||||
10.3. Modified Versions
|
||||
|
||||
If you create software not governed by this License, and you want to
|
||||
create a new license for such software, you may create and use a
|
||||
modified version of this License if you rename the license and remove
|
||||
any references to the name of the license steward (except to note that
|
||||
such modified license differs from this License).
|
||||
|
||||
10.4. Distributing Source Code Form that is Incompatible With Secondary
|
||||
Licenses
|
||||
|
||||
If You choose to distribute Source Code Form that is Incompatible With
|
||||
Secondary Licenses under the terms of this version of the License, the
|
||||
notice described in Exhibit B of this License must be attached.
|
||||
|
||||
Exhibit A - Source Code Form License Notice
|
||||
-------------------------------------------
|
||||
|
||||
This Source Code Form is subject to the terms of the Mozilla Public
|
||||
License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
If it is not possible or desirable to put the notice in a particular
|
||||
file, then You may include the notice in a location (such as a LICENSE
|
||||
file in a relevant directory) where a recipient would be likely to look
|
||||
for such a notice.
|
||||
|
||||
You may add additional accurate notices of copyright ownership.
|
||||
|
||||
Exhibit B - "Incompatible With Secondary Licenses" Notice
|
||||
---------------------------------------------------------
|
||||
|
||||
This Source Code Form is "Incompatible With Secondary Licenses", as
|
||||
defined by the Mozilla Public License, v. 2.0.
|
||||
7
casse-brique/README.md
Normal file
7
casse-brique/README.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# casse-brique
|
||||
Un casse brique.
|
||||
- bruit, musique et fin de niveau -> branch: music
|
||||
- plusieurs niveau -> branch: niveau
|
||||
- gestion highscore -> branch: score
|
||||
- gestion vie -> branch: vie
|
||||
- briques spéciales -> branch: speciale
|
||||
57
casse-brique/balle.py
Normal file
57
casse-brique/balle.py
Normal file
@@ -0,0 +1,57 @@
|
||||
import pygame
|
||||
import math
|
||||
from constantes import *
|
||||
|
||||
|
||||
class Balle:
|
||||
"""
|
||||
Definie une balle qui se deplace dans la fenetre ecran
|
||||
Attributs : rayon, xpos, ypos, xvit, yvit
|
||||
Methodes : deplace, doitRebondir(raquette), affiche
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.rayon = 10
|
||||
self.xpos = LARGEUR_ECRAN / 2
|
||||
self.ypos = HAUTEUR_ECRAN / 2
|
||||
self.xvit = 4.5
|
||||
self.yvit = 3.0
|
||||
|
||||
def doitRebondir(self, raquette):
|
||||
return (
|
||||
self.xpos >= raquette.xpos
|
||||
and self.xpos <= raquette.xpos + raquette.largeur
|
||||
and self.ypos >= HAUTEUR_ECRAN - 30
|
||||
)
|
||||
|
||||
def deplace(self, raquette):
|
||||
self.xpos += self.xvit
|
||||
self.ypos += self.yvit
|
||||
if self.doitRebondir(raquette):
|
||||
angle_degre = 10 + 160 * (
|
||||
1 - (self.xpos - raquette.xpos) / raquette.largeur
|
||||
)
|
||||
angle_radian = angle_degre * math.pi / 180
|
||||
old_xvit = self.xvit
|
||||
self.xvit = math.sqrt(self.xvit**2 + self.yvit**2) * math.cos(angle_radian)
|
||||
self.yvit = -math.sqrt(old_xvit**2 + self.yvit**2) * math.sin(angle_radian)
|
||||
self.xpos += self.xvit
|
||||
self.ypos += self.yvit
|
||||
if self.xpos + self.rayon > LARGEUR_ECRAN or self.xpos - self.rayon < 0:
|
||||
self.xvit = -self.xvit
|
||||
self.xpos += self.xvit
|
||||
self.ypos += self.yvit
|
||||
elif self.ypos - self.rayon < 0:
|
||||
self.yvit = -self.yvit
|
||||
self.xpos += self.xvit
|
||||
self.ypos += self.yvit
|
||||
|
||||
def affiche(self, ecran):
|
||||
pygame.draw.circle(
|
||||
ecran, (0, 0, 0), (int(self.xpos), int(self.ypos)), self.rayon
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
b1 = Balle()
|
||||
print(b1.xpos)
|
||||
37
casse-brique/bouton.py
Normal file
37
casse-brique/bouton.py
Normal file
@@ -0,0 +1,37 @@
|
||||
import pygame
|
||||
import pygame.freetype
|
||||
|
||||
|
||||
class Bouton:
|
||||
"""
|
||||
Définie un bouton composé :
|
||||
d'une zone cliquable : un Rect de pygame
|
||||
un texte : à afficher au centre de la zone cliquable
|
||||
une couleur de fond : (r,v,b)
|
||||
éventuellement une font :
|
||||
"""
|
||||
|
||||
def __init__(self, zone, texte, couleur):
|
||||
"""
|
||||
Initialise une instance de bouton.
|
||||
Paramètres :
|
||||
zone : 4-uple (top, left, width, height)
|
||||
texte : String
|
||||
couleur : 3-uple (r,v,b)
|
||||
"""
|
||||
self.zone_cliquable = pygame.Rect(zone)
|
||||
self.texte = texte
|
||||
self.couleur = couleur
|
||||
self.ma_Font = pygame.freetype.SysFont("digital-7.ttf", 20)
|
||||
|
||||
def affiche(self, ecran):
|
||||
"""
|
||||
Affiche dans la surface ecran la Surface associé au Rect
|
||||
avec le texte centré dans la Surface.
|
||||
"""
|
||||
zone_aff = pygame.Surface(self.zone_cliquable.size)
|
||||
zone_aff.fill(self.couleur)
|
||||
ecran.blit(zone_aff, self.zone_cliquable)
|
||||
text_Surf, text_Rect = self.ma_Font.render(self.texte, (0, 0, 0))
|
||||
text_Rect.center = self.zone_cliquable.center
|
||||
ecran.blit(text_Surf, text_Rect)
|
||||
85
casse-brique/brique.py
Normal file
85
casse-brique/brique.py
Normal file
@@ -0,0 +1,85 @@
|
||||
import pygame
|
||||
from constantes import *
|
||||
|
||||
|
||||
class Brique:
|
||||
"""
|
||||
Definie l'objet brique immobile dans le jeu.
|
||||
Attributs : xpos, ypos, vie, largeur, hauteur tous de type int
|
||||
Methodes : enVie(), collisionVerticale(balle), collisionHorizontale(balle),
|
||||
collision(balle), affiche()
|
||||
"""
|
||||
|
||||
def __init__(self, xpos, ypos, vie):
|
||||
self.xpos = xpos
|
||||
self.ypos = ypos
|
||||
self.vie = vie
|
||||
self.largeur = LARGEUR_ECRAN // 15
|
||||
self.hauteur = 20
|
||||
|
||||
def enVie(self):
|
||||
"""indique si la brique à un nombre de vie strictement positif
|
||||
Paramètres :
|
||||
une brique mais utiliser br.enVie()
|
||||
Return :
|
||||
True si self.vie > 0
|
||||
False sinon
|
||||
"""
|
||||
return self.vie > 0
|
||||
|
||||
def collisionVerticale(self, balle):
|
||||
return (
|
||||
balle.xpos > self.xpos
|
||||
and balle.xpos < self.xpos + self.largeur
|
||||
and (
|
||||
(balle.ypos < self.ypos and balle.ypos + balle.rayon > self.ypos)
|
||||
or (
|
||||
balle.ypos > self.ypos + self.hauteur
|
||||
and balle.ypos - balle.rayon < self.ypos + self.hauteur
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
def collisionHorizontale(self, balle):
|
||||
return (
|
||||
balle.ypos > self.ypos
|
||||
and balle.ypos < self.ypos + self.hauteur
|
||||
and (
|
||||
(balle.xpos < self.xpos and balle.xpos + balle.rayon > self.xpos)
|
||||
or (
|
||||
balle.xpos > self.xpos + self.largeur
|
||||
and balle.xpos - balle.rayon < self.xpos + self.largeur
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
def collision(self, balle):
|
||||
if self.enVie():
|
||||
if self.collisionVerticale(balle):
|
||||
balle.yvit = -balle.yvit
|
||||
self.vie -= 1
|
||||
balle.xpos += balle.xvit
|
||||
balle.ypos += balle.yvit
|
||||
elif self.collisionHorizontale(balle):
|
||||
balle.xvit = -balle.xvit
|
||||
self.vie -= 1
|
||||
balle.xpos += balle.xvit
|
||||
balle.ypos += balle.yvit
|
||||
|
||||
def affiche(self, ecran):
|
||||
if self.enVie():
|
||||
pygame.draw.rect(
|
||||
ecran, (0, 0, 0), (self.xpos, self.ypos, self.largeur, self.hauteur)
|
||||
)
|
||||
if self.vie > 1:
|
||||
pygame.draw.rect(
|
||||
ecran,
|
||||
(255, 0, 0),
|
||||
(self.xpos + 1, self.ypos + 1, self.largeur - 2, self.hauteur - 2),
|
||||
)
|
||||
else:
|
||||
pygame.draw.rect(
|
||||
ecran,
|
||||
(0, 255, 0),
|
||||
(self.xpos + 1, self.ypos + 1, self.largeur - 2, self.hauteur - 2),
|
||||
)
|
||||
7
casse-brique/constantes.py
Normal file
7
casse-brique/constantes.py
Normal file
@@ -0,0 +1,7 @@
|
||||
##########Definitions des constantes
|
||||
# Taille de la fenetre
|
||||
LARGEUR_ECRAN = 600
|
||||
HAUTEUR_ECRAN = 800
|
||||
# Couleur
|
||||
BLANC = (255, 255, 255)
|
||||
NOIR = (0, 0, 0)
|
||||
16
casse-brique/highscore.py
Normal file
16
casse-brique/highscore.py
Normal file
@@ -0,0 +1,16 @@
|
||||
import sys, pygame
|
||||
import bouton
|
||||
from constantes import *
|
||||
|
||||
|
||||
class Highscore:
|
||||
""" """
|
||||
|
||||
def __init__(self):
|
||||
self.fichier = "highscore.txt"
|
||||
self.bouton_quitter = bouton.Bouton(
|
||||
(100, 100, 400, 100), "Retour au Menu", (255, 0, 0)
|
||||
)
|
||||
|
||||
def gereHighScore(self, ecran):
|
||||
pass
|
||||
1
casse-brique/highscore.txt
Normal file
1
casse-brique/highscore.txt
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
63
casse-brique/jeu.py
Normal file
63
casse-brique/jeu.py
Normal file
@@ -0,0 +1,63 @@
|
||||
import sys, pygame
|
||||
import niveau
|
||||
from constantes import *
|
||||
|
||||
|
||||
class Jeu:
|
||||
"""gère les différents états d'un jeu"""
|
||||
|
||||
def __init__(self):
|
||||
self.n1 = niveau.Niveau()
|
||||
self.vie = 3
|
||||
self.bouge = False
|
||||
self.etatJeu = 1
|
||||
|
||||
def gereJeu(self, ecran):
|
||||
if self.etatJeu == 1: # Debut de niveau
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT: # Evt de sortie de boucle
|
||||
sys.exit()
|
||||
elif event.type == pygame.MOUSEBUTTONDOWN:
|
||||
self.bouge = True
|
||||
elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
|
||||
self.bouge = True
|
||||
self.n1.affiche(ecran)
|
||||
if self.bouge:
|
||||
self.etatJeu = 2
|
||||
elif self.etatJeu == 2: # Niveau en cours
|
||||
self.etatJeu = self.n1.gereNiveau(ecran)
|
||||
elif self.etatJeu == 3: # Changement de niveau
|
||||
pass
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
"""
|
||||
while True: #Demarrage de la boucle infinie
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT: #Evt de sortie de boucle
|
||||
sys.exit()
|
||||
elif event.type == pygame.MOUSEBUTTONDOWN:
|
||||
bouge = not bouge
|
||||
elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
|
||||
bouge = not bouge
|
||||
if pygame.key.get_pressed()[pygame.K_q] == True:
|
||||
r1.deplaceGauche()
|
||||
if pygame.key.get_pressed()[pygame.K_d] == True:
|
||||
r1.deplaceDroite()
|
||||
|
||||
ecran.fill(BLANC)
|
||||
|
||||
if bouge:
|
||||
b1.deplace(r1)
|
||||
m1.collision(b1)
|
||||
|
||||
b1.affiche(ecran)
|
||||
r1.affiche(ecran)
|
||||
m1.affiche(ecran)
|
||||
|
||||
|
||||
|
||||
pygame.display.update() #rafraichissement
|
||||
clock.tick(60)
|
||||
"""
|
||||
@@ -1,255 +1,55 @@
|
||||
import pygame
|
||||
import sys
|
||||
import random
|
||||
import math
|
||||
import sys, pygame
|
||||
import bouton
|
||||
import constantes
|
||||
import pygame.freetype
|
||||
import jeu, highscore
|
||||
|
||||
# Initialisation de Pygame
|
||||
pygame.init()
|
||||
|
||||
# Définition des dimensions de la fenêtre
|
||||
SCREEN_WIDTH = 1080
|
||||
SCREEN_HEIGHT = 720
|
||||
def affiche_menu(ecran):
|
||||
b1.affiche(ecran)
|
||||
b2.affiche(ecran)
|
||||
b3.affiche(ecran)
|
||||
return 0
|
||||
|
||||
# Définition des couleurs (R, G, B)
|
||||
BLACK = (0, 0, 0)
|
||||
WHITE = (255, 255, 255)
|
||||
BLUE = (0, 0, 255)
|
||||
RED = (255, 0, 0)
|
||||
|
||||
# Création de la fenêtre de jeu
|
||||
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
|
||||
pygame.display.set_caption("Casse-Brique Auto-Play")
|
||||
pygame.init() # initialisation des modules de pygame
|
||||
|
||||
# Creation de la fenetre
|
||||
ecran = pygame.display.set_mode((constantes.LARGEUR_ECRAN, constantes.HAUTEUR_ECRAN))
|
||||
ecran.fill(constantes.BLANC)
|
||||
pygame.display.set_caption("Casse Brique")
|
||||
|
||||
clock = pygame.time.Clock()
|
||||
FPS = 100
|
||||
|
||||
b1 = bouton.Bouton((100, 100, 400, 100), "Jouer", (255, 0, 0))
|
||||
b2 = bouton.Bouton((100, 300, 400, 100), "Highscore", (255, 0, 0))
|
||||
b3 = bouton.Bouton((100, 500, 400, 100), "Quitter", (255, 0, 0))
|
||||
hs1 = highscore.Highscore()
|
||||
j1 = jeu.Jeu()
|
||||
etat = 0
|
||||
|
||||
|
||||
# Fonction d'affichage du menu de démarrage
|
||||
def show_menu():
|
||||
menu_running = True
|
||||
title_font = pygame.font.SysFont("Arial", 72)
|
||||
button_font = pygame.font.SysFont("Arial", 36)
|
||||
button_width = 200
|
||||
button_height = 50
|
||||
button_rect = pygame.Rect(0, 0, button_width, button_height)
|
||||
button_rect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)
|
||||
|
||||
while menu_running:
|
||||
clock.tick(FPS)
|
||||
screen.fill(BLACK)
|
||||
|
||||
# Affichage du titre
|
||||
title_surface = title_font.render("Casse-Brique", True, WHITE)
|
||||
title_rect = title_surface.get_rect(
|
||||
center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 3)
|
||||
)
|
||||
screen.blit(title_surface, title_rect)
|
||||
|
||||
# Dessiner le bouton "Jouer"
|
||||
pygame.draw.rect(screen, BLUE, button_rect)
|
||||
button_text = button_font.render("Jouer", True, WHITE)
|
||||
button_text_rect = button_text.get_rect(center=button_rect.center)
|
||||
screen.blit(button_text, button_text_rect)
|
||||
|
||||
# Gestion des événements du menu
|
||||
while True: # Demarrage de la boucle infinie
|
||||
if etat == 0:
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
pygame.quit()
|
||||
if event.type == pygame.QUIT: # Evt de sortie de boucle
|
||||
sys.exit()
|
||||
# Détection d'un clic sur le bouton "Jouer"
|
||||
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
|
||||
if button_rect.collidepoint(event.pos):
|
||||
menu_running = False
|
||||
elif event.type == pygame.MOUSEBUTTONUP and event.button == 1:
|
||||
if b1.zone_cliquable.collidepoint(event.pos):
|
||||
etat = 1
|
||||
elif b2.zone_cliquable.collidepoint(event.pos):
|
||||
etat = 2
|
||||
elif b3.zone_cliquable.collidepoint(event.pos):
|
||||
sys.exit()
|
||||
|
||||
pygame.display.flip()
|
||||
ecran.fill(constantes.BLANC)
|
||||
|
||||
if etat == 0:
|
||||
etat = affiche_menu(ecran)
|
||||
elif etat == 1:
|
||||
etat = j1.gereJeu(ecran)
|
||||
elif etat == 2:
|
||||
etat = hs1.gereHighScore(ecran)
|
||||
|
||||
# Fonction principale du jeu
|
||||
def game_loop():
|
||||
# Paramètres de la raquette
|
||||
PADDLE_WIDTH = 100
|
||||
PADDLE_HEIGHT = 15
|
||||
paddle_x = (SCREEN_WIDTH - PADDLE_WIDTH) / 2 # centré horizontalement
|
||||
paddle_y = SCREEN_HEIGHT - PADDLE_HEIGHT - 10 # position verticale en bas
|
||||
paddle_speed = 7
|
||||
|
||||
# Paramètres de la balle
|
||||
ball_radius = 10
|
||||
# Liste de balles (initialement une seule)
|
||||
balls = [
|
||||
{
|
||||
"x": SCREEN_WIDTH / 2,
|
||||
"y": SCREEN_HEIGHT / 2,
|
||||
"radius": ball_radius,
|
||||
"speed_x": 9 * random.choice([-1, 1]),
|
||||
"speed_y": -9,
|
||||
}
|
||||
]
|
||||
|
||||
# Paramètres des briques
|
||||
BRICK_ROWS = 5 # nombre de lignes de briques
|
||||
BRICK_COLUMNS = 10 # nombre de colonnes de briques
|
||||
BRICK_WIDTH = SCREEN_WIDTH // BRICK_COLUMNS
|
||||
BRICK_HEIGHT = 20
|
||||
brick_padding = 5
|
||||
|
||||
# Création de la grille de briques (liste de listes)
|
||||
bricks = []
|
||||
for row in range(BRICK_ROWS):
|
||||
brick_row = []
|
||||
for col in range(BRICK_COLUMNS):
|
||||
brick_x = col * BRICK_WIDTH + brick_padding
|
||||
brick_y = row * (BRICK_HEIGHT + brick_padding) + brick_padding
|
||||
brick_rect = pygame.Rect(
|
||||
brick_x, brick_y, BRICK_WIDTH - brick_padding * 2, BRICK_HEIGHT
|
||||
)
|
||||
brick_row.append(brick_rect)
|
||||
bricks.append(brick_row)
|
||||
|
||||
running = True
|
||||
while running:
|
||||
clock.tick(FPS)
|
||||
screen.fill(BLACK)
|
||||
|
||||
# Gestion des événements
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
running = False
|
||||
|
||||
# --- Déplacement automatique de la raquette ---
|
||||
# On cherche une balle qui descend (speed_y > 0), sinon on prend la première balle
|
||||
target_ball = None
|
||||
for ball in balls:
|
||||
if ball["speed_y"] > 0:
|
||||
target_ball = ball
|
||||
break
|
||||
if target_ball is None:
|
||||
target_ball = balls[0]
|
||||
# Calcul du centre de la raquette
|
||||
paddle_center = paddle_x + PADDLE_WIDTH / 2
|
||||
# Si le centre est trop à gauche ou à droite de la balle cible, on déplace la raquette
|
||||
if paddle_center < target_ball["x"] - 5:
|
||||
paddle_x += paddle_speed
|
||||
elif paddle_center > target_ball["x"] + 5:
|
||||
paddle_x -= paddle_speed
|
||||
|
||||
# Limiter la raquette à l'intérieur de l'écran
|
||||
paddle_x = max(0, min(paddle_x, SCREEN_WIDTH - PADDLE_WIDTH))
|
||||
# Création du rectangle de la raquette pour la collision
|
||||
paddle_rect = pygame.Rect(paddle_x, paddle_y, PADDLE_WIDTH, PADDLE_HEIGHT)
|
||||
|
||||
# Liste pour stocker les nouvelles balles créées lors des collisions avec la raquette
|
||||
nouvelles_balles = []
|
||||
|
||||
# Mise à jour de la position des balles
|
||||
for ball in balls:
|
||||
ball["x"] += ball["speed_x"]
|
||||
ball["y"] += ball["speed_y"]
|
||||
|
||||
# Collision avec les murs latéraux
|
||||
if (
|
||||
ball["x"] - ball["radius"] <= 0
|
||||
or ball["x"] + ball["radius"] >= SCREEN_WIDTH
|
||||
):
|
||||
ball["speed_x"] *= -1
|
||||
|
||||
# Collision avec le haut de l'écran
|
||||
if ball["y"] - ball["radius"] <= 0:
|
||||
ball["speed_y"] *= -1
|
||||
|
||||
# Création du rectangle de la balle pour la détection des collisions
|
||||
ball_rect = pygame.Rect(
|
||||
ball["x"] - ball["radius"],
|
||||
ball["y"] - ball["radius"],
|
||||
ball["radius"] * 2,
|
||||
ball["radius"] * 2,
|
||||
)
|
||||
|
||||
# Collision entre la balle et la raquette (uniquement si la balle descend)
|
||||
if ball_rect.colliderect(paddle_rect) and ball["speed_y"] > 0:
|
||||
ball["speed_y"] *= -1 # Inversion de la vitesse verticale
|
||||
offset = (ball["x"] - (paddle_x + PADDLE_WIDTH / 2)) / (
|
||||
PADDLE_WIDTH / 2
|
||||
)
|
||||
ball["speed_x"] = 4 * offset
|
||||
|
||||
# Création d'une nouvelle balle lors de la collision
|
||||
new_ball = ball.copy()
|
||||
new_ball["speed_x"] *= -1
|
||||
new_ball["speed_x"] += random.choice([-1, 1])
|
||||
nouvelles_balles.append(new_ball)
|
||||
|
||||
# Collision entre la balle et les briques
|
||||
hit_brick = None
|
||||
for row in bricks:
|
||||
for brick in row:
|
||||
if brick and ball_rect.colliderect(brick):
|
||||
hit_brick = brick
|
||||
ball["speed_y"] *= -1 # Inversion de la vitesse verticale
|
||||
break
|
||||
if hit_brick:
|
||||
row[row.index(hit_brick)] = None
|
||||
break
|
||||
|
||||
# Ajout des nouvelles balles générées
|
||||
balls.extend(nouvelles_balles)
|
||||
|
||||
# Gestion des collisions entre balles
|
||||
for i in range(len(balls)):
|
||||
for j in range(i + 1, len(balls)):
|
||||
dx = balls[i]["x"] - balls[j]["x"]
|
||||
dy = balls[i]["y"] - balls[j]["y"]
|
||||
distance = math.sqrt(dx * dx + dy * dy)
|
||||
if distance < balls[i]["radius"] + balls[j]["radius"]:
|
||||
# Échange des vitesses pour simuler une collision élastique
|
||||
balls[i]["speed_x"], balls[j]["speed_x"] = (
|
||||
balls[j]["speed_x"],
|
||||
balls[i]["speed_x"],
|
||||
)
|
||||
balls[i]["speed_y"], balls[j]["speed_y"] = (
|
||||
balls[j]["speed_y"],
|
||||
balls[i]["speed_y"],
|
||||
)
|
||||
# Ajustement des positions pour éviter la superposition
|
||||
overlap = balls[i]["radius"] + balls[j]["radius"] - distance
|
||||
if distance != 0:
|
||||
nx = dx / distance
|
||||
ny = dy / distance
|
||||
else:
|
||||
nx, ny = 1, 0
|
||||
balls[i]["x"] += nx * overlap / 2
|
||||
balls[i]["y"] += ny * overlap / 2
|
||||
balls[j]["x"] -= nx * overlap / 2
|
||||
balls[j]["y"] -= ny * overlap / 2
|
||||
|
||||
# Suppression des balles qui sortent par le bas de l'écran
|
||||
balls = [ball for ball in balls if ball["y"] - ball["radius"] <= SCREEN_HEIGHT]
|
||||
if not balls:
|
||||
print("Game Over!")
|
||||
running = False
|
||||
|
||||
# Dessiner la raquette
|
||||
pygame.draw.rect(screen, BLUE, paddle_rect)
|
||||
|
||||
# Dessiner les briques
|
||||
for row in bricks:
|
||||
for brick in row:
|
||||
if brick:
|
||||
pygame.draw.rect(screen, RED, brick)
|
||||
|
||||
# Dessiner les balles
|
||||
for ball in balls:
|
||||
pygame.draw.circle(
|
||||
screen, WHITE, (int(ball["x"]), int(ball["y"])), ball["radius"]
|
||||
)
|
||||
|
||||
pygame.display.flip()
|
||||
|
||||
pygame.quit()
|
||||
sys.exit()
|
||||
|
||||
|
||||
# Programme principal
|
||||
if __name__ == "__main__":
|
||||
show_menu() # Afficher le menu de démarrage
|
||||
game_loop() # Lancer le jeu
|
||||
pygame.display.update() # rafraichissement
|
||||
clock.tick(60)
|
||||
|
||||
33
casse-brique/murdebrique.py
Normal file
33
casse-brique/murdebrique.py
Normal file
@@ -0,0 +1,33 @@
|
||||
import brique
|
||||
from constantes import *
|
||||
|
||||
|
||||
class Murdebrique:
|
||||
"""
|
||||
definie un mur compose de briques 15 en largeur et 5 rangees
|
||||
Les briques ont une largeur de LARGEUR_ECRAN//15 et une hauteur de 20
|
||||
Il doit y avoir 50 px au dessus du mur.
|
||||
La rangée du haut contient des briques ayant 2 vies
|
||||
Attributs : mur de type liste
|
||||
Méthodes : collision(balle), affiche(ecran)
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.mur = []
|
||||
ligne = []
|
||||
for i in range(15):
|
||||
ligne.append(brique.Brique((LARGEUR_ECRAN // 15) * i, 50, 2))
|
||||
for i in range(4):
|
||||
for j in range(15):
|
||||
ligne.append(brique.Brique((LARGEUR_ECRAN // 15) * j, 70 + 20 * i, 1))
|
||||
self.mur.append(ligne)
|
||||
|
||||
def collision(self, balle):
|
||||
for i in range(len(self.mur)):
|
||||
for j in range(len(self.mur[i])):
|
||||
self.mur[i][j].collision(balle)
|
||||
|
||||
def affiche(self, ecran):
|
||||
for i in range(len(self.mur)):
|
||||
for j in range(len(self.mur[i])):
|
||||
self.mur[i][j].affiche(ecran)
|
||||
32
casse-brique/niveau.py
Normal file
32
casse-brique/niveau.py
Normal file
@@ -0,0 +1,32 @@
|
||||
import sys, pygame
|
||||
import balle, raquette, murdebrique
|
||||
from constantes import *
|
||||
|
||||
|
||||
class Niveau:
|
||||
"""gère le jeu d'un niveau"""
|
||||
|
||||
def __init__(self):
|
||||
self.b1 = balle.Balle()
|
||||
self.r1 = raquette.Raquette()
|
||||
self.m1 = murdebrique.Murdebrique()
|
||||
|
||||
def affiche(self, ecran):
|
||||
ecran.fill(BLANC)
|
||||
self.b1.affiche(ecran)
|
||||
self.r1.affiche(ecran)
|
||||
self.m1.affiche(ecran)
|
||||
|
||||
def gereNiveau(self, ecran):
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT: # Evt de sortie de boucle
|
||||
sys.exit()
|
||||
if pygame.key.get_pressed()[pygame.K_q] == True:
|
||||
self.r1.deplaceGauche()
|
||||
if pygame.key.get_pressed()[pygame.K_d] == True:
|
||||
self.r1.deplaceDroite()
|
||||
|
||||
self.b1.deplace(self.r1)
|
||||
self.m1.collision(self.b1)
|
||||
self.affiche(ecran)
|
||||
return 2
|
||||
59
casse-brique/raquette.py
Normal file
59
casse-brique/raquette.py
Normal file
@@ -0,0 +1,59 @@
|
||||
import pygame
|
||||
from constantes import *
|
||||
|
||||
|
||||
class Raquette:
|
||||
"""
|
||||
Definie une raquette qui se deplace horizontalement
|
||||
dans le bas de la fenetre ecran
|
||||
Attributs : largeur (int defaut 100), xpos (int defaut LARGEUR_ECRAN//2 - self.largeur//2), vit (int defaut 6)
|
||||
L'épaisseur de la raquette est de 10
|
||||
Methodes : deplaceGauche, deplaceDroite, affiche
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
self.largeur = 100
|
||||
self.xpos = LARGEUR_ECRAN // 2 - self.largeur // 2
|
||||
self.vit = 6
|
||||
|
||||
def deplaceGauche(self):
|
||||
"""
|
||||
Deplace la raquette de vit vers la gauche
|
||||
Parametres :
|
||||
self : Raquette
|
||||
Return :
|
||||
None
|
||||
Effet de bord :
|
||||
Modifie l'attribut xpos en lui enlevant,
|
||||
si c'est possible la valeur de vit (et met xpos à 0 sinon)
|
||||
"""
|
||||
if self.xpos - self.vit < 0:
|
||||
self.xpos = 0
|
||||
else:
|
||||
self.xpos = self.xpos - self.vit
|
||||
|
||||
def deplaceDroite(self):
|
||||
"""
|
||||
Deplace la raquette de vit vers la droite
|
||||
Parametres :
|
||||
self : Raquette
|
||||
Return :
|
||||
None
|
||||
Effet de bord :
|
||||
Modifie l'attribut xpos en lui ajoutant,
|
||||
si c'est possible la valeur de vit (et met xpos à
|
||||
LARGEUR_ECRAN-self.largeur sinon sinon)
|
||||
"""
|
||||
if self.xpos + self.largeur + self.vit > LARGEUR_ECRAN:
|
||||
self.xpos = LARGEUR_ECRAN - self.largeur
|
||||
else:
|
||||
self.xpos = self.xpos + self.vit
|
||||
|
||||
def affiche(self, ecran):
|
||||
pygame.draw.rect(
|
||||
ecran, (0, 0, 255), (int(self.xpos), HAUTEUR_ECRAN - 20, self.largeur, 10)
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pass
|
||||
37
question_du_jour/19-05-2025/main.py
Normal file
37
question_du_jour/19-05-2025/main.py
Normal file
@@ -0,0 +1,37 @@
|
||||
# Trouver la plus grande séquence de caractère commune entre de listes ou string
|
||||
from random import randint
|
||||
if __name__ =="__main__":
|
||||
l1 = [randint(0,100) for _ in range(100)]
|
||||
l2 = [randint(0,100) for _ in range(100)]
|
||||
adef lcs(a, b):
|
||||
"""
|
||||
Renvoie la plus longue sous-séquence commune entre séquences a et b.
|
||||
"""
|
||||
n, m = len(a), len(b)
|
||||
dp = [[0] * (m + 1) for _ in range(n + 1)]
|
||||
for i in range(n):
|
||||
for j in range(m):
|
||||
if a[i] == b[j]:
|
||||
dp[i + 1][j + 1] = dp[i][j] + 1
|
||||
else:
|
||||
dp[i + 1][j + 1] = max(dp[i][j + 1], dp[i + 1][j])
|
||||
i, j = n, m
|
||||
seq = []
|
||||
while i > 0 and j > 0:
|
||||
if a[i - 1] == b[j - 1]:
|
||||
seq.append(a[i - 1])
|
||||
i -= 1
|
||||
j -= 1
|
||||
elif dp[i - 1][j] >= dp[i][j - 1]:
|
||||
i -= 1
|
||||
else:
|
||||
j -= 1
|
||||
return seq[::-1]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
from random import randint
|
||||
l1 = [randint(0, 100) for _ in range(100)]
|
||||
l2 = [randint(0, 100) for _ in range(100)]
|
||||
commun = lcs(l1, l2)
|
||||
print(commun)
|
||||
@@ -2,12 +2,12 @@ if __name__ == "__main__":
|
||||
liste1 = [12,1,20,5,23,8,29,10]
|
||||
liste2 = [23,5,19,11,18,20,29,1,5,10,8]
|
||||
|
||||
def recherche_naive(l1, l2):
|
||||
if not l1 or not l2:
|
||||
return []
|
||||
if l1[0] == l2[0]:
|
||||
return [l1[0]] + recherche_naive(l1[1:], l2[1:])
|
||||
else:
|
||||
seq1 = recherche_naive(l1[1:], l2)
|
||||
seq2 = recherche_naive(l1, l2[1:])
|
||||
return seq1 if len(seq1) >= len(seq2) else seq2
|
||||
|
||||
def recherche(l1, l2):
|
||||
ln1 = len(l1)
|
||||
ln2 = len(l2)
|
||||
if ln1>ln2:
|
||||
for element in l2:
|
||||
t = True
|
||||
while t:
|
||||
b = l1[index(element)]
|
||||
Reference in New Issue
Block a user