2048游戏最多能玩到多大的数字?最多能玩多少分?
2048大家都玩過(guò),也有很多人考慮過(guò),最高到底能玩到多大的數(shù)字。
也有的人會(huì)問(wèn),最高能玩到多大的分?jǐn)?shù),但是這個(gè)明顯要復(fù)雜很多。
有個(gè)在線的2048做的還不錯(cuò),手機(jī)電腦都可以玩,
而且只要打開(kāi),后面就再也不需要網(wǎng)絡(luò)了,火車上面玩很方便
鏈接:http://2048game.com/
我的成績(jī):
這個(gè)游戲我還錄了一個(gè)視頻,8分鐘完成2048
我的手機(jī)里面還安裝了一個(gè)可以悔一步的版本的2048
可以悔一步的版本,比不能悔的版本要簡(jiǎn)單很多。
比如說(shuō),當(dāng)只有一個(gè)空格的時(shí)候,很多時(shí)候,出現(xiàn)2就會(huì)game over,出現(xiàn)4就可以繼續(xù)玩。
這樣,利用悔一步的功能,可以不斷嘗試,直到出現(xiàn)4再繼續(xù)玩。
當(dāng)然,有的版本是game over之后就不能悔一步了
那就比這個(gè)版本稍微難一些,但是還是比不能悔的版本要簡(jiǎn)單一些。
我的成績(jī):
下面討論2048問(wèn)題的簡(jiǎn)化版
簡(jiǎn)化一:假設(shè)系統(tǒng)只會(huì)給出2,不會(huì)給出4
簡(jiǎn)化二:假設(shè)16個(gè)格子沒(méi)有位置的限制,任何2個(gè)格子只要數(shù)相等就可以合并。
重定義操作:每次操作,可以同時(shí)合并若干對(duì)數(shù),比如將2,2,4,4,8合并成4,8,8,
如果沒(méi)有可以合并的數(shù),就不合并,算一次不做任何改變的操作。
每次操作都會(huì)產(chǎn)生1個(gè)新的2
問(wèn)題:這樣的游戲最多可以玩出多大的數(shù)字?
首先列出2的冪,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072
131072=2^17
下面我將證明,永遠(yuǎn)不可能玩到131072
定義一個(gè)全局狀態(tài):所有格子的數(shù)的和S
很明顯,剛開(kāi)始的時(shí)候S是4,每合并1次,S的值就會(huì)加2
假設(shè)某個(gè)時(shí)候出現(xiàn)了131072,那么S至少為131072
那么一定有某個(gè)時(shí)候,S=131070,表示成二進(jìn)制是1111 1111 1111 1111 0
這個(gè)數(shù),要想表示成2的冪的和,至少需要16個(gè)數(shù)即從2到65536這16個(gè)數(shù)。
而這個(gè)時(shí)候,沒(méi)有多余的空格了,所以說(shuō),不可能玩到131072。
而且,65536是可以達(dá)到的。
下面討論真正的2048,到底能玩到多大的數(shù)字。
按照上面的論述可以推出,如果2048永遠(yuǎn)只出2的話,是不可能玩到131072的。
但是真正的2048,是有可能出現(xiàn)4的,所以說(shuō),2048永遠(yuǎn)不可能玩到262144,但是有沒(méi)有可能玩到131072很難用理論說(shuō)明。
為了研究131072到底能不能達(dá)到,我意識(shí)到只能悔一步的版本無(wú)法滿足我的要求,于是我開(kāi)始玩第三種版本——無(wú)限悔棋版(下面是我的成績(jī))
APK下載:點(diǎn)擊打開(kāi)鏈接
其實(shí),可以悔一步的版本和可以悔任意多步的版本,在理論上是效果一樣的。
當(dāng)我們考慮2048最多可以玩到多大的數(shù)字的時(shí)候,是這么想的:
每次出現(xiàn)的是2還是4是隨機(jī)的,出現(xiàn)的位置也是隨機(jī)的。
我們只需要考慮在所有情況中,對(duì)我們最有利的那一種即可。
也就是說(shuō),可以這樣考慮,每次出現(xiàn)的是2還是4是由我們來(lái)定,每次出現(xiàn)的位置也由我們來(lái)定,這樣的情況下最多可以玩到多大的數(shù)字。
不難發(fā)現(xiàn),無(wú)論是可以悔一步的版本的2048,還是可以悔任意多步的,都和這個(gè)模型的等價(jià)的。
這個(gè)圖說(shuō)明131072是可以玩到的,也讓人很容易相信,131072便是能玩出的最大數(shù)字了,要證明也簡(jiǎn)單,就像我上面證明的那樣。
下面討論最多能玩多少分。
雖然我已經(jīng)玩到了終點(diǎn),已經(jīng)無(wú)法再玩了,但是分?jǐn)?shù)卻不是最高的。
2048的計(jì)分規(guī)則是,玩家通過(guò)合并得到1個(gè)數(shù)N,這個(gè)數(shù)就計(jì)分N
比如說(shuō),2個(gè)2合并得到4,就加4分,2個(gè)1024合并得到2048,就加2048分
所以要計(jì)算最高分需要注意一個(gè)問(wèn)題,同樣是4,如果是玩家合并2個(gè)2得到的,那就是4分,但是如果是自動(dòng)給出的4,那是沒(méi)有分的,也就是說(shuō),單看這16個(gè)格子里面有哪些數(shù)是無(wú)法判斷準(zhǔn)確的得分的。
不過(guò),最高分對(duì)應(yīng)的局面只有2種情況,最小的格子可能是2也可能是4,另外15個(gè)格子就一定是8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072無(wú)疑了。
為了計(jì)算最高分,可以再次假設(shè)每次給出的數(shù)都是2,如果還能這樣玩出上述的局面的話,那就一定能得到最高分。
具體計(jì)算方法是,2沒(méi)分,4對(duì)應(yīng)4分,8對(duì)應(yīng)16分,16對(duì)應(yīng)48分,32對(duì)應(yīng)128分,64對(duì)應(yīng)320分,128對(duì)應(yīng)768分,256對(duì)應(yīng)1792分,512對(duì)應(yīng)4096分,1024對(duì)應(yīng)9216分,2048對(duì)應(yīng)20480分,4096對(duì)應(yīng)45056分,8192對(duì)應(yīng)98304分,16384對(duì)應(yīng)212992分,32768對(duì)應(yīng)458752分,65536對(duì)應(yīng)983040分,131072對(duì)應(yīng)2097152分
所以從8到131072這15個(gè)格子的總分是3932160分,但是這個(gè)分?jǐn)?shù)是不可達(dá)到的,因?yàn)槿绻看味汲?的話,是不可能玩出131072的,也就是
在玩出131072之前至少出1個(gè)4,
同理在玩出131072之后,在玩出65536之前至少出1個(gè)4,
在玩出131072和65536之后,在玩出32768之前至少出一個(gè)4
。。。。。。
在玩出131072,65536,32768…128,64,32,16之后,在玩出8之前至少出1個(gè)4,
所以2048的理論最高分是3932160-15*4=3932100分
這個(gè)應(yīng)該是可達(dá)到的,但是很難在理論上證明。
下面我將編程+構(gòu)造證明,3932100分是可以達(dá)到的,這樣便證明了2048的最高分是3932100分。
我的證明工作分為3步:
一,構(gòu)造數(shù)據(jù)
構(gòu)造出1個(gè)多行數(shù)據(jù),每一行對(duì)應(yīng)2048的一個(gè)狀態(tài),第一行是初始狀態(tài)(只有2個(gè)2),最后一行是最終狀態(tài)(16個(gè)數(shù)分別是4,8,16…131072)
二,驗(yàn)證數(shù)據(jù)正確性
編寫(xiě)一個(gè)程序驗(yàn)證每一行到下一行的轉(zhuǎn)化都是對(duì)的,符合2048的規(guī)則
三,計(jì)算得分
其實(shí)只要驗(yàn)證一共只出現(xiàn)過(guò)16個(gè)4,那么得分就是最高分3932100
一,構(gòu)造數(shù)據(jù)
要想構(gòu)造數(shù)據(jù),首先需要自己編寫(xiě)一個(gè)2048的程序,只需要1個(gè)控制臺(tái)的程序即可
0,需要的主要功能如下:
(1)對(duì)記事本進(jìn)行讀寫(xiě),把每一個(gè)狀態(tài)和操作寫(xiě)到記事本的一行,下一次玩的時(shí)候讀取記事本即可接著玩
(2)顯示游戲界面,讀取鍵盤的上下左右鍵,如果操作合法的話,進(jìn)行相應(yīng)的操作
(3)每次操作之后,要給出1個(gè)數(shù),包含3個(gè)數(shù):行i,列j,在i行j列出2還是4
1,規(guī)定數(shù)據(jù)結(jié)構(gòu)
每一行放20個(gè)數(shù),對(duì)應(yīng)int s[21];的后面20個(gè)數(shù),第0個(gè)數(shù)廢棄不用
第1-16分別對(duì)應(yīng)游戲界面中的16個(gè)數(shù),0代表空格
例如,當(dāng)s[1]到s[16]分別為2 0 0 0 2 0 0 0 16 0 0 0 16 2 0 0時(shí),對(duì)應(yīng)的狀態(tài)就是
s[17]對(duì)應(yīng)玩家操作,也就是上下左右,-4是上,4是下,-1是左,1是右
具體說(shuō)來(lái),s[17]代表的是玩家從上一行對(duì)應(yīng)的狀態(tài)變成本行對(duì)應(yīng)的狀態(tài)所進(jìn)行的操作
s[18]是行,范圍是0-3,s[19]是列,范圍是0-3,s[20]是新出的數(shù)。
也就是說(shuō),自上一行前面16個(gè)數(shù)對(duì)應(yīng)的狀態(tài)開(kāi)始,玩家進(jìn)行了s[17]對(duì)應(yīng)的操作,然后系統(tǒng)在s[18]、s[19]對(duì)應(yīng)的位置新出了一個(gè)數(shù)s[20],然后狀態(tài)就變成了本行前面16個(gè)數(shù)對(duì)應(yīng)的狀態(tài)。
以我玩的結(jié)果舉例,前2行是
0 0 0 0 0 0 0 0 2 0 0 0 2 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 4 0 0 2
(第一行的后面4個(gè)數(shù)沒(méi)有意義)
也就是說(shuō)初始狀態(tài)是
第二行后面的4 0 0 2表示,我進(jìn)行了4對(duì)應(yīng)的下操作,即往下滑,然后系統(tǒng)自動(dòng)在第0行第0列新出1個(gè)2
那么此時(shí)新的狀態(tài)就是
也就是對(duì)應(yīng)第二行前面的16個(gè)數(shù)。
2,判斷新出的數(shù)的位置和大小
首先大小,是2還是4,其實(shí)很容易確定,
整個(gè)游戲中出現(xiàn)的最后一個(gè)數(shù),無(wú)論是2還是4都不重要,都無(wú)法得分,在此之前有15次是必須要出4,其他的時(shí)候都必須要出2,這樣才能達(dá)到最高分。
這15個(gè)狀態(tài)和其他所有的狀態(tài)很容易區(qū)分出來(lái),即如果有1個(gè)空格和15個(gè)不同的數(shù),而且其中沒(méi)有2,那么此時(shí)就必須出4
代碼:
int newNum(int *p)
{
int s = 0, k, num0 = 0;
for (int i = 1; i <= 16; i++)
{
k = *(p + i);
if ((s^k) < s)return 2;//非0數(shù)不重復(fù),否則出2
if ((s^k) == s)num0++;//統(tǒng)計(jì)空格數(shù)量
if (s % 4)return 2;//沒(méi)有2,否則出2
s ^= k;
}
if (num0 == 1)return 4;
return 2;
}
然后是位置
需要申明的是,這個(gè)程序并不是一般的2048游戲,但是也符合2048的規(guī)則,
這個(gè)程序的唯一作用就是用來(lái)構(gòu)造數(shù)據(jù)。
所以,這個(gè)程序不需要隨機(jī)算法來(lái)決定在哪個(gè)格子出新數(shù)。
只需要按照s[1],s[2],s[3]…s[16]的順序依次查看哪里有空格,第一個(gè)發(fā)現(xiàn)的空格作為出新數(shù)的地方即可。
根據(jù)我玩2048的經(jīng)驗(yàn),這樣應(yīng)該是可以玩到最高分的,這一點(diǎn)我并沒(méi)有去驗(yàn)證,因?yàn)檫@樣的話構(gòu)造數(shù)據(jù)的時(shí)間代價(jià)比較高,我引入了flag這個(gè)變量,這是在整個(gè)構(gòu)造數(shù)據(jù)的過(guò)程中唯一需要修改代碼的地方。
實(shí)際上,在構(gòu)造整個(gè)數(shù)據(jù)的過(guò)程中,并不要求程序一直是不變的,在需要的時(shí)候,隨時(shí)都可以修改程序然后接著構(gòu)造數(shù)據(jù)。
3,讀取鍵盤
鍵盤的方向鍵和數(shù)字字母鍵不同,數(shù)字字母鍵每個(gè)按鍵對(duì)應(yīng)1個(gè)字符,而方向鍵每個(gè)按鍵對(duì)應(yīng)2個(gè)字符,根據(jù)后面那個(gè)字符可以判斷是哪個(gè)方向
代碼:
char direction()//讀取鍵盤的方向鍵
{
int c1 = _getch(), c2 = _getch();
if (c2 == 72)return ‘u’;
if (c2 == 80)return ‘d’;
if (c2 == 75)return ‘l’;
if (c2 == 77)return ‘r’;
return ’ ';
}
其他的代碼細(xì)節(jié)就不再解釋了。
4,完整代碼
#include
#include
#include<conio.h>
#include
using namespace std;
void display(int *p)//顯示游戲界面
{
for (int i = 0; i < 4; i++)
{
printf("\n\n\n");
for (int j = 0; j < 4; j++)printf("%8d", *(p + i * 4 + j + 1));
}
printf("\n\n\n");
}
char direction()//讀取鍵盤的方向鍵
{
int c1 = _getch(), c2 = _getch();
if (c2 == 72)return ‘u’;
if (c2 == 80)return ‘d’;
if (c2 == 75)return ‘l’;
if (c2 == 77)return ‘r’;
return ’ ';
}
int dif(char c)//每個(gè)方向的運(yùn)動(dòng)偏移
{
if (c == ‘u’)return -4;
if (c == ‘d’)return 4;
if (c == ‘l’)return -1;
if (c == ‘r’)return 1;
return 0;
}
bool move(int *p, int dif)//p,p+d,p+2d,p+3d
{
int a = *§, b = *(p + dif), c = *(p + dif * 2), d = *(p + dif * 3); //往d的方向移動(dòng)
for (int i = 0; i < 3; i++)//先把0集中在起點(diǎn)處,然后就只有相鄰的數(shù)才能合并了
{
if (d == 0)d = c, c = b, b = a, a = 0;
if (c == 0)c = b, b = a, a = 0;
if (b == 0)b = a, a = 0;
}
if (a == b && c == d)d *= 2, c = b * 2, b = 0, a = 0;
else if (c == d)d *= 2, c = b, b = a, a = 0;
else if (b == c)c *= 2, b = a, a = 0;
else if (a == b)b = 2, a = 0;
//上面計(jì)算了移動(dòng)之后的數(shù)值,下面和移動(dòng)之前比較,看是否真的有移動(dòng)
if (§ == a && *(p + dif) == b && *(p + dif * 2) == c && *(p + dif * 3) == d)return false;
*§ = a, *(p + dif) = b, *(p + dif * 2) = c, *(p + dif * 3) = d;
return true;
}
void move(int *p)//滑動(dòng)
{
int d = dif(direction());
*(p + 17) = d;
bool b = false;
if (d == 4)for (int i = 1; i <= 4; i++)if (move(p + i, d))b = true;
if (d == -4)for (int i = 13; i <= 16; i++)if (move(p + i, d))b = true;
if (d == 1)for (int i = 1; i <= 13; i += 4)if (move(p + i, d))b = true;
if (d == -1)for (int i = 4; i <= 16; i += 4)if (move(p + i, d))b = true;
if (!b)move§;
}
int newNum(int *p)
{
int s = 0, k, num0 = 0;
for (int i = 1; i <= 16; i++)
{
k = *(p + i);
if ((s^k) < s)return 2;//非0數(shù)不重復(fù),否則出2
if ((s^k) == s)num0++;//統(tǒng)計(jì)空格數(shù)量
if (s % 4)return 2;//沒(méi)有2,否則出2
s ^= k;
}
if (num0 == 1)return 4;
return 2;
}
void new_num(int p)//判斷哪里可以出1個(gè)新數(shù)
{
bool flag = false;//唯一可以修改的地方
int sum = 0;
for (int i = 1; i <= 16; i++)if ((p + i) == 0)sum++;//統(tǒng)計(jì)空格數(shù)量
if (sum < 2)flag = false;
for (int i = 0; i < 4; i++)for (int j = 0; j < 4; j++)if (*(p + i * 4 + j + 1) == 0)
{
if (flag)
{
flag = false;
continue;
}
*(p + 18) = i, *(p + 19) = j;
*(p + 20) = newNum§;
*(p + i * 4 + j + 1) = *(p + 20);
return;
}
}
int main()
{
system(“COLOR F0”);
ifstream in(“2048.txt”);
ofstream out(“2.txt”);
string in_line;
while (getline(in, in_line));//注意2048.txt最后一行不能是空行
char line[200];
for (int i = 0; i < in_line.length(); i++)line[i] = in_line[i];
int s[21];
sscanf(line, “%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d”, s+1,s+2,s+3,s+4,s+5,s+6,s+7,s+8,s+9,s+10,s+11,s+12,s+13,s+14,s+15,s+16,s+17,s+18,s+19,s+20);
while (true)
{
display(s);
move(s);
new_num(s);
for (int i = 1; i <= 20; i++)out << *(s + i) << ’ ';
out << endl;
}
return 0;
}
有了代碼之后就可以開(kāi)始構(gòu)造數(shù)據(jù)了,在這個(gè)cpp的同一目錄下新建2048.txt,寫(xiě)入第一行
0 0 0 0 0 0 0 0 2 0 0 0 2 0 0 0 0 0 0 0
2.txt不需要新建,2048.txt只用來(lái)讀,2.txt只用來(lái)寫(xiě),每次程序停止運(yùn)行后,手動(dòng)把2.txt中的內(nèi)容全選復(fù)制粘貼到2048.txt的最后面即可
在構(gòu)造數(shù)據(jù)的過(guò)程中,我們很容易發(fā)現(xiàn),在此代碼(中途不改flag的情況下)的基礎(chǔ)上,其實(shí)2048.txt中的大部分?jǐn)?shù)據(jù)都是可以省略的,只需要記錄玩家每一次的操作,再加上第一行數(shù)據(jù),即可還原出所有數(shù)據(jù),這樣就便于傳輸,尤其是那種不能發(fā)文件只能發(fā)文字的聊天環(huán)境。
于是我們需要壓縮代碼和還原代碼
壓縮代碼:
#include
#include
#include
using namespace std;
int main()
{
ifstream in(“2048.txt”);
ofstream out(“1.txt”);
string in_line;
char line[200];
int s[21];
getline(in, in_line);
out << in_line<<’\n’;
while (getline(in, in_line))
{
for (int i = 0; i < in_line.length(); i++)line[i] = in_line[i];
sscanf(line, “%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d”, s + 1, s + 2, s + 3, s + 4, s + 5, s + 6, s + 7, s + 8, s + 9, s + 10, s + 11, s + 12, s + 13, s + 14, s + 15, s + 16, s + 17, s + 18, s + 19, s + 20);
out << *(s + 17) << ’ ';
}
return 0;
}
還原代碼:
#include
#include
using namespace std;
int direc;
void move(int *p)//滑動(dòng)
{
int d = direc;
*(p + 17) = d;
bool b = false;
if (d == 4)for (int i = 1; i <= 4; i++)if (move(p + i, d))b = true;
if (d == -4)for (int i = 13; i <= 16; i++)if (move(p + i, d))b = true;
if (d == 1)for (int i = 1; i <= 13; i += 4)if (move(p + i, d))b = true;
if (d == -1)for (int i = 4; i <= 16; i += 4)if (move(p + i, d))b = true;
if (!b)move§;
}
int main()
{
FILE *fp = fopen(“1.txt”, “r”);
ofstream out(“3.txt”);
int s[21];
fscanf(fp, “%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d”, s + 1, s + 2, s + 3, s + 4, s + 5, s + 6, s + 7, s + 8, s + 9, s + 10, s + 11, s + 12, s + 13, s + 14, s + 15, s + 16, s + 17, s + 18, s + 19, s + 20);
int count = 0;
while (fscanf(fp,"%d",&direc)!=-1)
{
count++;
move(s);
new_num(s);
for (int i = 1; i <= 20; i++)out << *(s + i) << ’ ';
out << endl;
}
return 0;
}
為了驗(yàn)證代碼的正確性,可以先壓縮再還原,然后用文本比較工具比較2個(gè)txt是否完全相同
經(jīng)過(guò)比較,除了少數(shù)行尾有沒(méi)有空格不一樣之外,完全一樣
2048.txt完整數(shù)據(jù):https://pan.baidu.com/s/1slE6URz
二,驗(yàn)證數(shù)據(jù)正確性
只需要一個(gè)程序,逐行讀取2048.txt中的文件,判斷每一行到下一行的轉(zhuǎn)化是正確的即可。
代碼:
#include
#include
#include
using namespace std;
bool move(int *p, int dif)//p,p+d,p+2d,p+3d
{
int a = *§, b = *(p + dif), c = *(p + dif * 2), d = *(p + dif * 3); //往d的方向移動(dòng)
for (int i = 0; i < 3; i++)//先把0集中在起點(diǎn)處,然后就只有相鄰的數(shù)才能合并了
{
if (d == 0)d = c, c = b, b = a, a = 0;
if (c == 0)c = b, b = a, a = 0;
if (b == 0)b = a, a = 0;
}
if (a == b && c == d)d *= 2, c = b * 2, b = 0, a = 0;
else if (c == d)d *= 2, c = b, b = a, a = 0;
else if (b == c)c *= 2, b = a, a = 0;
else if (a == b)b = 2, a = 0;
//上面計(jì)算了移動(dòng)之后的數(shù)值,下面和移動(dòng)之前比較,看是否真的有移動(dòng)
if (§ == a && *(p + dif) == b && *(p + dif * 2) == c && *(p + dif * 3) == d)return false;
*§ = a, *(p + dif) = b, *(p + dif * 2) = c, *(p + dif * 3) = d;
return true;
}
bool move(int *p)//滑動(dòng)
{
int d = *(p + 17) ;
bool b = false;
if (d == 4)for (int i = 1; i <= 4; i++)if (move(p + i, d))b = true;
if (d == -4)for (int i = 13; i <= 16; i++)if (move(p + i, d))b = true;
if (d == 1)for (int i = 1; i <= 13; i += 4)if (move(p + i, d))b = true;
if (d == -1)for (int i = 4; i <= 16; i += 4)if (move(p + i, d))b = true;
return true;
}
bool ok(int *s0, int *s)
{
for (int i = 17; i <= 20; i++)s0[i] = s[i];
if (move(s0))
{
int i = *(s0 + 18), j = (s0 + 19);
if ((s0 + i * 4 + j + 1))return false;
*(s0 + i * 4 + j + 1) = *(s0+ 20);
for (int i = 1; i <= 16; i++)if (s0[i] != s[i])return false;
return true;
}
return false;
}
int main()
{
ifstream in(“2048.txt”);
string in_line;
char line[200];
int s0[21], s[21];
getline(in, in_line);
for (int i = 0; i < in_line.length(); i++)line[i] = in_line[i];
sscanf(line, “%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d”, s + 1, s + 2, s + 3, s + 4, s + 5, s + 6, s + 7, s + 8, s + 9, s + 10, s + 11, s + 12, s + 13, s + 14, s + 15, s + 16, s + 17, s + 18, s + 19, s + 20);
for (int i = 1; i <= 16; i++)s0[i] = s[i];
while (getline(in, in_line))
{
for (int i = 0; i < in_line.length(); i++)line[i] = in_line[i];
sscanf(line, “%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d”, s + 1, s + 2, s + 3, s + 4, s + 5, s + 6, s + 7, s + 8, s + 9, s + 10, s + 11, s + 12, s + 13, s + 14, s + 15, s + 16, s + 17, s + 18, s + 19, s + 20);
if (ok(s0, s))for (int i = 1; i <= 16; i++)s0[i] = s[i];
else
{
for (int i = 1; i <= 20; i++)cout << *(s + i) << ’ ';
break;
}
}
return 0;
}
三,計(jì)算得分
代碼:
#include
#include
#include
using namespace std;
int main()
{
ifstream in(“2048.txt”);
string in_line;
char line[200];
int s[21];
while (getline(in, in_line))
{
for (int i = 0; i < in_line.length(); i++)line[i] = in_line[i];
sscanf(line, “%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d”, s + 1, s + 2, s + 3, s + 4, s + 5, s + 6, s + 7, s + 8, s + 9, s + 10, s + 11, s + 12, s + 13, s + 14, s + 15, s + 16, s + 17, s + 18, s + 19, s + 20);
if ((s + 17) == -4)cout << “上滑操作:”<<line;
if ((s + 20) == 4)
{
for (int i = 1; i <= 20; i++)cout << *(s + i) << ’ ';
cout << endl;
}
}
return 0;
}
運(yùn)行結(jié)果表明,一共只出現(xiàn)了16個(gè)4,所以理論最高分3932100是可以達(dá)到的。
運(yùn)行結(jié)果還表明,從頭到尾只有左右下3種操作,沒(méi)有向上滑的操作。
————————————————
版權(quán)聲明:本文為CSDN博主「csuzhucong」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/nameofcsdn/article/details/52771170
總結(jié)
以上是生活随笔為你收集整理的2048游戏最多能玩到多大的数字?最多能玩多少分?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Mendeley Destop引用格式自
- 下一篇: Java英文单词翻译(API文档,IDE