資源簡介
Linux2048(詳細注釋版-驗證可運行)
代碼片段和文件信息
//?add?your?header?comment?here
#include?
#include?
#include?
#include?
#include?
//?put?any?extra?includes?here?but?don‘t?delete?the?ones?above
#define?SIZE????4
//?add?your?function_prototypes?here
//?The?functions?moveLeft?moveRight?moveUp?moveDown
//?return?-1?if?the?specified?moving?of?numbers??is?not?possible.
//?Otherwise?they?move?the?numbers?as?indicated?and?return
//?the?change?to?the?score?from?combining?adjacent?identical?numbers.
//?They?return?0?if?no?numbers?were?combined.
/*
????題目的意思是這樣的,需要‘嚴格’判斷能否移動,我用flag標示移動的時候在第二個判斷的時候出錯了!
????拿下移為例,if(cell==0)的時候直接判斷可以移動是錯誤的,當下移的時候,如果只有
????上面第一行的某一個元素為0,下面所有行不出現(xiàn)合并的情況下是不能下移的。
????????所以在上下左右移動的過程中,當if(cell==0)即當前元素為0時要使得能夠移動,就必須限制這個為0的
????元素不是上面第一行(下移時)、左側第一列(右移)、右側第一列(左移)、下面第一行(上移)、
????????所以修改每個move函數(shù)中判斷if(cell==0)代碼的i或者j的循環(huán)條件,以避開判斷時0所在的特殊行位置
????????具體修改看下面部分注釋(修改的只有每個move函數(shù)中第二個for循環(huán)中的i或者j的循環(huán)條件)
*/
/**************************************移動判斷部分*****************************************/
int?moveLeft(int?board[SIZE][SIZE])?{
????int?ijscore=0flag=-1;
????for(i=0;i ????{
????????for(j=0;j ????????{
????????????int?cell=board[i][j];//cell單詞用的不太恰當,表示當前元素,你可以采用更有意義的命名
????????????if(cell!=0)//當前格子不為空
????????????{
????????????????int?k=j+1;
????????????????while(k ????????????????{
????????????????????int?nextcell=board[i][k];//現(xiàn)在nextcell為cell左邊的一個元素
????????????????????if(nextcell!=0)
????????????????????{
????????????????????????if(cell==nextcell)
????????????????????????{
????????????????????????????flag=0;//相鄰兩個元素相同,就說明能移動,所以改變flag的值
????????????????????????????board[i][j]+=board[i][k];
????????????????????????????score+=board[i][j];
????????????????????????????board[i][k]=0;
????????????????????????}
????????????????????????k=SIZE;//跳出雙重循環(huán)(機智)
????????????????????????break;
????????????????????}
????????????????????k++;
????????????????}
????????????}
????????}
????}
????//修改部分:for循環(huán)中的i或者j的循環(huán)條件
????for(i=0;i ????{
????????for(j=0;j ????????{
????????????int?cell=board[i][j];
????????????if(cell==0)//如果當前格子是空的
????????????{
????????????????int?k=j+1;
????????????????while(k ????????????????{
????????????????????int?nextcell=board[i][k];
????????????????????if(nextcell!=0)//直到找到一個元素
????????????????????{
????????????????????????flag=0;//
????????????????????????board[i][j]=nextcell;//把那個元素移動到當前
????????????????????????board[i][k]=0;//把被移動元素的原位置上清空
????????????????????????k=SIZE;//直接跳出循環(huán)
????????????????????}
????????????????????k++;
????????????????}
????????????}
????????}
????}
????if(flag!=-1)
????????return?score;
????else
????????return?-1;
}
int?moveRight(int?board[SIZE][SIZE])?{
????int?ijscore=0flag=-1;
????for(i=0;i ????{
????????for(j=SIZE-1;j>=0;j--)
????????{
????????????int?cell=board[i][j];
????????????if(cell!=0)
????????????{
??
評論
共有 條評論