Advertisement
czaffik

Snake

Oct 12th, 2019 (edited)
3,337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
QML 5.35 KB | None | 0 0
  1. // main.qml:
  2. import QtQuick 2.9
  3. import QtQuick.Window 2.2
  4. import "logic.js" as Logic
  5.  
  6. Window {
  7.     property bool stop: true
  8.     property bool first: true
  9.     property bool loose: false
  10.  
  11.     property string text: "Press Space"
  12.     property int score: 0
  13.     property int w: 400
  14.     property int h: 400
  15.     property int interval: 100
  16.  
  17.     id: mainWindow
  18.     visible: true
  19.     width: w
  20.     height: h
  21.     color: "transparent"
  22.     minimumWidth: w
  23.     maximumWidth: w
  24.     minimumHeight: h
  25.     maximumHeight: h
  26.     title: qsTr("Snake")
  27.  
  28.     Text {
  29.         text: mainWindow.text
  30.         font.family: "Helvetica"
  31.         font.pointSize: 24
  32.         color: "red"
  33.         x: mainWindow.w/2 - width/2
  34.         y: mainWindow.h/2 - height/2 - 16
  35.     }
  36.  
  37.     Text {
  38.         text: "punkty " + mainWindow.score
  39.         color: "red"
  40.     }
  41.  
  42.     Item {
  43.         focus: true
  44.         Keys.onPressed: {
  45.             if      (event.key === Qt.Key_Up)    Logic.turnUp()
  46.             else if (event.key === Qt.Key_Down)  Logic.turnDown()
  47.             else if (event.key === Qt.Key_Left)  Logic.turnLeft()
  48.             else if (event.key === Qt.Key_Right) Logic.turnRight()
  49.             else if (event.key === Qt.Key_Space) {
  50.                 if (first) {
  51.                     first = false
  52.                     stop = false
  53.                     text = ""
  54.                 }
  55.                 else if (loose) {
  56.                     text = ""
  57.                     loose = false
  58.                     stop = false
  59.                     Logic.clear()
  60.                     mainWindow.interval = 100
  61.                 }
  62.             }
  63.         }
  64.     }
  65.  
  66.     Timer {
  67.         id: timer
  68.         interval: mainWindow.interval
  69.         running: true
  70.         repeat: true
  71.         onTriggered: {
  72.             if (!mainWindow.stop) {
  73.                 if (!Logic.update()) {
  74.                     mainWindow.loose = true
  75.                     mainWindow.stop = true
  76.                     mainWindow.text = "Game Over!"
  77.                 }
  78.                 else {
  79.                     score = Logic.score
  80.                     if (score > 10) mainWindow.interval = 90
  81.                     else if (score > 40) mainWindow.interval = 80
  82.                     else if (score > 80) mainWindow.interval = 70
  83.                     else if (score > 120) mainWindow.interval = 60
  84.                 }
  85.             }
  86.         }
  87.     }
  88.  
  89.     Component.onCompleted: {
  90.         Logic.start()
  91.     }
  92. }
  93.  
  94. // Segment.qml:
  95. import QtQuick 2.0
  96.  
  97. Rectangle {
  98.     id: root
  99.     width: 20
  100.     height: 20
  101.  
  102.     x: 0
  103.     y: 0
  104.  
  105.     border.width: 2
  106.     border.color: "#111111"
  107.     //color: "#ff1111"
  108.     color: "#172208"
  109.  
  110.     function ded() {
  111.         root.destroy()
  112.     }
  113. }
  114.  
  115. // logic.js:
  116. .import QtQuick 2.0 as Quick
  117.  
  118. var snake = new Array
  119. var food = null
  120. var component = Qt.createComponent("Segment.qml")
  121.  
  122. var vx = 0
  123. var vy = -1
  124.  
  125. var score = 0
  126.  
  127. function start() {
  128.     snake.push(createSegment(mainWindow.width/2, mainWindow.height/2, "#ff1111"))
  129.     createFood()
  130. }
  131.  
  132. function createSegment(x, y, color) {
  133.     var dynamicObject = component.createObject(mainWindow)
  134.     if (dynamicObject === null) {
  135.         console.log(component.errorString())
  136.         return false
  137.     }
  138.  
  139.     dynamicObject.x = x
  140.     dynamicObject.y = y
  141.     dynamicObject.color = color
  142.     //dynamicObject.opacity = 1
  143.     return dynamicObject
  144. }
  145.  
  146. function forward() {
  147.     for (var i = snake.length-1; i > 0; i--) {
  148.         snake[i].x = snake[i-1].x
  149.         snake[i].y = snake[i-1].y
  150.     }
  151.  
  152.     snake[0].x += 20*vx
  153.     snake[0].y += 20*vy
  154. }
  155.  
  156. function eat() {
  157.     food.color = "#ff1111"
  158.     food.x = snake[snake.length-1].x
  159.     food.y = snake[snake.length-1].y
  160.     snake.push(food)
  161. }
  162.  
  163.  
  164. function turnUp() {
  165.     if (vy === 1 && snake.length > 1) return
  166.     else {
  167.         vx = 0
  168.         vy = -1
  169.     }
  170. }
  171.  
  172. function turnDown() {
  173.     if (vy === -1 && snake.length > 1) return
  174.     else {
  175.         vx = 0
  176.         vy = 1
  177.     }
  178. }
  179.  
  180. function turnRight() {
  181.     if (vx === -1 && snake.length > 1) return
  182.     else {
  183.         vx = 1
  184.         vy = 0
  185.     }
  186. }
  187.  
  188. function turnLeft() {
  189.     if (vx === 1 && snake.length > 1) return
  190.     else {
  191.         vx = -1
  192.         vy = 0
  193.     }
  194. }
  195.  
  196. function createFood() {
  197.     var repeat = true
  198.     var x
  199.     var y
  200.  
  201.     while (repeat) {
  202.         repeat = false
  203.         x = parseInt(Math.random()*mainWindow.w/20)*20
  204.         y = parseInt(Math.random()*mainWindow.h/20)*20
  205.         for (var i = 0; i < snake.length; i++) {
  206.             if (x === snake[i].x && y === snake[i].y) repeat = true
  207.         }
  208.     }
  209.  
  210.     food = createSegment(x, y, "#11ff11")
  211. }
  212.  
  213. function update() {
  214.     forward()
  215.     if (collision()) return false
  216.     if (food.x === snake[0].x && food.y === snake[0].y) {
  217.         eat()
  218.         score++
  219.         createFood()
  220.     }
  221.  
  222.     return true
  223. }
  224.  
  225. function collision() {
  226.     for (var i = 1; i < snake.length; i++) {
  227.         if (snake[0].x === snake[i].x && snake[0].y === snake[i].y) return true
  228.     }
  229.  
  230.     if (snake[0].x < 0 || snake[0].x > mainWindow.w - 20 || snake[0].y < 0 || snake[0].y > mainWindow.h - 20) {
  231.         return true
  232.     }
  233.  
  234.     return false
  235. }
  236.  
  237. function clear() {
  238.     for (var i = snake.length-1; i > 0; i--) {
  239.         snake[i].ded()
  240.         snake.pop()
  241.     }
  242.     snake[0].x = mainWindow.width/2
  243.     snake[0].y = mainWindow.height/2
  244.     vx = 0
  245.     vy = -1
  246.     score = 0
  247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement