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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
2 r5 v$ l& Z7 D! w$ o4 \9 j! Q; N
1/ g1 q" x$ M" t; L2 F! h$ u
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:- Z2 X, O' N) f$ O" i

" ^# D" U  H: t4 F
4 D* z! i6 S/ m
Factorycode如下:; g5 A7 Z& v& `7 p' b

1 A9 }7 i4 A  v) V/*************************************
. Q5 f/ s. w* `$ n- N3 L' W
9 B# `- k8 F! [$ N, V- R" Q* author:hgf_starlovecpp@hotmail.com

: ?) u$ M& T% f$ z  D4 U( P. U  \" ^- z6 ~4 }
* version:1.0
& R% ]+ A& t( W9 q; R
: M2 {) o- w& d% C
* description: just for fun

! m) w, E( q5 Z- A  T3 K1 a$ J. e- O
2 W  T; n% E) U3 K! k" ~. E5 g* todo: hard code exists need to fixed

+ B- w, b$ |7 {2 ]# T( e0 I
, x9 n/ n0 h0 O1 I# ?4 {* b3 C) h**************************************/

, j# F( H2 D' u$ w; u  T$ Z" W
1 E: w* S8 i8 A& i; v#pragma once
2 i( c4 P; B" q. q4 N  C# Y, G5 {& o#include <map>& }7 r, b$ S; M
#include "Tetris.h"
. Z9 m7 \3 ]6 v3 w4 p& _#include "OneTetris.h"0 w0 e6 U9 o- k* U, x/ a# U5 R
#include "TwoTetris.h"$ x. ]5 ]3 R7 J% T  c. L3 ~
#include "ThreeTetris.h"
- M  T6 s8 h; i' e- Y# G9 i5 n! U#include "FourTetris.h"
, t  r& ]9 b& w: t" q0 z7 y. A#include "FiveTetris.h"
. J7 H: {3 _3 w* `0 i+ q; L2 P#include "SixTetris.h"
) E/ \1 f5 i! C" R#include "SevenTetris.h"
' \& I* H8 Z+ \( U5 E + v' w. ^2 y, N# |0 M4 l
class TetrisFactory
5 k% X+ V4 H8 f( Q{6 ~" \$ |  A2 `! N  {
public:8 o! s1 C: |2 S: T/ `

4 o$ \: V" Y' L& Z5 r
* ~. W  Y2 h7 kTetrisFactory(
void)

1 f/ Q4 k& h0 l9 K# j% s0 F4 U/ u5 y
{

4 B) A7 \; H, G% b9 k/ O
( ?' {* I8 v! J8 b7 j+ ?m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

  R. g8 ]# a5 d4 L3 `0 U+ x4 e, `7 K6 G1 i, p1 M7 i
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
0 V( d1 l  c7 J4 O1 o. r2 h
) B6 E+ K/ v% J: o; N/ q9 C
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
* d) u' `& w# e4 ^1 d) u# h# W

5 ^% w* ^" j( ^m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

6 N0 m! U1 ^2 `, d) L  n; D" J, O
% p) ^: _5 k- ?/ q" B1 e  ?' ]m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
- H& t' U6 n& B, E5 x

4 o3 m, @' _( t. K& t5 R  lm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
/ Z, g6 k2 W) T8 o

+ ?; s; ]5 k  Xm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

8 A: o9 ]4 c5 f3 P; F, F& d: B
0 X. g) }: b4 t4 Y4 E# z}
/ q' c. `4 @7 A* d
public:; k) Q' d. E( J, r1 h% D7 O9 m

* v% m% G2 m- C+ @4 F$ O( d7 B  q3 A9 ~7 x
~TetrisFactory(
void)
. ~3 f) r0 L; ^2 `& Z( R  @

, C. q! ]4 O; P$ [3 A% W  C{
  Z/ I( @1 Q5 z) Y* I& O4 [

5 O6 \, A7 f" ^) w}

% E5 D+ _2 A9 h" d! j* q2 L2 c* J4 q1 q& o* K5 ]( ?( v7 D, g
Tetris* CreateTetris(
char sel)

0 `% b1 }  j+ ]
* p& F0 k. e; `- k  n  m4 _{
9 A! p  E3 ?5 E1 G6 j. z
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();( ^' b+ U$ m# u6 ^& e) u3 c
) p. K6 T' K( b1 l- X* s8 a% ^3 u9 A
}
, m  q. U' W& J8 v# l; `
private:/ V' a$ p$ P- W3 q8 w+ K. i
4 V. z( T/ f- D% l, p, K

+ a2 ?8 q  A. r" e6 Y8 q7 r! u' v. q7 s, A/ O  ?+ }( d
Tetris* CreateOneTetris()
# m% i9 F: @0 R4 [1 F6 T
' a3 }. Z( d& k5 e
{
5 D" R$ s, x; e! S: z2 x
                        static OneTetris tetris;- N9 S0 L1 T2 l& [

5 b9 E  E4 L- G+ `! ~8 j* k1 `tetris.InitPos();
5 V, j3 D. j$ y' C9 N
                        return & tetris;% }3 Z. w2 C& ^$ E! h& _

7 y. k! V$ U6 g- ?! }}

