mirror of
https://github.com/Fare-spec/cours.git
synced 2025-12-07 10:50:36 +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, pygame
|
||||||
import sys
|
import bouton
|
||||||
import random
|
import constantes
|
||||||
import math
|
import pygame.freetype
|
||||||
|
import jeu, highscore
|
||||||
|
|
||||||
# Initialisation de Pygame
|
|
||||||
pygame.init()
|
|
||||||
|
|
||||||
# Définition des dimensions de la fenêtre
|
def affiche_menu(ecran):
|
||||||
SCREEN_WIDTH = 1080
|
b1.affiche(ecran)
|
||||||
SCREEN_HEIGHT = 720
|
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
|
pygame.init() # initialisation des modules de pygame
|
||||||
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
|
|
||||||
pygame.display.set_caption("Casse-Brique Auto-Play")
|
# 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()
|
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
|
while True: # Demarrage de la boucle infinie
|
||||||
def show_menu():
|
if etat == 0:
|
||||||
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
|
|
||||||
for event in pygame.event.get():
|
for event in pygame.event.get():
|
||||||
if event.type == pygame.QUIT:
|
if event.type == pygame.QUIT: # Evt de sortie de boucle
|
||||||
pygame.quit()
|
|
||||||
sys.exit()
|
sys.exit()
|
||||||
# Détection d'un clic sur le bouton "Jouer"
|
elif event.type == pygame.MOUSEBUTTONUP and event.button == 1:
|
||||||
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
|
if b1.zone_cliquable.collidepoint(event.pos):
|
||||||
if button_rect.collidepoint(event.pos):
|
etat = 1
|
||||||
menu_running = False
|
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
|
pygame.display.update() # rafraichissement
|
||||||
def game_loop():
|
clock.tick(60)
|
||||||
# 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
|
|
||||||
|
|||||||
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]
|
liste1 = [12,1,20,5,23,8,29,10]
|
||||||
liste2 = [23,5,19,11,18,20,29,1,5,10,8]
|
liste2 = [23,5,19,11,18,20,29,1,5,10,8]
|
||||||
|
|
||||||
def recherche_naive(l1, l2):
|
|
||||||
if not l1 or not l2:
|
def recherche(l1, l2):
|
||||||
return []
|
ln1 = len(l1)
|
||||||
if l1[0] == l2[0]:
|
ln2 = len(l2)
|
||||||
return [l1[0]] + recherche_naive(l1[1:], l2[1:])
|
if ln1>ln2:
|
||||||
else:
|
for element in l2:
|
||||||
seq1 = recherche_naive(l1[1:], l2)
|
t = True
|
||||||
seq2 = recherche_naive(l1, l2[1:])
|
while t:
|
||||||
return seq1 if len(seq1) >= len(seq2) else seq2
|
b = l1[index(element)]
|
||||||
Reference in New Issue
Block a user