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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
2 B7 q3 l3 Y- x9 y, M1 F
1# I3 w) r0 e, i$ w
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:& H! X3 p' ^* l0 ^7 o# ]
$ A/ e' r# T# Y5 ^
9 v9 @1 Y' Y3 H6 h2 F9 F
Factorycode如下:
% K  ]& T4 r/ }' ~; f 1 ~% s5 `- }+ Z' ?; k6 ]/ `
/*************************************
) k0 h0 G  \- V5 B3 ~: W; B0 A9 W' `: D2 L
* author:hgf_starlovecpp@hotmail.com
+ c' o3 `0 p) }0 L' v" y. u( n( Q3 s

  L* |! g8 x% d2 D0 {# _( E. t* version:1.0
* H# W# f+ W0 P9 v4 O8 {

" B6 T$ l/ }" F  A* description: just for fun

' ?7 Z1 A; [' T* @+ n# D2 ]5 S% O" I% s5 D! |0 ]
* todo: hard code exists need to fixed

" z- v6 V3 t9 w" u4 z9 Y$ z+ e* D& y; t  G4 q1 K' u2 C
**************************************/

8 I; `- ^* ^) |/ ?8 s2 K- i6 v; U" e * X3 Z+ ~) B* ^* Y0 R9 ~7 Y
#pragma once
; b. C* X# x- v- {0 m#include <map>
: j" q/ K+ w% |5 z& T4 N; `#include "Tetris.h"5 a' `+ J5 i# s
#include "OneTetris.h"! r& M2 p$ W8 m; I
#include "TwoTetris.h"0 O: C. B, A  Z8 U  X5 I
#include "ThreeTetris.h"
8 [& R  ~! Z6 k" `#include "FourTetris.h"
. ]7 w4 \4 k, ~$ E- t# T' E7 e#include "FiveTetris.h"
. F* i" k' T! C5 _, L$ A+ s0 F#include "SixTetris.h"4 D2 d4 a9 A/ ^) G( m
#include "SevenTetris.h"7 M, f$ M6 `7 i! Y% U4 g  c

  u' @1 p, m. X- Nclass TetrisFactory
5 b' f0 e! p' U0 Q{
! k/ G$ o# S; b0 H6 j! `) qpublic:% X' u; ]7 s2 g
2 d* {& n6 D) B1 M+ i/ }
4 R& e( ^. [: B0 X( B
TetrisFactory(
void)
. f7 N5 D. v4 U% p
% m$ H0 M2 m! F: O
{

/ _# j9 `6 O( ]8 Z1 z% @8 s
7 R' u" }" |- P. {: K2 h' [m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

, e$ C, m& R3 _( b5 T1 n3 {! _
! _( c% q, v# H" \) Vm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

# L6 }% \6 P3 p/ t9 H5 c1 R9 L; R& J6 N5 K
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

$ a1 f3 w# ^% B1 f; b/ r7 O; _$ _$ o1 G
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

/ |& L+ e+ g# U) [/ m: L( x7 C/ t8 v, X* N+ a
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
% s: ^% K, o  r2 B4 t, k' Q
8 J5 ?& @- O' m0 v# ~
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
1 v6 A% L8 \$ o

$ \3 M) d* X0 rm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

  W) g: q, b3 @( r# e
0 w" o! I- M9 g# F3 b& W( x}
* y, |2 z1 w6 X6 W; S1 i/ x
public:! c5 z# |; X& d

& V  Y- u0 @. K8 E2 N# O% i0 {/ g/ P, K6 s0 `* f
~TetrisFactory(
void)
8 y  {3 F" P8 L6 b
1 R2 k# V! z: r) _4 ?% k; B- x
{
  @1 b+ ~- j$ Y- U! T! \& W: c
# Z5 R5 R  t* e8 F8 }
}
" [1 \; g, [, x0 j& O/ ]0 I

. [, M, m. V0 @; nTetris* CreateTetris(
char sel)
( a. e( g. P7 M6 Y3 H
0 T7 I& ?5 s' w' r4 ]- [9 k4 ]- V
{
, j  |. |! s) l( e
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
( L5 B8 d3 m# h
* K# B  h3 G$ J( \# w/ x}

# @! h0 ~2 G0 m% s3 r4 [# W4 n3 Jprivate:$ H1 P" L$ ?8 {1 a0 `; V( U
8 I6 i/ p* A) a& S7 w7 v/ c) h

4 y3 n% Z6 `, l" |' D5 w6 W5 K5 b7 g
8 s5 r* J6 P% h2 E7 D: NTetris* CreateOneTetris()

; g& l! R# r$ d: z5 I% F1 U' q, N# A0 W( P1 p
{

3 R+ `& C! P! C  S' p                        static OneTetris tetris;: r/ W" D8 }/ }. Z7 B! ?8 w

! b9 f# x) y" \- L* r5 Q& A) [( G/ ?tetris.InitPos();

/ _* N. s3 t" O: s! {                        return & tetris;: ~. ]" L  t* V4 j
5 u! [1 h: U% b6 e" _+ p
}

' L+ j& z' Q* N3 Z. ]6 k& N# j# J% B9 i
( H3 L4 x0 p! |7 B, Q2 @% h* {
7 o2 d+ w( ^( w# K. C0 N

" a. M$ n5 K" C2 c1 |Tetris* CreateTwoTetris()
- B! D% j7 E2 I5 A
" l, t0 x2 x6 K; I+ s, U# j$ n$ e
{

# ~( a' M5 z9 N% m: c                        static TwoTetris tetris;
. N( H  d, \! O( v8 Y5 V5 c
5 \, C: R  e  J- `+ |1 J; X; {tetris.InitPos();

7 E+ y8 ~. L2 a% U' D, m$ \  i                        return & tetris;9 [  K3 e# `! j9 Z1 ~

2 G: z% E7 g; ~. P}
  U0 J$ [# @: r' U+ S, d$ D
. \* A4 Q2 J8 d1 N/ ?( N

. B) j0 S5 Z% V$ s# X( i6 E  ^# s- {: o0 `5 x
Tetris* CreateThreeTetris()

& }9 V+ l3 I" U
8 E/ w, ~' ]2 w! L" J* Z{

/ g) }# A* U/ `: m# u                        static ThreeTetris tetris;* w& Y" r2 j2 S/ d
3 f3 D3 A8 G7 A4 Y
tetris.InitPos();
6 t! q! v2 `. K; m" C
' Q6 b, Y1 X5 h% t) F

2 [1 Q" i: ?7 f& r
return & tetris;
0 C7 J! M2 j( @0 W" c/ e, l

6 ^  \- e7 f* m& U$ ?" @* A5 X  i0 ^}

. H+ t8 p( r. b1 g0 p' P( c# ~4 _
  i4 J; \- n& `* t2 {

7 ]) D: z: `' o- ^7 f: n
  j" Q+ m5 A% eTetris* CreateFourTetris()
' q. P, y2 k" a  s8 q5 _0 Q* O

' `: z- J! M6 f1 |3 Z{
4 I6 j8 K0 D$ {/ J/ y, U
                        static FourTetris tetris;7 G4 Y0 d% ]/ h& ~" k: W5 p
0 r# V& ]% B. V8 G
tetris.InitPos();
7 ?9 k" U- u/ e+ h# d0 N* p' V9 T
                        return & tetris;
9 s+ f  o8 r% U5 u6 I$ {, z
2 e" |/ O) j8 ~. e}
7 G5 ?5 W: @* D$ d/ ]

, A7 ^1 o" T* m( V" P
6 I& D% m0 M: `+ }: `) x0 l0 r
2 @2 G  l* L4 z# W8 L+ b
Tetris* CreateFiveTetris()
6 F% A* a8 z, n, V1 {/ l
7 y' y% T7 F5 t2 K4 W) K5 M
{

' a5 w. o8 U" i: `0 T! u1 e                        static FiveTetris tetris;6 d7 W- Q* G0 Y. G' N
5 T/ A/ A# O9 n; j& t8 z9 T: T* c% H
tetris.InitPos();
* R6 O& e7 s. r' i
                        return & tetris;' T7 A/ X4 X+ [
# H/ p0 |7 q( P) ^  h, [
}
0 G% s' U/ V6 q8 f1 ^8 [& v5 x9 a

2 a! }4 {1 d' f2 A$ l3 B  x  l' S4 N, O* r3 E1 U
Tetris* CreateSixTetris()

% h. x) I! G/ u$ t3 k6 A" Q4 `( m' x( H- N
{

9 i* {2 A% ~" ^+ ^! }+ O                        static SixTetris tetris;% ^8 p' F$ t+ Z9 L0 R

6 i+ ?) W( I7 k8 c" P8 j/ W* Y+ @& ttetris.InitPos();
0 S  ]: L  u; _" Q
                        return & tetris;
- N) u+ I" f- R5 G2 }0 A
) \5 c: K& t. A& w& H0 C3 J}

. z* s5 G1 I2 D) `5 [+ l0 |9 |
8 p+ n$ K, T( K) v" H' ~) C( v9 g' b* w) W: g: C  C( k' C. n

- M% u) T( n9 y, D7 G
/ N& c& K7 u7 g; RTetris* CreateSevenTetris()
1 D/ R6 q, m! n( j
% u# z4 ~, D8 G* `) q( P
{

7 |1 O. a( M! H" A  |                        static SevenTetris tetris;" B2 ]1 O  {! i7 A# m
4 J( p. k2 b( n( {( y
tetris.InitPos();

; {; b! d. _+ S. q- g                        return & tetris;
% k1 ?! F5 i/ P
# j6 x- {* n, X( K$ J/ n1 M( S# @+ M/ q}

* `1 N/ I! T- x8 r' F  \ 7 J& ]% p" S! L: }
private:
* x/ f1 T. M- R7 m: L' A6 }/ |" K3 s % a  a: z6 s" y( r' }4 I6 t
            typedef Tetris*(TetrisFactory::*PMA)();& E% ^2 Y3 M$ ?# A; b

) O: E8 G6 S7 o) v' I; T! f2 Ustd::map<
char,PMA> m_sel2TetrisMap;

* g+ W1 A7 e2 m- O
" E$ [* i% M9 Q
0 ~8 ~1 ^8 o) M, t" w
};
( C! @! Y. N! n4 d: K- u. l5 v5 o
" o7 |9 ]) i( S' l3 k. P" |5 G5 u* _有兴趣的朋友可以下下来改改玩玩。& l3 H8 `1 Z5 z4 @

0 z. B$ S* z- w# j, dThat’s all!5 @( i5 O  a+ F( |: ?

6 t2 ?9 j8 \- a' q* ^" M2 x+ rPeter 2 d9 g8 p% @6 V5 c
. ?; G% K( [. {4 q! [. C& a
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-7-19 13:36 , Processed in 0.039895 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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