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

俄罗斯方块

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

7 K- g& c8 H1 \: o" X  Q/ n* [* }" } 1
8 h( n4 U) A5 P3 n: X完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
) F) W( D  X% C" m5 D) h$ e- U' h- x  n/ K$ l

! X+ X4 A- U# T$ k. P5 b7 U: WFactorycode如下:
! K' o* L4 d; I+ z* X
" g, `" I/ m2 v2 e' R' p* I5 \/*************************************2 j8 d6 Y+ L# C3 X+ ~- A
/ `+ F" p; u, |/ p2 Q
* author:hgf_starlovecpp@hotmail.com

5 x( x- H. r- D
0 N; k" g4 w7 n7 y' R# [. `* version:1.0
) [. {& C# K6 ^* j6 p
" t( j" L* w: M1 ^; }5 |
* description: just for fun
1 G. F  a6 u- [2 x

: z- b# N& L( w( ^7 k* todo: hard code exists need to fixed

: {' X9 B3 I, S4 X
9 }  k4 b& q0 V; x, X& H1 P! s" s**************************************/
0 ?, k9 O+ K. v3 a% E
& q$ F3 }+ d& Z- t, k2 _  e& z8 y
#pragma once
9 o% X( `  y4 y' |7 I8 b#include <map>
$ ]8 Y6 L) |, w0 k( e4 l& c#include "Tetris.h"
4 A2 \9 I- k# Z#include "OneTetris.h"5 x0 Z3 I& J& X& Y; o7 R
#include "TwoTetris.h"( [. F1 v* c/ a5 i2 V' \
#include "ThreeTetris.h"
" _* P' T- j5 T9 [/ j& L#include "FourTetris.h"2 t3 H8 A$ P! g  R( k
#include "FiveTetris.h"  J* h) N' X3 \
#include "SixTetris.h"
" f2 q6 C/ _8 C6 J* G/ X#include "SevenTetris.h". w* _- b7 X# }

; r; @7 j9 W: m( a, u8 C2 Bclass TetrisFactory& K) {. E) _$ z# [; ^
{
* a! C4 ]) H' |* o% h$ ~& @public:
1 |; }- u4 k* \! g6 c- p# \- H/ _" ~- ? % J3 c/ Z& M8 z$ ]/ L/ i8 l0 t8 `
2 o3 F. y& ~+ }. v
TetrisFactory(
void)
! d3 B/ q6 W( y2 L' y. X
0 g$ `! |, y# F- c7 r
{
7 i0 |4 U# Y" P% b$ [

& P% g0 k* w. V# p6 ^' [m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

' p# K. U# G. D% ?# q; B8 N/ g: S6 u
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

! H; {# W) ^: t3 o
- v1 H& k  ]4 bm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

" z7 Q0 `$ l0 c# N# f
" J" |+ C, K- t. V  _" }) Fm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
/ k  k8 x1 ^4 o7 Z# |

# R% w7 c' j. }" Y7 M( t" `8 im_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
! B2 j' Q" W5 Z6 I- V
' T" k1 j& X2 F0 j/ O8 k# |
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

. d1 j5 c7 g$ ]) p& h0 U. D, o2 m, k4 ?* N  f: W
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

8 |. r: `% K6 P7 X
  ?$ b# D" z" ~0 H3 x. y}
& E1 Z5 w0 {; R' r/ H  F
public:  T4 J! `7 j* h. ?6 w$ a
5 g3 C, q# R  [% Q
" G! U* x+ y0 I1 a) l2 Y+ R8 I
~TetrisFactory(
void)
0 h5 G' ?9 D& R6 |# H( ]
* X/ c& N3 M0 h, Z( g: V
{
% N- I, P. i3 ]6 d: R
) L1 _! H# {6 w; u- V- l
}
. X4 Q0 r8 T5 q- S& ?4 p1 K

* q. J6 Y' A# m  @1 A- ATetris* CreateTetris(
char sel)
3 s8 F- e+ ?- @, A/ E
$ q/ ~' U! `5 |# ^1 B" Z
{
) P$ A) x3 X# Z, Z9 N) l* q5 y, N
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
/ p& [1 k2 t3 E1 h$ V, ?' R
1 _0 M" {* Y# Z# N1 j" \2 o- H: c( J  [. S}

" ]4 P) M8 N% Q* Sprivate:% K- }$ b/ ^6 c1 A0 i
7 w/ t7 g( ~) M9 N4 B; ?. x
" R  t+ u$ o1 W  b* X" l
& J7 L. T0 I( q4 W6 w5 g9 g; S8 B
Tetris* CreateOneTetris()

) H* L9 ~; E, c8 E
( x0 b, `6 i4 E- l; e4 n2 h{
# q, m; ?6 F1 x1 d' c, s' {  p
                        static OneTetris tetris;
7 {/ a! \" e, f( U2 E' g: M" M0 A/ j
" n9 f5 l% ?0 f6 atetris.InitPos();

% d2 v* f$ ^; @1 ^3 g                        return & tetris;0 z: r* p. {( v0 |: ?. B' _7 P

9 b  f# c3 H7 Q1 q( U, u3 W}

$ B4 e; C5 a4 N! x2 i3 T) X, p# y% c6 u
& ]/ E. a7 x# V8 Y! s0 h2 A; H8 r/ M

: f+ y# K) ^/ ?+ F! x3 P2 MTetris* CreateTwoTetris()

2 ]. s6 o' c2 Z0 k. h# o$ |' n' l" s, x! j: l2 r7 u; X
{
* k& o- z, t7 ^. w. o8 K
                        static TwoTetris tetris;
- Z0 b9 Z$ y; y# t# w9 T) }' D" V% U* q5 L* N  r
tetris.InitPos();

1 u2 m0 |8 `% h) D, W% F                        return & tetris;* A" R. H4 O9 _% X
" I9 j; }& O2 X- v
}

+ ^$ x0 ?1 N5 j2 @: R
8 T! J! v, W0 [2 ^" A  ?5 M9 r
; y0 F! y6 Y  l4 I) K

1 ^$ \6 b% u4 {( q' G5 {2 P0 BTetris* CreateThreeTetris()

& I5 G; c& x$ Z: ~8 a& \) c
+ w1 ], t8 L2 I: m2 y{

  u8 _0 b' m1 g9 t: o. q; v                        static ThreeTetris tetris;& E; H" M* Q! @8 T6 j3 n
8 P5 Z' D6 q$ [
tetris.InitPos();

1 F  k$ k) ?: a% x- B8 V) }  y) Q- W
' p1 F! v+ |: v/ E/ c; n  U
. ?% Y3 r. _2 U
return & tetris;
1 y9 M+ [# v& e" _
" X  b/ ?. u0 u: n. U0 z
}