1 R6 H1 h% S0 m; r) `8 X% u! t1 r+ d9 ?8 A

" g% n) m2 f* d9 ^) ]+ l0 c" p* w/ F2 a; i8 d
Tetris* CreateTwoTetris()

1 E; w, B8 x1 s& o- T6 n- ?' t+ p! v2 B8 S# B: i* {
{
% S% i' w, c# M( ]4 N5 v) v4 d
                        static TwoTetris tetris;7 p) }* o9 F( R) d/ X

3 A' j5 M0 u  k: z( f3 i/ x: g9 ctetris.InitPos();

1 H2 f) I# `' W& W                        return & tetris;
. K6 R/ l; P7 ?- G! L! o& N
6 Q4 A  Z9 u3 D0 `}

5 W7 N9 K9 a. \9 E, t# N/ ]' F2 R

& w) Y- u* a. |0 ~0 i$ l3 d  ^* G7 O; d- l, `
Tetris* CreateThreeTetris()

8 B. M% d/ g8 `; F: e# F- Z6 u( t. \6 K- I: M6 K9 e& Z' j  Z: f* S
{
: Y( k' J- \8 _# H' G8 J) J1 H6 {  r& g
                        static ThreeTetris tetris;
4 c+ C, r- m5 W( ~  Q2 B( z! T. F# x: o7 S( k
tetris.InitPos();

1 n/ A' y: O/ M4 F/ ]
( w9 h  z% _! m& Z, a3 D7 `* M6 C; t2 @% K$ \* v, c" q
return & tetris;

2 C( {, \! H: e5 t; U7 ~
! j- t3 [% ^1 T- p) ~}

' u+ i5 O% P: k* n- K/ }  b9 h- U+ S8 _; v' E3 G. p8 K5 i, w: q9 t
# c2 S- N) p/ C

, y7 r# P2 s" @. S" zTetris* CreateFourTetris()

. F6 u3 v" B* G8 ^7 |
+ w; k2 e8 l) D- P9 u6 \{

/ U( `, a9 a) s' V                        static FourTetris tetris;
& C: Q0 x  ]3 G& l2 P
3 ~% s' @" P. W3 Z6 F8 x& stetris.InitPos();

( P" Y5 V& P& _1 g7 g* j  H2 m                        return & tetris;6 W7 H4 [4 d# C- U% P5 p9 @

- b( `% k6 l& o  d6 Y- ^}
) x+ d0 a; M) w) y$ B8 l( b
2 Z" v* E2 F/ a4 O" d5 r- |

& b9 |. L) h' \' R/ O& ^1 t/ t
% v0 r4 q/ Q- O  KTetris* CreateFiveTetris()
+ J" \& X5 `% s+ f7 O( \

/ t6 Q$ q$ l& Q+ r1 O; }3 J9 `{

5 a5 @3 z: _4 P+ F) E' C* M: m                        static FiveTetris tetris;
. `& h/ Y! F/ Y
7 x6 n% q( t: m% [  ltetris.InitPos();

. W- o# k, C! ^' l) X- z                        return & tetris;5 A& |7 N; w* i

' u+ _: C' W) Z# J' {}

+ {7 h! ^2 ]0 V; J ( v. [% Q% }- m
- ]6 R6 F: y- z( L  ]' g; L
Tetris* CreateSixTetris()
* ]% D+ r& c0 k( e. G* j' c; o' x! @- c
, e( j/ K% G8 x3 N* M# b
{

. n8 T, J& r: z+ V) Y" q: T                        static SixTetris tetris;
! v4 Q, Z' C- O* Z8 l4 A; d6 v3 V( p! n& Y- ?; D5 E- B
tetris.InitPos();

3 \" Z5 y: @0 i1 O+ v5 W                        return & tetris;: ~7 M. \! G9 s4 P4 o

, M' g2 o& g9 i  J}
% n# J# u6 \. f. z4 L4 M0 @
( e9 D$ S& Q: j# B' G( N

7 R3 g9 W  T. G3 D
6 M9 L8 n) U& W/ h7 a& u! e

& |9 A+ @, R7 |' r: {* V1 zTetris* CreateSevenTetris()

0 z/ F' b1 W; `8 ^- ]; V. K% t& ?1 H
{
3 M% J  X8 ]; ~; K
                        static SevenTetris tetris;
9 Z2 \" E/ B3 {5 Z$ s
$ h* H( c' R5 utetris.InitPos();
) X! _' t0 T. j) V; y' b
                        return & tetris;
$ l' ^" p/ b6 Z+ v/ c! j% J  p  h. J* U' A7 w- R
}
* Z4 @9 X5 g* I( P8 w/ x
: O5 W- n7 \( O# U
private:% e& C& d  v% _4 X! s* N4 L* I9 ^
# ]% E; S1 y2 q' h; }  q  f
            typedef Tetris*(TetrisFactory::*PMA)();
9 F, j( O9 o3 \3 U2 S9 K/ x- {1 ?2 j
std::map<
char,PMA> m_sel2TetrisMap;

4 ^3 M% b% Y; A7 r* j
7 s' ^) e4 h; E$ e& X' ^" A2 b% |
' z5 {- ^1 p0 l
};
, f% f  f: i4 _- U* q1 _& I : F' D8 m; Q% X( F, K- G$ g- G
有兴趣的朋友可以下下来改改玩玩。' z% c$ N8 m: T1 g
7 }* Q/ v( q) \
That’s all!
3 f; e4 I$ ]* j - N! Z) m; V! M1 x& w3 e/ R
Peter : [" @/ x& X& j- p6 S8 }" \

' _) b5 W6 Q  G0 ][ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-5-19 12:08 , Processed in 0.022296 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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