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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:

/ h) _, e! I0 W& t; Y/ @! A! S图 10 j4 k& q; d0 o( w( m8 `+ C, K
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:  M6 E3 u' B8 v& h' r! _

& h* z, u6 ~7 e8 b
8 K: M5 m, p7 H" I) h( t2 |' e
Factory的code如下:
5 S% [. U8 B- J6 k
5 q5 n- x& A: M2 |/*************************************
7 G/ X" Y3 `* ]; S) b4 K4 l1 D9 X( B6 W' |7 a: c9 h' S
* author:hgf_starlovecpp@hotmail.com
+ N3 E9 L9 ^# f$ R
; [6 s# A# T: R4 D% C+ Q4 `
* version:1.0

. `2 g0 Z: j9 M% H: U5 m  T
9 u( Z, a3 u$ W! ?2 ^6 Q, ?* description: just for fun

* P$ `% O) q6 z% o5 K1 R% X2 e% G1 U. T* y
* todo: hard code exists need to fixed

0 P7 [7 {. X! }( G6 L* ]2 s; ]/ u8 \0 b
**************************************/
8 A8 k+ ~% d; A" K+ ~# U  m: i+ [- q! Y

3 z; A1 q1 M8 ?/ O( o' H1 y#pragma once6 O+ q8 ?2 u& K! q. G
#include <map>8 d7 V0 l. h- e
#include "Tetris.h"
- w+ S5 K7 z7 |% F0 j) _6 }#include "OneTetris.h"# O# W  X$ `( S, _$ R/ L" P. _0 X
#include "TwoTetris.h"
/ p  E' I' q- L2 u7 e" v#include "ThreeTetris.h"
$ `4 F4 {& i: f) X#include "FourTetris.h"
+ F, K4 @4 z! c& o, u#include "FiveTetris.h"+ c: T& b/ ]$ D2 L- @
#include "SixTetris.h"
7 L3 @8 K' ~! A9 d7 ~8 [3 y' y7 E#include "SevenTetris.h"
% L% X# H# o/ z% v- r
* O8 w6 H  c- L9 ~( S. J# Z8 {class TetrisFactory! b1 z, b3 n6 [! W
{
+ K& e5 [6 J- g& xpublic:
  F% g1 d% Y6 L  M: T/ w : e. i5 w, Z! ^5 y
  X- ^1 L: K' i5 @8 G+ k) d
TetrisFactory(
void)
; d& y- B0 C5 o+ _% B. O$ X( Z
" S2 v8 f/ n, y+ q* q3 o3 O$ v0 S
{

& w: f! a/ V1 O: t2 K6 m& R# A1 N  Q+ S, e( }
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

3 H2 H: x# [3 L" ^8 A+ n3 c; \& ~5 j  t2 C9 I# O
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

" V4 i$ c5 n9 P0 v6 ]# I- n& J1 W: B, {$ G2 Q! L  ]. d( U
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

- {& L+ h; T3 b9 S( `7 a' h; Q! B: V2 d9 I7 Z
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

% E, }6 L+ v0 n+ I* p
9 G, i+ F- c3 P4 S( _m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

" i# j3 v2 u4 l& p
5 y6 I5 L0 x; c% l. a8 @6 Ym_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

0 ?% m( n# G1 a/ N# Z/ g8 X0 m9 P1 z- ~$ K( u+ a8 q
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
+ M' l, }4 j( k; a' k
7 z/ p4 @6 t2 Q9 ]5 T" X# v
}
8 a% ?6 Q. m# C" ?6 P; Y
public:/ ^2 |( e8 O9 ~# g

& F( _) @% V) h8 V
: S! }9 t5 K# @~TetrisFactory(
void)

" P+ G0 q5 P$ e9 D9 m8 H- W0 \* A, s" a3 P" @# n
{
! }& [1 R6 v3 A+ ]: C

7 |$ a  [4 _% t9 ~- Y}
/ B' P6 b: D, \/ i
! \; E' Q6 j8 s
Tetris* CreateTetris(
char sel)
) I. f, t4 P1 D5 @+ M- |& w$ r$ D