1 C2 W4 ]" G7 N. K" |! P# c: ?' ^- g
$ I5 U+ ?: o8 D* i/ _" T" g. f- S
; b/ V3 v0 `& B& n( t; i2 M" H
Tetris* CreateFourTetris()
+ ?6 q6 _* h8 m* S& T8 Y- e% Z9 o
8 r5 \. i4 T% ]+ p; v
{

, ?/ V% u3 P! ?) P6 q                        static FourTetris tetris;
4 i; S/ ~3 s4 s# z& X! M
5 \/ n3 h, r' y1 Gtetris.InitPos();
  }" U& ?* n; K6 R5 E  d, a# c  b% I
                        return & tetris;' _: ]+ C/ }$ @. P2 D

+ o. q1 I! F3 K9 d6 N) C; |" [$ j}
$ H  @! Y  P/ H7 ^

2 K) Q1 K- k3 S4 B0 m# F
5 t  [0 @/ r; |$ g! P" g0 G
1 ?2 O3 d0 y; m8 \& v
Tetris* CreateFiveTetris()
8 L; d% _5 n. i0 i5 M! }  z; s5 C' t  Y% C

/ q  }# z1 h2 T) G$ p: ^{
) b6 [4 u. f' \1 A$ S
                        static FiveTetris tetris;
% q5 n4 O7 j! b8 Y5 ?9 ~4 U3 P
3 k5 F5 _: w" K& J. l. {tetris.InitPos();

) Q: E  W' J; Q. b& a1 F                        return & tetris;
) q% j+ w+ K" T' J5 P, Q6 S* U
/ `) ~2 m) L7 x( n' ^" w, s( t}
, t; N" _6 x/ w+ ^& H
& {# j0 g8 ?' J, x3 i  ^7 `' r

; D8 W3 }; y4 b$ ]! ?Tetris* CreateSixTetris()
: x( `" b. y3 }  ^) w, a9 _8 @
8 \6 v( T/ k2 g% h# l! g9 w* V: A
{
! t. r, s3 I% ]1 G
                        static SixTetris tetris;% u' ?0 @! G# h) T  F

+ ]. [1 G1 d% X' F# vtetris.InitPos();
8 p0 I# |$ u  a! K0 n: N1 Q
                        return & tetris;) P  E# T- @5 Q& }5 Z
. T1 ^9 t9 T+ M& w0 u' g
}

9 C. d: ?, g1 @' b& z: p
- |( D6 Z1 t% K* G1 v( n
  n: G% r: d* j: S. s/ C1 W' R

) F* I' G, U, G. J# ^& o( `" `% `1 q- U6 I0 ?! b+ O$ p
Tetris* CreateSevenTetris()

1 S1 ]# T( M, j- n" y  x3 C( G  L6 x& j3 K  x9 n+ M" @% q) q
{
2 h8 ^: P' I3 s5 G0 W% r8 I% b
                        static SevenTetris tetris;
% |* Z+ a. V) ^: [& Y
. s" y# I) l9 F! Ptetris.InitPos();
7 n, X  U4 K2 V+ b6 B, A' U! J
                        return & tetris;& @* }; s7 K; d, c% f5 |& U9 z

  R# ~& f' v4 ?+ c+ A* Y0 h}

0 u4 g+ g+ G7 g( B7 V8 F* G 6 v, y8 `$ j' ~
private:' n/ ~5 T5 u/ x7 c0 K4 M5 x* d
4 e2 H' F; D0 W
            typedef Tetris*(TetrisFactory::*PMA)();0 \& t" Z9 {$ [! H7 p$ _2 }
: b) g. j4 p1 q
std::map<
char,PMA> m_sel2TetrisMap;
7 B5 K* r! B4 F( i( D$ u8 k% ^( z

# w% q1 I9 s2 v- V- B2 l
' [  J7 s* i3 z. z
};
+ n7 l, i! o1 m  O4 s - z5 ^/ f5 x+ y5 b, M' k3 {4 v
有兴趣的朋友可以下下来改改玩玩。
" j$ P" J; _; [2 p+ L
. |" u5 x! [$ B; [  H$ R% @That’s all!! j& G) G# w6 Q

/ M: U$ F( V" H4 P5 oPeter
  w' Q4 q- k7 i. d6 y( V$ H+ a7 G9 n3 \, N2 C1 ~/ L
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-7-22 05:02 , Processed in 0.400772 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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