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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
4 k. Q8 h6 g8 j! |
19 K7 f1 n& p0 K, r% |, s' i% z4 x
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:4 x# M; L3 d7 ?5 N9 Z. T7 q! x
3 y! W! P& Q1 Z) @& i
; _* m. Y* W) Z9 T
Factorycode如下:9 A7 K" ]$ z  X9 {6 X/ d
9 q' H  E" `8 M9 f2 e1 q8 Z0 h# i
/*************************************/ ^) O7 z/ y. F3 [( I8 ^9 r
- @% }4 |' p, N* P- L
* author:hgf_starlovecpp@hotmail.com

' f* G; [+ W, a1 ?. _
0 r9 i! r8 {  Q6 s5 g6 m9 |2 V* version:1.0
' M  x# K) y5 X3 ?- w6 U2 ]

9 @% C7 ~* \% g3 j0 e5 h( r* description: just for fun

& m3 `! k3 @& x
4 @5 h7 r" ^- L  b5 }* todo: hard code exists need to fixed
- Y" ^9 D# g1 A% U  S* }8 w0 y2 {

( I/ `# R' V) ^0 O, m* ]! W2 }**************************************/
' E; N1 v  t) k% O
$ O! e& B% ?; i1 e/ l
#pragma once
! t- J0 m$ T8 A2 ]+ C( g* I#include <map>6 u  e( A, @$ {, q$ ^- \
#include "Tetris.h"4 f8 j" p& [$ u5 @9 E
#include "OneTetris.h"# w3 E# V1 a3 E' i6 D
#include "TwoTetris.h"" V. ~9 A: h  @8 D
#include "ThreeTetris.h"
6 l. k' q5 e9 z# m( c#include "FourTetris.h"; E' Z. H" b& a0 O' E& F, c
#include "FiveTetris.h"/ T4 i8 ^( C: F4 e7 h3 l
#include "SixTetris.h"
2 j! t8 v* r# b; h1 ~$ y#include "SevenTetris.h"6 E' T7 ~4 G4 ^; \3 q& p. N4 ~
2 g9 U8 m& u4 O* H" z
class TetrisFactory( g' ]; V2 I0 ?' U  A
{( J- b! U3 {/ n9 s9 ^4 @- j
public:
2 L5 p( G8 K( w8 f* O* m 0 u# F) R% B1 ]8 ?

0 w* [! x8 C1 h1 sTetrisFactory(
void)

! U: A1 v6 L' Q# q9 J! D
$ z' E; {( ~) {: y{

" w/ T& S6 G, U, G! S- `3 i; H" B( h# M: c! C
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
" M7 z5 x' r; d. J

! ]) e9 V4 B. W+ K) C; Hm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
8 w$ C! M8 S2 s
6 l- J8 j) k9 c& r( F
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
, u. i# z+ @# p- g  l: j' b

$ D0 O7 F4 N! Y$ K) lm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

1 ?" K4 X) n1 A# x+ J. U3 @9 V+ h4 B# u
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
( ?1 n# Y" B' [2 S. i5 l5 l: ~/ m2 L  M
! x7 v0 R0 s# o% ]$ U3 v
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

2 O, G8 ^& b( K& t. L. b
" @5 X2 b) [" B/ z8 ^m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

/ e8 H, h5 B9 Q1 F$ O
& F* @: l7 T6 v) q}
: H; y6 d* V% ~6 K& k* m" R
public:
" H1 R  x/ W, e5 j$ w& u * ]9 |' l9 @) B5 _, r4 _* ?

* x) e) t7 ?5 E/ ~5 O~TetrisFactory(
void)
- N. w! p7 O3 t9 x8 ~( H4 m
( \8 g# n0 T7 Q& ]; Q& W
{
! M- w; J) r# c$ ^6 C3 n" @; d( [
$ i8 [% K; o  v, {+ q) v: H
}
* N  p6 V4 p, G9 A
( J: K7 F/ z' i. ~( G6 I- [
Tetris* CreateTetris(
char sel)

7 X$ h! V- H7 S- a  M) F/ t- q. p/ c3 x" D% w  @, `0 O$ A& f# u' a% i
{

$ v7 i  h7 E* h2 {1 k3 H                        return (this->*(m_sel2TetrisMap.find(sel)->second))();6 H3 J- m0 w9 T1 f, v
" \$ C. W  S1 S7 m) ?0 u+ G
}
6 j+ `1 |6 h4 {  T8 E+ D
private:% M$ F- {+ t/ `6 |5 v* y; C
2 K2 k7 Q& R5 E$ G+ o. n$ z# {

& }8 c+ [# j( f9 S) x
9 r3 `. i. l8 ?) ]Tetris* CreateOneTetris()

6 S: n  q( F! x7 W% F+ X8 z+ C2 ^4 Q3 U' X. K2 a
{

. c- g: {# n) S                        static OneTetris tetris;
" ]1 X& [( O' p$ h. X. Z2 S; N8 [
& b+ W, Z8 S- H' I8 F. p0 btetris.InitPos();

( [4 c- ]  [$ S. Y& c4 }                        return & tetris;0 U4 D3 Q$ n; M0 t& Z/ I/ ^

4 e! l' `7 c1 t4 N3 U}
" _" X! t5 ]' z* ~$ ^6 Z1 Z
+ L7 i' g3 P8 M6 ^2 `1 {

! A0 I9 U9 j* ?+ k9 m; W- i# ~9 t% V, R1 {2 g7 t
Tetris* CreateTwoTetris()

  h# ^# F; k/ T7 @. E3 S6 A5 l* Q  |  W9 \; t+ F! j
{
& Q" M/ f% `: i$ F
                        static TwoTetris tetris;1 R4 _( r+ t  r0 }4 a" C" b

( x; u% f6 {# M% b9 M) n( Ltetris.InitPos();
6 ?  s  a$ j/ _# \' |$ g9 {
                        return & tetris;
- {2 V6 [( i+ U6 H4 P* n
" @7 ]4 c8 \2 N, @4 }}
9 d" D& @4 Y3 ]- }- a: h

5 E( m/ I0 S. s

- l, b" v' q6 e+ f$ M" P3 V
8 q4 z/ L6 N0 M: o7 o- z" WTetris* CreateThreeTetris()
& _( K. R' h9 e: z0 S" l

5 Y; f  Z9 V' ~6 @) A* n{

4 d' w* Q$ c# O9 H/ Y4 z( _; u                        static ThreeTetris tetris;
& t: v, {: X( k$ \: ?7 ]+ I3 ?9 O# I+ p  O4 [; j
tetris.InitPos();

$ g3 ]/ }% P, N! J6 E7 W
- Q) o) C" S- E  p% ^' {. J1 i) }( V( ^4 w; [: v
return & tetris;

, r! i& K3 e" Q# l1 ^; `( i
  ^- {# Y" z0 b6 {9 |, Q9 t5 }}
5 \" z" d' w. b
' n% M$ C0 ^9 V& M( e
+ y+ u$ U3 ?) a2 g

$ |! @. g9 `& b- t  xTetris* CreateFourTetris()

1 t; s3 M4 E: X$ ~) Y8 y) |: e  c- p% f1 n1 d
{

. P2 G+ s5 }# k: _0 B                        static FourTetris tetris;
# m) B: Y& v  A0 }, V2 Z) @0 r2 `2 Z8 E" T; [
tetris.InitPos();
3 P" a( A) i9 J/ `7 @
                        return & tetris;" T0 }+ }  G# ]7 i& V! u+ _: P
' J8 @7 f+ x% G
}

/ u1 }- M* L9 j( a7 }7 d: s
/ M: X4 T! k# l
$ z- V) B  q' s6 t6 l

: l! e: s; _  BTetris* CreateFiveTetris()

* W; Y3 g2 p/ G. Y5 h* c: q# \! y# o$ {2 y( n' t5 M/ I
{

5 O. `9 H) p8 v5 X8 f                        static FiveTetris tetris;4 I) s5 c, p: Z, [2 l& p
/ [: g+ H0 K/ V: N$ v% W
tetris.InitPos();
2 l/ c3 x6 j6 V" [" j
                        return & tetris;' m  z7 y9 l& _2 [

+ l) \6 C" \3 }8 T5 f' Q/ H}
8 R& `( a/ p/ u% t" n# G5 {

! j( \6 _) T& n- E8 g; }
" ^7 G3 a3 m, \# K& V6 l% T0 s$ T) eTetris* CreateSixTetris()

/ h1 N" P8 f8 @* N
- z  B$ w# M/ ], e" l; n{
0 e1 t7 p% W# P5 h
                        static SixTetris tetris;: `( M5 P2 Q1 P+ ^6 P

4 c8 C  B7 A% C  a& N$ S5 q9 utetris.InitPos();

& b0 T" x1 h1 C1 b$ X                        return & tetris;& S! o! S9 w/ [% r
; K+ U: i3 o: d) M6 r
}
( W0 P7 b) R3 b* t8 r  l
, D. L& {$ d# q9 A3 r
  r0 t: ~: Q2 H- {1 G

4 q2 u; o3 v; S: |1 i6 W% s
# i- R  v5 }& O$ m6 f5 Y. HTetris* CreateSevenTetris()
% |  J5 V  F8 K1 K7 s9 a. @

5 e% T+ ?  a4 {1 j; Q{
8 X8 N1 J2 X: V" {  N
                        static SevenTetris tetris;3 e9 z0 R% h) g3 B

6 v; H+ C* f# p1 xtetris.InitPos();
% O9 _* A  E: g
                        return & tetris;4 ^2 D6 o$ P& f) @2 U
1 b6 l$ P/ Q) }& V, C- U& ^
}
/ G: M) X$ H* b& A, I1 n. u0 `
. r' i( W% {% U, q+ W, d% |
private:1 i) s  I  {  U& F3 K8 @9 U4 U7 p
  H  |2 H1 {' A* o* m5 ^
            typedef Tetris*(TetrisFactory::*PMA)();% H& M* i, ]5 C; B* c* j4 C

5 `8 Q, ~) k- u$ G  }8 z  Hstd::map<
char,PMA> m_sel2TetrisMap;
; Z2 \5 g# n( ]( v! k4 p7 T
, e$ c- K. w5 X7 c/ m4 T- O
8 u! T, d! K: a4 j5 \* m
};" s7 e- t3 s0 |8 m7 Z6 a7 d/ x
+ H5 L. Y$ u, ]- F* C( \0 A% x3 J
有兴趣的朋友可以下下来改改玩玩。  j, X3 b* h, H$ `: M( c
5 ?  x- F! q' V1 ]! Y
That’s all!
  g; f9 v+ u4 x  s5 |/ {
+ t& s$ V+ w% K5 `Peter 1 @$ A7 D# {; f- b0 \0 A
! U6 u8 {2 y4 y2 Q6 g0 R
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2025-4-5 00:30 , Processed in 0.044415 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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