0 k9 C+ y3 V+ z/ T6 O: H+ L! F{
# _* W; V+ L9 S$ i7 h; h
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();( u( C8 l( a1 i: y( I: X4 t
: K2 i: U3 I: v2 N/ g5 `% e5 @! ]
}
. }% i9 q8 Z- H. w3 {$ @( c2 G
private:6 |6 C; g" s6 }* l+ m2 x% n) l
2 r4 {+ Z/ i4 ~; k0 a/ J

/ D4 x+ \+ S3 k% T  g* ^' i- @
3 m4 w7 T7 B- g3 ETetris* CreateOneTetris()

+ ~5 n4 Q" d1 O* G' |3 v& t" D1 V; g, c, a. B3 S/ M* k) d' I
{

, [  ^$ |* L: j- Q' y; |                        static OneTetris tetris;
/ c% k# J9 ~7 C. x6 }& H4 ~) M2 o1 ]5 p- y
tetris.InitPos();
6 h! u: ~) [$ O( z1 b& X+ \/ S. ]1 I
                        return & tetris;/ |: R0 E# T4 ]* ?& ]

: N3 R: c/ m1 I" O, O+ p; M}

9 ?0 ?6 u: v0 b0 I4 S! t2 X1 u+ q. M0 K4 J5 ^
2 C0 ~8 t! Y& b4 ?( D  [

1 ^; P- [6 I1 B' \# f" ]( G+ e: LTetris* CreateTwoTetris()
" o! D# g+ Y3 M2 a8 X  j

1 a8 T3 x" _; x) e{

3 V) I, q: V, Y+ p                        static TwoTetris tetris;8 O/ b, s: F% n  w6 J/ t
  M. P' k% o7 T. J  F
tetris.InitPos();

; E* }6 r- |4 u6 O                        return & tetris;2 A/ }9 d! I! O8 n5 t4 P( N9 W
8 C0 @" q4 [/ L0 K1 ~$ v
}

9 N8 ?# ^# A6 s) }3 i+ k5 p
# u# A+ K- ]0 b0 d

0 R, x6 s; B) Y/ ~7 x  K: i. e  n+ d5 Q# C2 p; s- A
Tetris* CreateThreeTetris()
- R6 e) Q, R& X  o5 R/ M
4 M$ |% R6 n3 s' {
{

/ W! B; v0 i- {. Z& U2 v' Q                        static ThreeTetris tetris;
  v8 ]7 U( O! @; M% P0 j6 k$ {9 E
" A5 a1 u+ `5 E1 t( Y1 @tetris.InitPos();

3 q  r7 i' I6 G
/ H+ h0 C. N; u- d' |
* L7 J6 Z. W- g& S+ V
return & tetris;
) d7 q: g  p% Y8 X0 m
( }2 g, p* y; X$ s
}

2 L& n7 @; y& s7 @/ N! u! Z; ~
- s* Z# W$ G: |" r" d2 T8 z  C* m/ ^
: _; N- u- W  x% f, i

2 E6 Q' M( x" F. pTetris* CreateFourTetris()
1 U1 n0 V4 A4 w

" B4 Z8 @& y3 {" e' P& c{

  U! o' ]' I, |8 s) B                        static FourTetris tetris;* m) ^7 w/ `# Z/ l9 S
0 F7 \$ t3 ?+ i! b* s
tetris.InitPos();
. }* R1 ~+ P' [% b) k6 F$ V- D2 b2 Z. P
                        return & tetris;
4 h0 K) N: C0 t( l9 f6 H- z5 ?" `$ n1 L8 E: f4 C5 _
}

9 ]) I( R% e6 v( s7 M4 t- q# F% @/ C; w6 m3 z$ \4 F9 }

: L# y. i6 d1 {5 T1 Q- h- C
1 G$ I8 W! c1 f5 k' u- Z' O7 Y0 ETetris* CreateFiveTetris()
& [6 X: e2 s  W
( w; y/ Y) \: ?" @! o/ R
{
+ p( h; u7 h% E9 \3 k# }( Y7 _; Y
                        static FiveTetris tetris;5 t4 W& _8 q$ y9 H& k
) O. Y2 ~5 g! U; o* O) ?4 _+ O
tetris.InitPos();

& V' i1 w7 c0 R# y* c; v5 U                        return & tetris;5 w. f  X  R4 @

3 N+ M0 Z* q  G( M: ^& M& r+ w}

$ O% E# n% F) S( s$ ?" P( I& p, r
0 h3 l6 Y- [/ y' a, T0 y; ^2 S
7 a: n  x, x( K5 lTetris* CreateSixTetris()

" S* n3 Y( O3 ?0 R3 S6 B
8 e: Y# i6 Y1 e+ g{
6 q' n8 @- |5 N+ K
                        static SixTetris tetris;
: ?7 j! f/ @- T4 W
# `: D) R  H' r3 G0 r& mtetris.InitPos();

" c% E; v  P' b9 t4 ]                        return & tetris;
0 u# ]' _9 F# I& _
# r* N+ G% G5 B8 Y; f}
# R) u' ^9 f! J. M! B% h
! v& P4 @) Z+ n9 l
' C, K" y5 P, ^* u  _
+ `$ f+ A5 i8 k
! m2 k, L# b& F9 b
Tetris* CreateSevenTetris()

; j, A+ V2 z7 [- a6 \& h" z+ ~4 p8 o& D3 j. p& I/ M; m6 e8 g
{

) n( {6 G, ^3 x                        static SevenTetris tetris;( X' w/ w+ N* ~& @( y% }, x; a
0 t* k$ L& ?: P. p% y& ~
tetris.InitPos();

: Q; s, d- _# |) a6 B* a                        return & tetris;
( v; H- ]; g4 V) {0 f
+ b7 v9 F" M8 \+ |+ C1 e* J}

, z9 T: T5 V4 \2 \: t
1 b6 h6 s: D' X8 e6 T: R# Bprivate:
- G" ]: v0 z7 o, y
: A- d- p+ X6 [+ T% F4 G0 \! Q            typedef Tetris*(TetrisFactory::*PMA)();& k% |) R8 C7 o: L; O6 s6 S4 X

- i. `  P+ ?6 u  Z, v, U* Mstd::map<
char,PMA> m_sel2TetrisMap;
! {! ~( {: o) q: y5 f7 P

* |" C- C/ V2 Y3 o3 u- r9 ^. |

9 z; k1 i8 p& y, k};3 ?8 _# _8 Z5 C! Y3 B1 K; I( b
# ~' ]" u; l& e: _" \: k8 n
有兴趣的朋友可以下下来改改玩玩。
* s* C$ m  Z1 Y* g8 M + a/ s/ B& E8 t8 S6 S: e3 ]# }
That’s all!$ K  N+ i& B1 y' B+ X' [
% N. N8 V$ u7 R, P; S) |, X
Peter
9 W  a$ Z! x( `* X( u
0 f0 m5 E8 i: s  f! w$ h1 J) L4 a6 v" F[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-10-20 10:22 , Processed in 0.369204 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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