{"id":66,"date":"2017-02-23T09:17:19","date_gmt":"2017-02-23T00:17:19","guid":{"rendered":"http:\/\/kpc2017.satoshis.jp\/?p=66"},"modified":"2021-09-23T17:27:41","modified_gmt":"2021-09-23T08:27:41","slug":"2048%e3%82%b2%e3%83%bc%e3%83%a0%e3%81%ae%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab","status":"publish","type":"post","link":"https:\/\/kpc2017.satoshis.jp\/?p=66","title":{"rendered":"2048\u30b2\u30fc\u30e0\u306e\u30b5\u30f3\u30d7\u30eb"},"content":{"rendered":"<p>C++\u3067\u66f8\u304b\u308c\u305f2048\u30b2\u30fc\u30e0\uff08<a href=\"http:\/\/vivi.dyndns.org\/tech\/games\/2048.html\">http:\/\/vivi.dyndns.org\/tech\/games\/2048.html<\/a>\uff09\u3092C\u8a00\u8a9e\u306b\u66f8\u304d\u63db\u3048\u305f\u3082\u306e\u3002<\/p>\n<p>\u30b3\u30f3\u30bd\u30fc\u30eb\u30a2\u30d7\u30ea\u3067\u6587\u5b57\u8272\u3092\u5909\u66f4\u3059\u308b\u51e6\u7406\u306f\u7701\u7565\u3002<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/----------------------------------------------------------------------\r\n\/\/\t\t2048\r\n\/\/\t\tCopyright (C) 2048 by N.Tsuda\r\n\/\/\t\tLicense: CDDL 1.0 (http:\/\/opensource.org\/licenses\/CDDL-1.0)\r\n\/\/----------------------------------------------------------------------\r\n#include &lt;conio.h&gt;\t\t\/\/\t_getch\r\n#include &lt;time.h&gt;\t\t\t\/\/\ttime\r\n#include &lt;stdio.h&gt;\r\n#include &lt;stdlib.h&gt;\r\n#include &lt;string.h&gt;\r\n\r\n#define\t\tWALL\t\t\t-1\t\t\t\/\/\t\u756a\u4eba\r\n#define\t\tBOARD_WD\t\t4\t\t\t\/\/\t\u30dc\u30fc\u30c9\u5e45\r\n#define\t\tBOARD_HT\t\t4\t\t\t\/\/\t\u30dc\u30fc\u30c9\u9ad8\u3055\r\n#define\t\tCELL_WIDTH\t8\t\t\t\/\/\t\u30bb\u30eb\u8868\u793a\u5e45\r\n\r\n#define\t\tKEY_ARROW\t\t0xe0\r\n#define\t\tKEY_UP\t\t\t0x48\r\n#define\t\tKEY_LEFT\t\t0x4b\r\n#define\t\tKEY_RIGHT\t\t0x4d\r\n#define\t\tKEY_DOWN\t\t0x50\r\n\r\nint\tg_score = 0;\r\n\/\/int\tg_nBlank;\t\t\/\/\t\u7a7a\u6b04\u7b87\u6240\u6570\r\nint\tg_board[BOARD_WD+2][BOARD_HT+2];\t\t\/\/\t\u756a\u4eba\u4ed8\u304d\u30dc\u30fc\u30c9\uff12\u6b21\u5143\u914d\u5217\r\n\r\n\r\n#define swap(a, b) (a += b, b = a - b, a -= b)\r\n\r\n\r\n\/\/\t\u6700\u4e0a\u4f4d\u30d3\u30c3\u30c8\u306e\u4f4d\u7f6e\uff080\uff5e31\uff09\u3092\u8fd4\u3059\r\n\/\/\t\tv \u304c0\u306a\u3089\u30700, 1\u306a\u3089\u3070\uff11\uff0c2\u306a\u3089\u30702, 4\u306a\u3089\u30703, 8\u306a\u3089\u30704,... \u3092\u8fd4\u3059\r\n\/\/\t\tv \u304c\u30de\u30a4\u30ca\u30b9\u306a\u3089\u3070 -1 \u3092\u8fd4\u3059\r\n\/\/\tint \u306f\u7b26\u53f7\u4ed8\u304d32\u30d3\u30c3\u30c8\u6574\u6570\u3068\u4eee\u5b9a\u3059\u308b\r\nint msbPos(int v)\r\n{\r\n\tint n = 31;\r\n\tint mask;\r\n\tif( v == 0 ) return 0;\r\n\tif( v &lt; 0 ) return -1;\r\n\tmask = 1 &lt;&lt; (n-1);\r\n\twhile( (v &amp; mask) == 0 ) {\r\n\t\tmask &gt;&gt;= 1;\r\n\t\t--n;\r\n\t}\r\n\treturn n;\r\n}\r\n\/\/----------------------------------------------------------------------\r\nvoid\tinit_board()\r\n{\r\n\tint x, y;\r\n\t\/\/g_nBlank = BOARD_WD * BOARD_HT;\t\t\/\/\t\u7a7a\u6b04\u7b87\u6240\u6570\r\n\tfor (x = 0; x &lt; BOARD_WD+2; ++x) {\r\n\t\tfor (y = 0; y &lt; BOARD_HT+2; ++y) {\r\n\t\t\tif( x == 0 || x == BOARD_WD + 1 ||\r\n\t\t\t\ty == 0 || y == BOARD_HT + 1 )\r\n\t\t\t{\r\n\t\t\t\tg_board[x][y] = WALL;\r\n\t\t\t} else {\r\n\t\t\t\tg_board[x][y] = 0;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\nvoid print_line(int y, int printVal)\r\n{\r\n\tint x, v;\r\n\tchar str[256];\r\n\tfor (x = 1; x &lt;= BOARD_WD; ++x) {\r\n\t\tstr[0] = '&#92;&#48;';\r\n\t\tv = g_board[x][y];\r\n\t\tif( printVal ) {\r\n\t\t\tif( !v ) {\r\n\t\t\t\tstrcat_s(str, sizeof(str), &quot;   .   &quot;);\r\n\t\t\t} else {\r\n\t\t\t\tchar ss[16];\r\n\t\t\t\tsprintf_s(ss, sizeof(ss), &quot;%4d   &quot;, v);\r\n\t\t\t\tstrcat_s(str, sizeof(str), ss);\r\n\t\t\t}\r\n\t\t}\r\n\t\tprintf(&quot;%s&quot;, str);\r\n\t}\r\n\tprintf(&quot;\\n&quot;);\r\n}\r\nvoid print_board()\r\n{\r\n\tint y;\r\n\tprintf(&quot;SCORE: %d\\n\\n&quot;, g_score);\r\n\tfor (y = 1; y &lt;= BOARD_HT; ++y) {\r\n\t\tprint_line(y, 0);\r\n\t\tprint_line(y, 0);\r\n\t\tprint_line(y, 1);\r\n\t\tprint_line(y, 0);\r\n\t\tprint_line(y, 0);\r\n\t}\r\n\tprintf(&quot;\\n&quot;);\r\n}\r\nint nBlank()\r\n{\r\n\tint x, y;\r\n\tint nBlank = 0;\r\n\tfor (y = 1; y &lt;= BOARD_HT; ++y) {\r\n\t\tfor (x = 1; x &lt;= BOARD_WD; ++x) {\r\n\t\t\tif( g_board[x][y] == 0 ) ++nBlank;\r\n\t\t}\r\n\t}\r\n\treturn nBlank;\r\n}\r\n\/\/\t\u7a7a\u304d\u7b87\u6240\u306e\u3069\u3053\u304b\u306b 2(75%) \u307e\u305f\u306f 4(25%) \u3092\u914d\u7f6e\u3059\u308b\r\nvoid put_number()\r\n{\r\n\tint pos, v, x, y;\r\n\tint n = nBlank();\r\n\tif( n == 0 ) return;\r\n\tpos = rand() % n;\r\n\tv = (rand() % 100) &lt; 75 ? 2 : 4;\t\t\/\/\t75% \u306e\u78ba\u7387\u3067\uff12\uff0c25%\u306e\u78ba\u7387\u3067\uff14\r\n\tfor (y = 1; y &lt;= BOARD_HT; ++y) {\r\n\t\tfor (x = 1; x &lt;= BOARD_WD; ++x) {\r\n\t\t\tif( g_board[x][y] == 0 ) {\t\t\/\/\t\u7a7a\u6b04\u3092\u63a2\u3059\r\n\t\t\t\tif( !pos ) {\r\n\t\t\t\t\tg_board[x][y] = v;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t--pos;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\/\/\t\u76e4\u9762\u5de6\u53f3\u53cd\u8ee2\r\nvoid hrev_board()\r\n{\r\n\tint x, y;\r\n\tfor (y = 1; y &lt;= BOARD_HT; ++y) {\r\n\t\tfor (x = 1; x &lt;= BOARD_WD\/2; ++x) {\r\n\t\t\tswap(g_board[x][y], g_board[BOARD_WD + 1 - x][y]);\r\n\t\t}\r\n\t}\r\n}\r\n\/\/\tx, y \u53cd\u8ee2\r\nvoid swapxy_board()\r\n{\r\n\tint x, y;\r\n\tfor (y = 1; y &lt; BOARD_HT; ++y) {\r\n\t\tfor (x = y + 1; x &lt;= BOARD_WD; ++x) {\r\n\t\t\tswap(g_board[x][y], g_board[y][x]);\r\n\t\t}\r\n\t}\r\n}\r\nint move_right()\r\n{\r\n\tint y, src, dst, v;\r\n\tint moved = 0;\r\n\tfor (y = 1; y &lt;= BOARD_HT; ++y) {\r\n\t\tdst = BOARD_WD;\r\n\t\tfor(src = BOARD_WD; src &gt;= 1; --src) {\r\n\t\t\tv = g_board[src][y];\r\n\t\t\tif( v != 0 ) {\r\n\t\t\t\tif( src == BOARD_WD ) continue;\t\t\/\/\t\u53f3\u7aef\u306e\u5834\u5408\r\n\t\t\t\tif( g_board[dst][y] == 0 ) {\t\t\/\/\t\u79fb\u52d5\u5148\u304c\u7a7a\u6b04\r\n\t\t\t\t\tif( dst != src ) {\r\n\t\t\t\t\t\tg_board[src][y] = 0;\r\n\t\t\t\t\t\tg_board[dst][y] = v;\r\n\t\t\t\t\t\tmoved = 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if( g_board[dst][y] == v ) {\t\t\/\/\t\u540c\u3058\u6570\u5b57\r\n\t\t\t\t\tg_score += v * 2;\r\n\t\t\t\t\tg_board[src][y] = 0;\r\n\t\t\t\t\tg_board[dst][y] += v;\r\n\t\t\t\t\t--dst;\r\n\t\t\t\t\tmoved = 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t--dst;\r\n\t\t\t\t\tif( dst != src ) {\r\n\t\t\t\t\t\tg_board[src][y] = 0;\r\n\t\t\t\t\t\tg_board[dst][y] = v;\r\n\t\t\t\t\t\tmoved = 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn moved;\r\n}\r\nint move_left()\r\n{\r\n\tint rc;\r\n\threv_board();\r\n\trc = move_right();\r\n\threv_board();\r\n\treturn rc;\r\n}\r\nint move_up()\r\n{\r\n\tint rc;\r\n\tswapxy_board();\r\n\threv_board();\r\n\trc = move_right();\r\n\threv_board();\r\n\tswapxy_board();\r\n\treturn rc;\r\n}\r\nint move_down()\r\n{\r\n\tint rc;\r\n\tswapxy_board();\r\n\trc = move_right();\r\n\tswapxy_board();\r\n\treturn rc;\r\n}\r\nint isMovable()\r\n{\r\n\tint x, y;\r\n\tfor (y = 1; y &lt;= BOARD_HT; ++y) {\r\n\t\tfor (x = 1; x &lt;= BOARD_WD; ++x) {\r\n\t\t\tif( g_board[x][y] == 0 ||\r\n\t\t\t\tg_board[x][y] == g_board[x+1][y] ||\r\n\t\t\t\tg_board[x][y] == g_board[x][y+1] )\r\n\t\t\t{\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn 0;\r\n}\r\nint g2048()\r\n{\r\n\tint moved, c;\r\n\tmoved = 0;\r\n\tsrand((int)time(0));\r\n\tfor (;;) {\r\n\t\tg_score = 0;\r\n\t\tinit_board();\r\n\t\tput_number();\r\n\t\tfor(moved;;) {\r\n\t\t\tif( moved )\r\n\t\t\t\tput_number();\r\n\t\t\tprint_board();\r\n\t\t\tif( !isMovable() ) break;\r\n\t\t\tprintf(&quot;Type \u2190\u2191\u2193\u2192     &quot;);\r\n\t\t\tc = _getch();\r\n\t\t\tif( c == 'q' ) break;\r\n\t\t\tif( c == KEY_ARROW ) {\r\n\t\t\t\tc = _getch();\r\n\t\t\t\tswitch( c ) {\r\n\t\t\t\t\tcase KEY_LEFT:\r\n\t\t\t\t\t\tmoved = move_left();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase KEY_RIGHT:\r\n\t\t\t\t\t\tmoved = move_right();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase KEY_UP:\r\n\t\t\t\t\t\tmoved = move_up();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase KEY_DOWN:\r\n\t\t\t\t\t\tmoved = move_down();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tprintf(&quot;Try again ? [y\/n]   &quot;);\r\n\t\tfor (;;) {\r\n\t\t\tc = _getch();\r\n\t\t\tif( c == KEY_ARROW )\r\n\t\t\t\t_getch();\r\n\t\t\tif( c == 'y' || c == 'Y' ||\r\n\t\t\t\tc == 'n' || c == 'N' )\r\n\t\t\t{\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif( c != 'y' &amp;&amp; c != 'Y' ) break;\r\n\t}\r\n\treturn 0;\r\n}\r\n<\/pre>\n\n<div style=\"font-size: 0px; height: 0px; line-height: 0px; margin: 0; padding: 0; clear: both;\"><\/div>","protected":false},"excerpt":{"rendered":"<p>C++\u3067\u66f8\u304b\u308c\u305f2048\u30b2\u30fc\u30e0\uff08http:\/\/vivi.dyndns.org\/tech\/games\/2048.html\uff09\u3092C\u8a00\u8a9e\u306b\u66f8\u304d\u63db\u3048\u305f\u3082\u306e\u3002 \u30b3\u30f3\u30bd\u30fc\u30eb\u30a2\u30d7\u30ea\u3067\u6587\u5b57\u8272\u3092\u5909\u66f4\u3059\u308b\u51e6\u7406\u306f\u7701\u7565\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[],"_links":{"self":[{"href":"https:\/\/kpc2017.satoshis.jp\/index.php?rest_route=\/wp\/v2\/posts\/66"}],"collection":[{"href":"https:\/\/kpc2017.satoshis.jp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kpc2017.satoshis.jp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kpc2017.satoshis.jp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kpc2017.satoshis.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=66"}],"version-history":[{"count":2,"href":"https:\/\/kpc2017.satoshis.jp\/index.php?rest_route=\/wp\/v2\/posts\/66\/revisions"}],"predecessor-version":[{"id":70,"href":"https:\/\/kpc2017.satoshis.jp\/index.php?rest_route=\/wp\/v2\/posts\/66\/revisions\/70"}],"wp:attachment":[{"href":"https:\/\/kpc2017.satoshis.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=66"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kpc2017.satoshis.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=66"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kpc2017.satoshis.jp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=66"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}