# Project : 2048 Game load "stdlib.ring" load "guilib.ring" C_GAMETITLE = '2048 Game' C_WINDOWBACKGROUND = "background-color: gray;" if isMobile() C_LABELFONTSIZE = "font-size:120px;" C_BUTTONFONTSIZE = "font-size:160px;" else C_LABELFONTSIZE = "font-size:50px;" C_BUTTONFONTSIZE = "font-size:80px;" ok C_PLAYERSCORESTYLE = "color:white;background-color:rgb(50,50,50);border-radius:17px;" + C_LABELFONTSIZE C_NEWGAMESTYLE = 'color:white;background-color:rgb(50,50,50);border-radius:17px;' + C_LABELFONTSIZE C_EMPTYBUTTONSTYLE = 'border-radius:17px;background-color:silver;' + C_BUTTONFONTSIZE C_BUTTON2STYLE = 'border-radius:17px;color:black; background-color: yellow ;' + C_BUTTONFONTSIZE C_BUTTON4STYLE = 'border-radius:17px;color:black; background-color: violet ;' + C_BUTTONFONTSIZE C_BUTTON8STYLE = 'border-radius:17px;color:white; background-color: purple ;' + C_BUTTONFONTSIZE C_BUTTON16STYLE = 'border-radius:17px;color:white; background-color: blue ;' + C_BUTTONFONTSIZE C_BUTTON32STYLE = 'border-radius:17px;color:white; background-color: red ;' + C_BUTTONFONTSIZE C_BUTTON64STYLE = 'border-radius:17px;color:black; background-color: lightgray ;' + C_BUTTONFONTSIZE C_BUTTON128STYLE = 'border-radius:17px;color:black; background-color: white ;' + C_BUTTONFONTSIZE C_BUTTON256STYLE = 'border-radius:17px;color:white; background-color: black ;' + C_BUTTONFONTSIZE C_BUTTON512STYLE = 'border-radius:17px;color:white; background-color: Purple ;' + C_BUTTONFONTSIZE C_BUTTON1024STYLE = 'border-radius:17px;color:black; background-color: Yellow ;' + C_BUTTONFONTSIZE C_BUTTON2048STYLE = 'border-radius:17px;color:white; background-color: Green ;' + C_BUTTONFONTSIZE C_LAYOUTSPACING = 10 C_PLAYERSCORE = 'Player Score : ' size = 4 limit = 2 num = 0 flag = 0 x1 = 0 x2 = 0 y1 = 0 y2 = 0 nScore = 0 button = newlist(size,size) buttonsave = newlist(size,size) LayoutButtonRow = list(size+2) moveleft = [] moveright = [] moveup = [] movedown = [] myfilter2 = null myfilter3 = null winheight = 0 winwidth = 0 app = new qApp { StyleFusion() processevents() win = new qWidget() { setWindowTitle(C_GAMETITLE) setgeometry(100,100,600,700) setminimumwidth(300) setminimumheight(300) if not isMobile() grabkeyboard() ok setstylesheet(C_WINDOWBACKGROUND) move(490,100) for n = 1 to size for m = 1 to size button[n][m] = new MyButton(win) next next newgame = new qLabel(win) playerscore = new qLabel(win) myfilter3 = new qAllEvents(win) { setMouseButtonPressEvent("pPress()") setMouseButtonReleaseEvent("pRelease()")} installeventfilter(myfilter3) myfilter2 = new qAllEvents(win) { setkeypressevent("keypress()") } installeventfilter(myfilter2) winwidth = win.width() winheight = win.height() for n = 1 to size + 2 LayoutButtonRow[n] = new QHBoxLayout() { setSpacing(C_LAYOUTSPACING) } next for n = 1 to size for m = 1 to size button[n][m] { temp = text() } buttonsave[n][m] = temp button[n][m] = new MyButton(win) { setalignment(Qt_AlignHCenter | Qt_AlignVCenter) setstylesheet(C_EMPTYBUTTONSTYLE) show() } next next for n = 1 to size for m = 1 to size LayoutButtonRow[n].AddWidget(button[m][n]) win.show() temp = buttonsave[n][m] button[n][m].settext(temp) next LayoutButtonRow[n].setSpacing(C_LAYOUTSPACING) next playerscore { setGeometry(0,4*floor(winheight/6),winwidth,floor(winheight/6)) setalignment(Qt_AlignHCenter | Qt_AlignVCenter) settext(C_PLAYERSCORE + nScore) setStylesheet(C_PLAYERSCORESTYLE) show() } newgame { setGeometry(0,5*floor(winheight/6),winwidth,floor(winheight/6)) setalignment(Qt_AlignHCenter | Qt_AlignVCenter) setstylesheet(C_NEWGAMESTYLE) settext('New Game') myfilter4 = new qallevents(newgame) myfilter4.setMouseButtonPressEvent("pbegin()") installeventfilter(myfilter4) show() } LayoutButtonRow[size+1].AddWidget(playerscore) LayoutButtonRow[size+2].AddWidget(newgame) LayoutButtonMain = new QVBoxLayout() { setSpacing(C_LAYOUTSPACING) for n = 1 to size+2 AddLayout(LayoutButtonRow[n]) win.show() next } win.setLayout(LayoutButtonMain) win.show() pbegin() show() } exec() } func pPress() x1 = myfilter3.getglobalx() y1 = myfilter3.getglobaly() func pRelease() x2 = myfilter3.getglobalx() y2 = myfilter3.getglobaly() difx = x2 - x1 dify = y2 - y1 if fabs(difx) > fabs(dify) if difx < 0 pleft() else pRight() ok else if dify < 0 pUp() else pDown() ok ok func keypress() nKey = myfilter2.getkeycode() switch nKey on 16777234 pleft() on 16777236 pright() on 16777235 pup() on 16777237 pdown() off func pbegin() numbers = [['2','2'],['2','4']] randnew = newlist(2,2) for n = 1 to size for m = 1 to size button[n][m].setStylesheet(C_EMPTYBUTTONSTYLE) button[n][m].settext('') next next while true rn1 = random(size - 1) + 1 rm1 = random(size - 1) + 1 rn2 = random(size - 1) + 1 rm2 = random(size - 1) + 1 bool = (rn1 = rn2) and (rm1 = rm2) if not bool exit ok end rand = random(limit - 1) + 1 button[rn1][rm1].settext(numbers[rand][1]) button[rn2][rm2].settext(numbers[rand][2]) nScore = 0 playerscore.settext(C_PLAYERSCORE) func pMoveInDirection cFunc num = gameover() if num = size*size flag = 1 msgBox('You lost!') pbegin() ok if flag = 0 call cFunc() sleep(0.5) newnum() ok func pdown() pMoveInDirection(:pMoveDown) func pup() pMoveInDirection(:pMoveUp) func pleft() pMoveInDirection(:pMoveLeft) func pright() pMoveInDirection(:pMoveRight) func pmoveleft() for n = 1 to size moveleft = [] for m = 1 to size button[m][n] {temp = text()} if temp != '' add(moveleft,temp) ok next movetilesleft(n,moveleft) next func pmoveright() for n = 1 to size moveright = [] for m = size to 1 step -1 button[m][n] {temp = text()} if temp != '' add(moveright,temp) ok next movetilesright(n,moveright) next return func pmoveup() for n = 1 to size moveup = [] for m = 1 to size button[n][m] {temp = text()} if temp != '' add(moveup,temp) ok next movetilesup(n,moveup) next return func pmovedown() for n = 1 to size movedown = [] for m = size to 1 step -1 button[n][m] {temp = text()} if temp != '' add(movedown,temp) ok next movetilesdown(n,movedown) next return func movetilesleft(nr,moveleft) for p = 1 to len(moveleft) - 1 temp1 = moveleft[p] temp2 = moveleft[p+1] temp = string(number(temp1) + number(temp2)) if (temp1 = temp2) and (temp1 != '0') and (temp2 != '0') and (temp1 != '') and (temp2 != '') if temp != '0' and temp != '' nScore = nScore + temp playerscore.settext(C_PLAYERSCORE + nScore) flag = 1 moveleft[p] = temp del(moveleft,p+1) ok ok next for n = 1 to len(moveleft) button[n][nr].settext(moveleft[n]) next for n = len(moveleft) + 1 to size if n <= size button[n][nr].setStylesheet(C_EMPTYBUTTONSTYLE) button[n][nr].settext('') ok next return func movetilesright(nr,moveright) flag = 0 for p = 2 to len(moveright) temp1 = moveright[p] temp2 = moveright[p-1] if (temp1 = temp2) and (temp1 != '0') and (temp2 != '0') and (temp1 != '') and (temp2 != '') temp = string(number(temp1) + number(temp2)) if temp != '0' and temp != '' nScore = nScore + temp playerscore.settext(C_PLAYERSCORE + nScore) flag = 1 moveright[p] = temp del(moveright,p-1) ok ok next for n = 1 to len(moveright) button[size-n+1][nr].settext(moveright[n]) next for n = 1 to size - len(moveright) if n <= size button[n][nr].setStylesheet(C_EMPTYBUTTONSTYLE) button[n][nr].settext('') ok next func movetilesup(nr,moveup) flag = 0 for p = 1 to len(moveup) - 1 temp1 = moveup[p] temp2 = moveup[p+1] if (temp1 = temp2) and (temp1 != '0') and (temp2 != '0') and (temp1 != '') and (temp2 != '') temp = string(number(temp1) + number(temp2)) if temp != '0' and temp != '' nScore = nScore + temp playerscore.settext(C_PLAYERSCORE + nScore) flag = 1 moveup[p] = temp del(moveup,p+1) ok ok next for n = 1 to len(moveup) button[nr][n].settext(moveup[n]) next for n = len(moveup) + 1 to size if n <= size button[nr][n].setStylesheet(C_EMPTYBUTTONSTYLE) button[nr][n].settext('') ok next func movetilesdown(nr,movedown) flag = 0 for p = 1 to len(movedown) - 1 temp1 = movedown[p] temp2 = movedown[p+1] if (temp1 = temp2) and (temp1 != '0') and (temp2 != '0') and (temp1 != '') and (temp2 != '') temp = string(number(temp1) + number(temp2)) if temp != '0' and temp != '' nScore = nScore + temp playerscore.settext(C_PLAYERSCORE + nScore) flag = 1 movedown[p] = temp del(movedown,p+1) ok ok next for n = 1 to len(movedown) button[nr][size-n+1].settext(movedown[n]) next for n = size - len(movedown) to 1 step -1 if n <= size button[nr][n].setStylesheet(C_EMPTYBUTTONSTYLE) app.processevents() button[nr][n].settext('') ok next func newnum() while true rn = random(size - 1) + 1 rm = random(size - 1) + 1 if button[rn][rm].text() = '' button[rn][rm].settext('2') exit ok end return func gameover() num = 0 flag = 0 for n = 1 to size for m = 1 to size if button[n][m].text() != '' num = num + 1 ok next next return num func msgBox(text) { m = new qMessageBox(win) { setWindowTitle('2048 Game') setText(text) show() } } func showarray(vect) see "[" svect = "" for n = 1 to len(vect) svect = svect + vect[n] + " " next svect = left(svect, len(svect) - 1) see svect see "]" + nl class MyButton from qLabel func setText(cValue) Super.setText(cValue) switch cValue on '2' setStyleSheet(C_BUTTON2STYLE) on '4' setStylesheet(C_BUTTON4STYLE) on '8' setStylesheet(C_BUTTON8STYLE) on '16' setStylesheet(C_BUTTON16STYLE) on '32' setStylesheet(C_BUTTON32STYLE) on '64' setStylesheet(C_BUTTON64STYLE) on '128' setStylesheet(C_BUTTON128STYLE) on '256' setStylesheet(C_BUTTON256STYLE) on '512' setStylesheet(C_BUTTON512STYLE) on '1024' setStylesheet(C_BUTTON1024STYLE) on '2048' setStylesheet(C_BUTTON2048STYLE) off