閫氬父錛屽啓涓涓縿緗楁柉鏂瑰潡錛屽線寰鍔ㄤ笉鍔ㄥ氨鍑犵櫨琛岋紝鐢氳嚦涓婂崈琛岋紝鑰岃繖閲屽彧鏈?8琛?br /> 姝f墍璋撳ご鑴戦鏆達(dá)紝鎵撶牬甯歌銆傝繖閲屽皢浣跨敤寰堝涓嶅鉤甯哥殑鎵嬫鏉ュ噺灝戜唬鐮?/p>
浠ヤ笅鏄疻in-TC鍙互鎴愬姛緙栬瘧騫舵墽琛岀殑浠g爜錛堜唬鐮佷繚璇佸崟琛岄暱搴︿笉瓚呰繃80瀛楃錛屽鏋滀綘鏄疻in7緋葷粺錛岄偅璇風(fēng)湅鍚庢枃錛夛細(xì)
#include "graphics.h"
#include <conio.h>
#include <stdlib.h>
int gcW = 20, gcColor[] = {DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN,
LIGHTRED, LIGHTMAGENTA,MAGENTA, YELLOW};
struct tetris {
int _pool[16][32], (*pool)[32], tmap[8][4][16];
int x, y, s, st, t;
}gt;
void trsInit() {
int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802},
{39,305,114,562},{54,561},{99,306},{51,51},{-1}};
int *p, i, j, b;
for (p = sp[0]; *p >= 0; ++p) if ( *p == 0 ) *p = p[-2];
gt.pool = >._pool[4];
for (j = 0; j < 7; ++j)
for (i = 0; i < 4; ++i)
for (b = 0; b < 16; ++b)
gt.tmap[j+1][i][b] = (sp[j][i] & 1) * (j + 1),
sp[j][i] >>= 1;
memset(gt._pool, -1, sizeof(gt._pool));
for (i = 0; i < 10; ++i)
memset(>.pool[i], 0, sizeof(int[21]));
return ;
}
int trsCopy(int sp[], int x, int y, int c) {
int m[] = {0,32,64,96,1,33,65,97,2,34,66,98,3,35,67,99}, i, cx, cy;
for (i = 0; i < 16; ++i) if (sp[i]) {
cx = x + (m[i] >> 5), cy = y + (m[i] & 31);
if (gt.pool[cx][cy]) if (c == 2) gt.pool[cx][cy] = 0; else return 0;
if (c==1) gt.pool[cx][cy] = sp[i];
}
return 1;
}
int trsScene() {
int x, y = 0;
gt.s = random(7) + 1, gt.st = gt.t = 0;
gt.x = 4, gt.y = 0;
for (--gt.t ; ; delay(10), --gt.t) {
int k = 0;
while (kbhit()) {
k = getch();
if (k == 27) return 0;
if (k == 'A' || k == 'a') {
if (trsCopy(gt.tmap[gt.s][gt.st], gt.x-1, gt.y, 0)) --gt.x;
} else if (k == 'D' || k == 'd') {
if (trsCopy(gt.tmap[gt.s][gt.st], gt.x+1, gt.y, 0)) ++gt.x;
} else if (k == 'W' || k == 'w') {
if (trsCopy(gt.tmap[gt.s][(gt.st+1) % 4], gt.x, gt.y, 0))
gt.st = (gt.st+1) % 4;
}
}
if (k == 'S' || k == 's' || gt.t < 0) {
if (trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y+1, 0))++gt.y,gt.t=50;
else {
trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 1);
for (--y; y > 0; --y) {
for (x = 0; gt.pool[x][y] > 0; ++x);
if (gt.pool[x][y] < 0)
for (k = y++; k > 0; --k)
for (x = 0; gt.pool[x][0] >= 0; ++x)
gt.pool[x][k] = gt.pool[x][k-1];
}
return 1;
}
}
trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 1);
for (x = 0; gt.pool[x][0] >= 0; ++x) {
for (y = 1; gt.pool[x][y] >= 0; ++y) {
setfillstyle(1, gcColor[gt.pool[x][y]]);
bar(201 + x*gcW, 1 + y*gcW, 200 + gcW + x*gcW, gcW + y*gcW);
}
}
trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 2);
}
}
int main() {
int g = DETECT, m = 0;
initgraph(&g, &m, "");
randomize();
trsInit();
while (trsScene());
return 0;
}
濡傛灉浣犳病鏈塛in-TC錛屾垨鑰呬綘鏄疻in7緋葷粺錛屽彲浠ョ敤榪欎釜鑳界敤VC6緙栬瘧鐨勫伐紼嬪寘錛?br /> http://www.shnenglu.com/Files/misakamm/tetris.zip
浠ヤ笂鏄浘褰㈢晫闈㈢増鏈紝鏄劇ず鐪嬭搗鏉ュソ鐪嬩竴浜?br />
浣嗕負(fù)浜嗚兘鏇撮氱敤錛岃繕鏈変竴浠芥帶鍒跺彴鐗堟湰鐨勪唬鐮侊紝鍚屾牱鏄?8琛岋紝鐩存帴澶嶅埗鍒癡C鍗沖彲緙栬瘧錛?br />
#include <windows.h>
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
char gcText[] = " 1LJTSZ#";
struct tetris {
int _pool[16][32], (*pool)[32], tmap[8][4][16];
int x, y, s, st, t;
}gt;
void trsInit() {
int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802},
{39,305,114,562},{54,561},{99,306},{51,51},{-1}};
int *p, i, j, b;
for (p = sp[0]; *p >= 0; ++p) if ( *p == 0 ) *p = p[-2];
gt.pool = >._pool[4];
for (j = 0; j < 7; ++j)
for (i = 0; i < 4; ++i)
for (b = 0; b < 16; ++b)
gt.tmap[j+1][i][b] = (sp[j][i] & 1) * (j + 1),
sp[j][i] >>= 1;
memset(gt._pool, -1, sizeof(gt._pool));
for (i = 0; i < 10; ++i)
memset(>.pool[i], 0, sizeof(int[21]));
return ;
}
int trsCopy(int sp[], int x, int y, int c) {
int i, cx, cy;
for (i = 0; i < 16; ++i) if (sp[i]) {
cx = x + (i & 3), cy = y + (i >> 2);
if (gt.pool[cx][cy])
if (c == 2) gt.pool[cx][cy] = 0; else return 0;
if (c==1) gt.pool[cx][cy] = sp[i];
}
return 1;
}
int trsScene() {
int x, y = 0;
COORD pos = {0};
gt.s = rand() % 7 + 1, gt.st = gt.t = 0;
gt.x = 3, gt.y = 0;
for (--gt.t; ; Sleep(1), --gt.t) {
int k = 0;
while (kbhit()) {
k = getch();
if (k == 27) return 0;
if (k == 'A' || k == 'a') {
if (trsCopy(gt.tmap[gt.s][gt.st], gt.x-1, gt.y, 0)) --gt.x;
} else if (k == 'D' || k == 'd') {
if (trsCopy(gt.tmap[gt.s][gt.st], gt.x+1, gt.y, 0)) ++gt.x;
} else if (k == 'W' || k == 'w') {
if (trsCopy(gt.tmap[gt.s][(gt.st+1) % 4], gt.x, gt.y, 0))
gt.st = (gt.st+1) % 4;
}
}
if (k == 'S' || k == 's' || gt.t < 0) {
if (trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y+1, 0))++gt.y,gt.t=50;
else {
trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 1);
for (--y; y > 0; --y) {
for (x = 0; gt.pool[x][y] > 0; ++x);
if (gt.pool[x][y] < 0)
for (k = y++; k > 0; --k)
for (x = 0; gt.pool[x][0] >= 0; ++x)
gt.pool[x][k] = gt.pool[x][k-1];
}
return 1;
}
}
trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 1);
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
for (y = 1; gt.pool[0][y] >= 0; ++y,putchar(10)) {
for (x = 0; gt.pool[x][0] >= 0; ++x) {
putchar(gcText[gt.pool[x][y]]);
}
}
trsCopy(gt.tmap[gt.s][gt.st], gt.x, gt.y, 2);
}
}
int main() {
srand((unsigned)time(NULL));
for (trsInit(); trsScene(); );
return 0;
}
鍖哄埆浠呬粎鏄粯鐢葷敤鐨勫嚱鏁頒笉鍚岃屽凡錛屼笉榪囨帶鍒跺彴鐗堟樉紺烘晥鏋滆嚜鐒朵細(xì)宸緢澶氫簡
褰撲綘鐜╀笅鍘伙紝浣犲鏋滃爢鏀懼埌鏈欏訛紝杈撲簡鐨勮瘽錛岀▼搴忓氨浼?xì)浠ユ渶涓哄崕涓界殑鏂瑰紡錛欳rash錛堢▼搴忓穿婧冿級 璋㈠箷
======================================鍗庝附鐨勫垎鍓茬嚎========================================
浠ヤ笅鏄浠g爜鐨勫帇緙╂柟娉曡繘琛屽垎鏋?/p>
棣栧厛錛岄氬父鎴戜滑闇瑕佸噯澶?縐嶆柟鍧楋紝4涓柟鍚戠殑褰㈢姸琛紝鐩稿綋澶氱殑淇勭綏鏂柟鍧楃▼搴忓氨鏄湪寮澶村啓浜嗚繖鏍蜂竴涓緢闀跨殑鏁扮粍瀹氫箟錛?br /> 鏈夌殑鍏夎繖涓畾涔夊氨鐩存帴瓚?00琛屼簡錛岃繖涓▼搴忔槸鎬庝箞瀹炵幇鐨勫憿錛?/p>
鍏跺疄榪欎釜紼嬪簭錛屽悓鏍鋒槸浣跨敤涓涓?*4*16鐨勬暟緇勬潵淇濆瓨榪欎釜褰㈢姸琛紝浣嗘槸錛屽畠娌℃湁鐩存帴鍒濆鍖栵紝瑙佽繖涓暟緇勭殑瀹氫箟錛?br />
int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802},
{39,305,114,562},{54,561},{99,306},{51,51},{-1}};
榪欎釜鑾悕鍏跺鐨勬暟緇勭殑鍊兼槸浠涔堟剰鎬濆憿錛熷叾瀹炲緢濂界寽鐨勶紝鎴戜滑灝濊瘯鎶婅繖浜涙暟鍖栦負(fù)浜岃繘鍒訛細(xì)
15 = 1111
4369 = 1000100010001
鍚堢悊鍦板洓浣嶅洓浣嶆媶寮錛屼粠浣庝綅鍒伴珮浣嶏紝浠庡乏鍒板彸錛屼粠涓婂埌涓嬫帓鍒椾竴涓嬶細(xì)
1111
0000
0000
0000
1000
1000
1000
1000
浣犵粓浜庡彂鐜幫紝榪欏氨鏄暱鏉℃柟鍧楃殑涓や釜褰㈢姸
鍚庨潰綾諱技
鐒跺悗浣犱細(xì)鍙戠幇錛岃繖涓暟緇勫茍涓嶅畬鏁達(dá)紝鏈夌殑鍙畾涔変簡涓や釜褰㈢姸錛屾湁鐨勬槸鍥涗釜褰㈢姸錛屾病瀹氫箟鐨勬暟浼?xì)榛樿缃?鐨勶紝榪欎釜鎬庝箞瑙i噴錛?br />
鐪嬭繖涓暟緇勫畾涔夌殑涓嬮潰絎簩琛岋細(xì)
for (p = sp[0]; *p >= 0; ++p) if ( *p == 0 ) *p = p[-2];
鎰忔濇槸鎵懼嚭榪欎釜鏁扮粍涓?鐨勫厓绱狅紝鐢ㄥ畠鍓嶉潰鐨勫厓绱犲煎~涓婂嵆*p = p[-2]
鑰屾暟緇勪腑鏈鍚庝竴涓厓绱犲?1璧風(fēng)洃鐫eご鐨勪綔鐢紝鐢ㄤ簬璁╄繖涓驚鐜煩鍑?br />
铏界劧鍙互鎶婅繖浜涘父鏁板叏鐩存帴鍐欏湪鏁扮粍閲岋紝浣嗗父鏁板お澶氭樉寰椾笉澶ソ錛屽氨榪欐牱鍐欎簡
涔嬪悗浣犵湅鍒拌繖琛屼唬鐮侊細(xì)
gt.pool = >._pool[4];
涓轟粈涔堝畾涔変袱涓猵ool鍛紵鍥犱負(fù)鎴戜滑闇瑕佸湪鍘熸潵鐨刾ool鐨勭晫澶栫敤-1鍊煎~鍏咃紝浠ヤ究鍚庨潰鍋氱鎾炴嫻嬪噺灝戜笉蹇呰鐨勪唬鐮?br />
浣嗗鏋滅洿鎺ョ敤鍘熸潵鐨刜pool錛岄偅姣忔璁塊棶閮借鍔犱笂涓涓亸縐誨父鏁幫紝涓嶇編瑙備笖鏄懼緱浠g爜闀匡紝灝辯敤鍙︿竴涓寚閽堢洿鎺ユ寚鍚戝紑濮嬬殑浣嶇疆
鐒跺悗錛屽悗闈㈢殑涓夐噸寰幆灝辨槸瑙e紑閭d釜浣嶅帇緙╂暟緇勪互鍒濆鍖杇t.tmap鏁扮粍錛岃繖涓暟緇勫氨鏄褰?*4縐嶅艦鐘剁殑鏁扮粍
鍐嶄笅闈笁琛岋紝灝辨槸鍒濆鍖杙ool錛屾父鎴忓尯涓?錛岀晫澶栦負(fù)-1
鑰屽叾涓紝i < 10鍐沖畾浜嗘父鎴忔睜鐨勫搴︿負(fù)10錛宻izeof(int[21])鍐沖畾浜嗘父鎴忔睜鐨勯珮搴︽槸20 錛?鎴戜滑涓嶄嬌鐢紝榪欎竴琛屾湁鐗規(guī)畩浣滅敤錛屽悗鏂囦細(xì)璁詫級
鐢╩emset涔熸槸涓轟簡鍏嶅啓浜岄噸寰幆鑰屽凡銆傛暣涓垵濮嬪寲嫻佺▼灝卞埌榪欓噷浜?/p>
鐒跺悗錛屾槸涓涓猼rsCopy鍑芥暟錛岃繖涓嚱鏁扮患鍚堜簡紕版挒媯嫻嬶紝澶嶅埗鍒版父鎴忔睜鍜屽弽澶嶅埗錛岃涓虹敱鍙傛暟c 錛堟槸control緙╁啓瀛楁瘝錛夋帶鍒?br /> c涓?灝卞崟綰殑紕版挒媯嫻嬶紝c涓?鏄鍒訛紝c涓?灝辨槸鍙嶅鍒訛紝緇嗗績鍒嗘瀽涓涓嬶紝榪欎釜鍑芥暟鍔熻兘灝辨竻妤氫簡錛岃繖閲屼笉璇︾粏灞曞紑
濂戒簡錛屽埌浜唗rsScene鍑芥暟錛屾暣涓父鎴忕殑涓婚昏緫嫻佺▼灝卞湪榪欓噷浜?br />
鎴戜滑鍏堢湅絎?5琛岀殑閭d釜浜岄噸寰幆錛屽彧鏈夐偅涓湴鏂規(guī)槸鏍規(guī)嵁pool淇濆瓨鐨勫兼潵杈撳嚭
鎵浠ワ紝榪欎釜鏃跺欙紝浣犲簲璇ユ槑鐧戒負(fù)浠涔坱rsCopy鍑芥暟榪樿澶嶅埗鍜屽弽澶嶅埗浜嗭紝
瀹冩妸浣犳鍦ㄦ帶鍒剁殑鏂瑰潡錛屽鍒跺埌pool閲岋紝緇熶竴杈撳嚭錛岃繖鏍峰氨涓嶉渶瑕佸彟鍔犱竴涓嚱鏁版潵緇樼敾浣犵殑鎺у埗鍧椾簡
鑰岀粯鍥句箣鍓嶏紝灝辨槸閿洏澶勭悊絳夌殑閫昏緫鎺у埗錛岃繖閲屽氨娌℃湁浠涔堝鏉傞毦鎳傜殑浠g爜浜嗭紝
鍞竴瑕佽璁茬殑鏄紝if (k == 'S' || k == 's' || gt.t < 0)
榪欎竴孌墊槸鍒ゆ柇涓嬭惤閿殑鎸変笅錛屽拰鏄惁鍒版椂闂村己鍒朵笅钀?br />
閲岄潰for (--y; y > 0; --y)寮濮嬫槸娑堣璁$畻
浣犲彲鑳戒細(xì)濂囨繖涓獃娌℃湁鏄庢樉鐨勫垵濮嬪鹼紝鐩存帴灝辨潵涓涓?--y錛屽垵濮嬩粠鍝噷鏉ワ紵
鍏跺疄灝卞湪涔嬪墠璁茬殑杈撳嚭緇樼敾閭d釜寰幆閲岋紝寰幆緇撴潫鍚庯紝y鐨勫間竴瀹氭槸鏈鍚庝竴琛?1
鎵浠ユ垜浠彧瑕?-y灝卞緱鍒版渶搴曚笅涓琛岋紝鍥犱負(fù)娑堣璁$畻錛屼粠涓嬪線涓婏紝鍙涓嬈″氨瑙e喅浜嗭紝浠g爜杈冨皯
濂戒簡錛岀幇鍦ㄨВ閲婁箣鍓嶈鐨勶紝涓轟粈涔堜笉鏄粠0錛岃屾槸浠?寮濮?br /> 娑堣璁$畻榪欓噷錛屾瘡娑堥櫎涓琛岋紝鏈欏剁殑涓琛屽氨搴旇鐢?濉厖錛屼絾濡傛灉浣犲洜涓鴻繖涓鍐欎竴涓猣or寰幆灝變笉鍊煎緱浜?br /> 鎴戜滑鏀規(guī)垚浠?寮濮嬶紝閭d箞鎶婄0琛岀殑鍐呭澶嶅埗鍒扮涓琛岋紝灝卞畬鎴?濉厖浜嗭紝灝卞彲浠ュ皯鍐欎竴涓猣or
濂戒簡錛屽樊涓嶅鎺ヨ繎灝懼0浜嗭紝鏈鍚庤璇磘rsScene鐨勮繑鍥炲?br />
trsScene榪斿洖鍊肩殑鎰忔濆緢綆鍗曪紝濡傛灉鏄?灝辯戶緇驚鐜紝濡傛灉鏄?灝遍鍑?br />
鎵浠ヤ綘鍙互鍦ㄤ唬鐮侀噷鐪嬪埌錛屽綋鎸変笅ESC(鍊間負(fù)27)鐨勬椂鍊欐墠榪斿洖0
鑰屾柟鍧楄惤涓嬩竴涓殑鏃跺欙紝榪斿洖1錛岃涓誨嚱鏁伴噸鏂拌皟鐢ㄥ畠錛屽氨鑳藉啀嬈″垵濮嬪寲褰撳墠鎺у埗鍧楃殑浣嶇疆鍜屽艦鐘朵簡錛?br />
杈懼埌鍏嶉櫎鐘舵佺鐞嗙殑浠g爜鐨勪綔鐢?/p>
鏈鍚庯紝鍦ㄤ富寰幆闄や簡鍒濆鍖栵紝鍙鍗庝附鐨勪竴琛宖or (trsInit(); trsScene(); ); 灝卞彲浠ョ帺榪欎釜娓告垙浜?/p>
鐪嬩笉鎳傦紵璇存槑浣犱篃鏄釜姝e父浜?br />
鐪嬪緱鎳傦紵璇存槑浣犲凡緇忚剳孌樹簡銆傘傘?/p>