找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 10046|回复: 0

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
: I- R4 ^* T. V% ?8 q8 r; h
1
8 a0 ]- [* p  f6 k& N; p完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
+ H& m7 J! I3 i. a# s7 N) g) {) e! X7 C0 w
* _- B- q& G  {
Factorycode如下:+ z3 w: W5 R2 t: |5 p

) ^6 I$ s& X2 m6 q' l& Z( a, l! Z/*************************************& |# c" Q% N( G; H( i( r: f- `
' Z. E, U$ [/ V5 n
* author:hgf_starlovecpp@hotmail.com

4 _% ?9 \! z+ `6 }8 O/ y9 o7 ]4 l. w! p
* version:1.0
0 p5 M& c1 X; l! k- }+ G$ r

6 z9 ]6 {* I/ ]7 ~2 I6 P* description: just for fun
* ~5 H- ^0 ^7 G/ \6 h

# q; a9 a" ~- R8 o  t* s# V* todo: hard code exists need to fixed
6 R2 ~$ F! p' s- F: l/ l

7 K6 B# J1 G' s3 N, r**************************************/

/ |. m7 ^2 _3 d2 X, S& X3 v2 ?; r8 z 7 i- Y5 c( X# ]2 d9 |4 Y7 z4 N% Q
#pragma once4 b7 t3 Q: _: s( s2 d
#include <map>
# c0 ~5 \# Q/ L4 v$ p#include "Tetris.h"# s1 t+ Q/ \3 t/ ]  g
#include "OneTetris.h"
! W, @+ O& Z: Z1 N0 j#include "TwoTetris.h"" k4 d: Z+ q# b+ b
#include "ThreeTetris.h"
& m- k+ w" B5 r6 P  I#include "FourTetris.h"5 H) F; t1 T$ f0 t6 ~9 o2 J
#include "FiveTetris.h"0 N: s  \" W! A) S% t0 f0 o/ x
#include "SixTetris.h"
& i8 f2 ]( Y1 `4 `, X' M# z#include "SevenTetris.h"
2 g8 B; v* t. P. H+ j2 X
0 j" O2 \" T9 Q9 V) ~" Zclass TetrisFactory, j3 E' x, Q9 Z; p* a1 {
{
, Q3 h* i3 k0 K9 o  V7 E- X- V  upublic:
7 s% \7 q5 n, [" U- j# h; u
& J; j: a) t6 \$ ~  u& ^
( m! J) J" f  OTetrisFactory(
void)
) Y8 L1 u2 N% R
8 f2 a8 G! f* Y
{
- [- _  n0 ?3 J+ m) I: ?& p
! r  a9 T( ^$ D  R" h
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

. l& u  l9 p# m
% r6 `; D/ \3 Z9 @9 {m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

6 ]' }  \# r) G, d- W! _( A& W8 c8 a% T
) U) u4 v1 I! {1 `% Qm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

- v0 [5 t) F4 D- B0 a, r
+ d1 M  l' q$ V$ {m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
" T: M* U  t% R4 t

% H( F& W8 o4 |* h. O$ ?2 Ym_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
4 u- U- y. R2 h! Q

- h/ @" m# w7 a* ]) Xm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

' g! K' Z# W7 U9 z' D1 K) j/ d5 X: d* j* r& S4 e
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
4 P) R* I3 d" P" [3 X
" B% o' @( z! Q  L; k* N8 Q
}

! \5 Q: H4 [6 l4 d) hpublic:% Y/ ]+ w) H! d: |
9 {. m; }& R% F  Y% M
* c- }1 ~8 y, j, P- y
~TetrisFactory(
void)
" C( A8 B( f& _# h8 V' J; n
, M* N6 |& @3 k1 L5 `* P
{
# s3 \! M5 ^! x9 X+ F" W) W  Y6 L! G+ ^
4 j/ p6 p1 ?, W
}

. [. p% y- ?8 k' H  L+ _: r" I7 L1 Z& c
Tetris* CreateTetris(
char sel)

0 f5 X% J- W6 O; h1 T8 h% y; Y1 v8 p& ^; D
{

8 y& J1 ~# \& |7 F- j2 v" s                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
( g& c2 z9 _, e
; G+ r* `- y+ F}

% j# l; h6 x( Z9 Sprivate:
$ N3 I" ~$ f! P4 ?+ T8 W' F8 x& ~3 ^, I9 \& ^. s8 n% Z. f
' j7 `2 \* w/ t" S

3 G$ i2 E" |: m- LTetris* CreateOneTetris()
2 v  T9 a1 \/ ^" b2 V) D0 V
0 V! A2 M4 b( b- ~) s
{
- R; a7 o, F; o( s
                        static OneTetris tetris;& f' b# U% g4 a  D" u
9 X9 h" r6 H- e
tetris.InitPos();

* e% Y: U! a  n' d- |                        return & tetris;! ?" S; l$ [. l7 S

4 Y% R7 A# I# B- P" R}
* H5 t; _2 B9 N

3 i$ {  N- Z+ Z( Q3 M6 q7 O* A7 L
0 |6 S. X! F6 {- w- I  `5 D
* x' i* u. l" R0 ~! g
Tetris* CreateTwoTetris()
8 w+ K  E, K4 q; f" Y1 P/ s

# p$ s* I0 K' L  l+ s8 a3 o7 B9 a. Q{

1 U: q! ~" e7 W% _% {& c                        static TwoTetris tetris;: ~" w4 |- {. ~' Z* ^

( Z8 Y1 W8 Z/ c; N# U& Utetris.InitPos();

  y8 l+ c; I# D! s* L                        return & tetris;/ {& t& N% F% u. {8 a
- F: n( }; O2 _, d6 O! G2 k
}
$ c& U# T4 h' R
1 s* E: S: D4 I! U+ U% |# n

& b, r8 F/ Q) w9 W" f4 @6 R8 v% d5 ]* ?# M# v4 b; E
Tetris* CreateThreeTetris()

2 a0 D0 ?4 S; {) j+ m9 J- p' y$ O) D/ `) a5 R0 k0 T
{

5 W! I+ Z9 ~. S6 z1 i% [                        static ThreeTetris tetris;& \, P* X5 z: H8 U

, l& Z, d, T5 e2 i* [, Ntetris.InitPos();

- M& `  q: p  |( ~( U) y% R3 J/ ]5 y/ ^: P! _  n
+ l3 ?' `+ G1 E+ g! P# f
return & tetris;
" o+ u, T$ E" |( {! Y2 @6 i% O

5 k+ W4 H. R9 P8 s5 @. n$ a}

6 `+ l$ X" c* }% b4 ]; U' G' ~  L$ d  s( ^; Q6 g9 ^

6 L2 u; W0 Q6 B7 L6 y7 N3 }  T$ [7 C7 V! h
Tetris* CreateFourTetris()
' X3 b' x; Q) T% i

6 W2 U- f& p+ a* {9 Z7 r+ w# r- M{

& v4 u  i1 b' m) L/ @                        static FourTetris tetris;
# K+ H$ X, a+ N+ ~9 G( S0 X- F7 r% G1 w& x' q$ s
tetris.InitPos();

# `% w% Y8 O- Y, |  d% ]4 x2 Z# J                        return & tetris;
# O& h) ]' z4 W6 K& S
2 u/ V: q0 O' @. w/ f) d}
1 y* f; _4 O- M) B; a3 e

7 V$ u$ Y! E9 o- n! S

  ]- l6 ^, A% D% ^& B, h( [, N) V
Tetris* CreateFiveTetris()

' f, q9 L3 g6 a5 `3 `  I+ D
' d+ J% s3 X6 j+ T6 S- m# D{

; w6 v- V% k6 }$ Z                        static FiveTetris tetris;" A  T$ n! w- r4 w

# ?9 v* d: W* ltetris.InitPos();
* n  B& Z. v4 f3 _  O
                        return & tetris;
+ a8 n- m" h- M2 W+ T: r, |0 O
: T5 e( `# |& ], z4 `: ^9 X}

3 q0 w4 b) h9 x# o4 U
: P6 |7 k) A2 {( W
5 T5 h+ f! b$ G" qTetris* CreateSixTetris()
% C2 u8 L1 D% W" x5 m
, G  R& o  ?) \5 V
{
1 f. V) a/ a8 a4 Q5 R6 m
                        static SixTetris tetris;  c8 ^+ P. F! ^6 G+ j
% R( Y) |  T4 L: }' P7 h
tetris.InitPos();

5 Y1 O) G1 L3 o* |% Z3 b                        return & tetris;% G/ K9 b0 m$ j. k7 s
8 t$ w# f4 O% \  L: I! c( f
}
: H2 P0 l- B( b- K, Y7 E
7 h: A3 N  |2 Q" y
: k" |: f% Z$ G

  @4 M. C1 @" \& f$ @
5 _: n. L8 O# O' o6 g. r" UTetris* CreateSevenTetris()

1 f& w/ O, h0 L* a6 ]/ G) N4 {1 m) y& ~: e6 e9 f+ l' u
{
' {( \9 p. ?! U' F" [* u* X
                        static SevenTetris tetris;
" h& S; Q! z  O& i9 Q# L0 }  s8 n& K/ m
tetris.InitPos();

4 |3 H1 J# T% F3 D) C                        return & tetris;5 n2 `& S) `2 F6 g" O6 l

' S& `3 N! V/ `# [}
7 n1 f' W, h+ t" ^" `  [

) z2 c, ^: a, w+ \# Y9 Wprivate:
/ {  Y) d) z; `7 i5 {/ a
, S7 ~- V; q2 x3 E  W+ @            typedef Tetris*(TetrisFactory::*PMA)();
; k$ d; H& h5 i" s% X* a8 ?; B  x! e2 N3 P) i9 W
std::map<
char,PMA> m_sel2TetrisMap;
  n4 M& S$ K8 ?* ], W8 R
$ i! f" C) h* ]
$ _9 N2 z" m. F9 V8 r
};
! l1 T; ?" ~! S4 l, g3 k% W/ j 8 }; A" a/ ], H. l
有兴趣的朋友可以下下来改改玩玩。1 n: t* A: n; f& i) m! d% g( {

, l( i' i9 M* }' MThat’s all!
6 b" r, X8 V9 q; H5 L/ @
, Q# O! j$ t) D( U% }9 i+ |Peter
8 ?3 d% V' I) T, L3 j! i$ ]" I  b/ h. b6 p% @  p
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入计匠网

×
您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-9-4 14:44 , Processed in 0.058819 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表