Warning, /webapps/qmlonline/qml/examples/snake.qml is written in an unsupported language. File is not indexed.
0001 import QtQuick 2.7
0002 import QtQuick.Layouts 1
0003
0004 Rectangle {
0005 anchors.fill: parent
0006 color: "black"
0007
0008 // 4Hz engine
0009 Timer {
0010 running: true; repeat: true; interval: 1000/4
0011 onTriggered: snake.update()
0012 }
0013
0014 Item {
0015 id: snake
0016 z: -1
0017 property var initialBody: [Qt.point(2, 0), Qt.point(1, 0), Qt.point(0, 0)]
0018 property var body: initialBody
0019 property var direction: Qt.point(1, 0)
0020 property var command: "right"
0021
0022 function update(where) {
0023 if(!where) {
0024 where = command
0025 } else {
0026 command = where
0027 }
0028
0029 switch(where) {
0030 case "up": {
0031 // There is no reverse direction
0032 if (direction.y != 1) {
0033 direction.x = 0;
0034 direction.y = -1;
0035 }
0036 break
0037 }
0038 case "down": {
0039 if (direction.y != -1) {
0040 direction.x = 0;
0041 direction.y = 1;
0042 }
0043 break
0044 }
0045 case "right": {
0046 if (direction.x != -1) {
0047 direction.x = 1;
0048 direction.y = 0;
0049 }
0050 break
0051 }
0052 case "left": {
0053 if (direction.x != 1) {
0054 direction.x = -1;
0055 direction.y = 0;
0056 }
0057 break
0058 }
0059 }
0060 move()
0061 }
0062
0063 function checkCollision(array) {
0064 for(var i = 0; i < array.length; i++) {
0065 for(var u = i + 1; u < array.length; u++) {
0066 if(array[i].x == array[u].x && array[i].y == array[u].y) {
0067 return true
0068 }
0069 }
0070 }
0071
0072 return false
0073 }
0074
0075 function move() {
0076 var head = snake.body[0]
0077
0078 // Bend space to do jumps
0079 var newPoint = Qt.point(
0080 (head.x + direction.x) % grid.columns,
0081 (head.y + direction.y) % grid.rows
0082 )
0083 if(newPoint.x < 0) {
0084 newPoint.x += 10
0085 }
0086 if(newPoint.y < 0) {
0087 newPoint.y += 10
0088 }
0089
0090 // Check if snake is eating apple
0091 if(newPoint.x != grid.food.x || newPoint.y != grid.food.y) {
0092 snake.body.pop()
0093 } else {
0094 grid.newFood();
0095 }
0096 snake.body.unshift(newPoint)
0097
0098 // Check if we are hitting ourselfs
0099 if(checkCollision(snake.body)) {
0100 snake.body = [Qt.point(2, 0), Qt.point(1, 0), Qt.point(0, 0)]
0101 }
0102
0103 repeater.reload()
0104 }
0105
0106 }
0107
0108 GridLayout {
0109 id: grid
0110 rows: 15
0111 columns: 15
0112 columnSpacing: 0
0113 rowSpacing: 0
0114 anchors.fill: parent
0115
0116 readonly property int blockWidth: width / columns
0117 readonly property int blockHeight: height / rows
0118
0119 property var food: newFood()
0120 function newFood() {
0121 // 0.1 is to help the food to be inside grid
0122 food = Qt.point(Math.floor(Math.random() * (columns - 0.1)), Math.floor(Math.random() * (rows - 0.1)))
0123 return food
0124 }
0125
0126 Repeater {
0127 id: repeater
0128 model: parent.rows * parent.columns
0129
0130 Rectangle {
0131 property var snakeBody: snake.body
0132 property var value: {
0133 for(var local of snake.body) {
0134 if(index == local.x + local.y * grid.rows // Snake body
0135 || index == grid.food.x + grid.food.y * grid.rows) { // food
0136 return 1
0137 }
0138 }
0139 return 0
0140 }
0141 color: Qt.rgba(value, value, value)
0142
0143 Layout.fillWidth: true
0144 Layout.fillHeight: true
0145
0146 }
0147
0148 // Force model update
0149 function reload() {
0150 model = []
0151 model = parent.rows * parent.columns
0152
0153 }
0154 }
0155 }
0156
0157 // User input
0158 Item {
0159 z: 100000
0160 focus: true
0161 anchors.fill: parent
0162
0163 Keys.onPressed: {
0164 switch(event.key) {
0165 case Qt.Key_Up: {
0166 snake.command = "up"
0167 break;
0168 }
0169 case Qt.Key_Down: {
0170 snake.command = "down"
0171 break;
0172 }
0173 case Qt.Key_Left: {
0174 snake.command = "left"
0175 break;
0176 }
0177 case Qt.Key_Right: {
0178 snake.command = "right"
0179 break;
0180 }
0181 }
0182 }
0183 }
0184 }