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

俄罗斯方块

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

2 x% J! f: g% @, P. ]+ b 13 _! q3 l) h- h0 t& ]6 z
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
7 L( U3 m. O8 ^0 N1 i* D  A
9 E2 f# W8 [( \5 I0 Q6 R
4 O( |6 d* \# X/ k
Factorycode如下:# i# f1 f' K- n5 t* c3 c! ^
4 z! P2 e3 c9 J* c4 k
/*************************************
# K3 ?# @3 ^' V" n7 a* a5 m& y. j" }8 @# q; J* V; y
* author:hgf_starlovecpp@hotmail.com

8 |* R% U! s! `& K2 r+ Q) U2 s: V) D- u4 O2 G
* version:1.0

4 }6 ]6 Z1 q2 `+ {
% s' d& v. Z. `: y$ X5 Q3 P! `* description: just for fun

% i2 z* g0 U- T  J. S* I  f* A; r2 c  c- T2 \. V
* todo: hard code exists need to fixed

( P+ L8 u# w' v& p9 R+ k  W" a4 ?4 J. R" U. `- p
**************************************/

( T; q  g5 y+ i 6 [8 Z2 U# [7 P6 p
#pragma once6 A& [8 u! ^% u) y$ E' F+ G: z& z
#include <map>+ d/ r  |4 D: Q; z8 M
#include "Tetris.h"
- m( j7 k4 t' E' I% Y#include "OneTetris.h"
; w: n0 t8 j2 Z& Q+ M& i6 ?2 _3 w#include "TwoTetris.h"
1 J* k  L! u. X, q5 c2 F#include "ThreeTetris.h"
( Z5 o4 q* B8 f" V: m! i#include "FourTetris.h"
3 D5 c3 l+ K# V#include "FiveTetris.h"
( y+ J: U- S* G( d3 K7 U% X/ I' T#include "SixTetris.h") p$ x. S! R! q8 W/ ~
#include "SevenTetris.h"1 s3 M+ Q% }6 X6 d/ Z; B
# L# s5 {8 J: @; ^; @& u
class TetrisFactory
. t5 e) N  l+ ]" m' Z; V7 h{6 G9 J* n0 N5 A: r0 n
public:- ]7 T# O3 @2 ]( t, Y. {
  M6 _8 T* L  z

  q  i  L9 d  vTetrisFactory(
void)

. X' C, |; o: d6 y" O2 y# ]3 l0 F7 f' V3 }3 m9 M  L' O, B: m
{

& `6 i( v! w$ T5 e  t) [. s$ O# I& S* x$ L( R6 E
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
0 P: r# V& e; R% @& x: W4 r
+ s6 T0 u( M3 O) r$ ^8 e
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
9 S- {, N' R) |$ u, j/ A

3 u+ J7 d* W3 d% t$ L/ _m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
5 n4 k) F! w6 w
, A4 e8 a0 G* s; d. N5 `3 I* i# [
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
+ a* b0 D8 F- b: D; @" U

& M# M# h8 C/ p! |9 B& X$ \m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
, T. N5 W* ^& b9 M3 R' D

* J: X4 f" H/ C. @m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

' O2 r7 t3 O. D& c9 s3 J  S) }/ A+ s" j+ X. b
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
# B# z: w7 c! x0 I$ C, F
  y6 d2 v- F4 t9 F3 p3 m2 [
}

. Z  [0 S( R) L9 r+ m1 ~public:
8 E& @* z2 y# v1 ^7 E! J; t( W
: ]7 r( L) ~0 u; m) s+ o2 J- e/ t. E! ~0 L, {$ E
~TetrisFactory(
void)
$ ]) k1 D1 f3 }
( M8 t& g$ N/ K. m
{

/ z1 A/ f2 C8 ]2 `( C  D& V0 G$ |7 d
}
8 U8 q  I3 A0 V' c* v8 Y

3 b/ M7 `( Z+ p/ {# p1 lTetris* CreateTetris(
char sel)

+ m+ Q7 h) i1 s* S; U: o) m+ Q* M) J( z9 J, T  D# w4 m
{

2 E8 `: |3 w5 t, t8 s. F                        return (this->*(m_sel2TetrisMap.find(sel)->second))();3 C0 H: M( E4 a" f

) k; ~5 |0 E' l( r; K+ h7 ~}
8 ^) T) u0 `, T$ f: m
private:+ `. E* V  C4 Q3 u
9 G; S' B% T6 P, c4 d. o

( u4 ]$ _& J6 `- w- Q; X* `5 N5 g2 d7 Y
Tetris* CreateOneTetris()
; f) C0 r2 }3 k4 X  z2 E& X

: e* Y5 o! ~8 E{

( X) C  Z$ f+ U/ |                        static OneTetris tetris;$ ~- H; [4 Y$ p% v
8 M0 S& p! q9 H  R6 \  M
tetris.InitPos();
& j. p/ e. ^2 E/ \! p
                        return & tetris;( _. A) a5 s8 b

9 Q+ \+ H$ @% m5 |4 J5 ]% _}

0 V" y1 z/ h- w- }  D& x2 p4 x0 J  `6 n! _
. O9 q0 N9 C& C- P" T4 f' o5 N( d# }

9 j4 c, x) _( B+ UTetris* CreateTwoTetris()

/ W* J* |1 N: T1 D* K3 ?0 A* _; n
{

6 G  y) J: [* i# Q5 r                        static TwoTetris tetris;1 u8 E( W+ n; U/ s

' T" Q4 I, Y0 Ctetris.InitPos();

. q8 T3 U1 \& z, U) I% V( X$ F                        return & tetris;
! n. h& ^* g6 h: `, ?- d% g/ C+ y# V, C6 i, G. @
}

$ I- @  d5 y3 `4 }
8 j7 U/ ^2 p- ]; u, U

* \( a+ |, g% S6 k8 w* m6 w2 N& `# U. d. @. M% k
Tetris* CreateThreeTetris()
! [/ M' D: }5 p9 b) v

: D8 O! l* L* s" h2 E. `6 P7 r2 u{

- z- m) l' Y' m" I0 k3 d: S" H                        static ThreeTetris tetris;( m$ ?3 n2 g  N* j! y; b2 Y7 y" I

5 t: r' c( l$ d! m2 jtetris.InitPos();
9 k2 `5 e% H- t1 h. C) _
) G0 g5 P& n2 N! H6 {
/ S1 Y4 i' P7 r
return & tetris;
" E* |4 @/ s9 N
* W7 j; g* f# B8 o) F
}

  R. h1 z$ x/ v! z  R9 ^. i7 W
8 S  }" z7 A0 y6 T8 [

6 u- T5 b! E7 Q, r4 Q8 C% {4 {
* q) z. G' X0 p5 ~Tetris* CreateFourTetris()
; [# u, }; u4 y* Y

2 d# o) M% T9 A+ k0 Z3 a$ j3 q{
" f' |/ K9 A0 n: d" g
                        static FourTetris tetris;
  N0 w1 u% m! w0 l
! P4 a; _1 E" Xtetris.InitPos();
1 Z; Y: V, M, ~6 Y+ D+ l. T6 h
                        return & tetris;, a0 l$ D# j/ t% V

' w# D' T. w: q8 }9 K, ~( {: L}

4 |! p- p9 ~! C) ?" x/ B5 A7 @9 K& q9 H  t" E' M5 M0 ]

8 [0 {' M7 O' [9 g* o4 B) Y% y4 a7 [/ K* J; q8 [" f
Tetris* CreateFiveTetris()
* n# D4 U+ x3 |0 T* C
  `  }& T+ c  C5 X" `6 z3 n
{
! T: ]% g/ x5 n
                        static FiveTetris tetris;" A1 C# n( C1 y5 p1 F$ A  Q* K
( s# J5 N, h! h0 T
tetris.InitPos();

6 G' h2 C$ s% W                        return & tetris;
& i9 m3 Y0 I2 e3 Y# o" s' ?3 y/ \7 _1 E* \; w: c5 @& r* N
}

& B) c# `/ S! r& D
/ [: ~0 N- i3 b- m( H5 [
; Y% q4 J# e8 |# j) z$ |Tetris* CreateSixTetris()

) T4 F9 f9 g. E+ s  _( `( t9 W1 w5 Z- t4 Q6 Y
{

% v+ q' I( ^, l                        static SixTetris tetris;6 z5 i$ g& }& c" c$ b5 C  @

) ^& e/ U) Z: s# Z1 r" x" ~& F3 ptetris.InitPos();

& F9 y$ Z; N" c                        return & tetris;
6 L* V8 m; S$ P' T' i; C. J$ |- V) o- h) I2 ?; _
}

+ Y( k8 Y  ]8 ?4 ]3 C# S
* y! p1 K% w. y7 e2 k5 }1 `
& ^) ]& `2 p+ J$ O
! L* u% s  f: v7 D, d* K
" a- ?& x1 G- W9 N
Tetris* CreateSevenTetris()
' G& i+ O# E% W: O: j

, ~6 R1 ]' W& L  w7 m* j{
4 P- V! Z& f$ N" c4 C
                        static SevenTetris tetris;7 m) |7 o  {) w

: J( y: H/ R2 s3 Ptetris.InitPos();
( x- B# K# I+ v8 O
                        return & tetris;8 x; t' {* d4 ~) _9 b
% ?: y3 B  P, n% V9 |3 M
}

2 D! q; I* \* [3 ?8 O1 j- E: y   }5 i/ }0 Q. ]# A
private:
. i$ X9 w. U) N" g, V
& e2 k0 D% O& ?, i# z* L/ o            typedef Tetris*(TetrisFactory::*PMA)();$ c" t7 j2 k  ]

1 \' k* u' b$ Z7 Rstd::map<
char,PMA> m_sel2TetrisMap;

7 D/ v- ^- J! u$ ^' q/ x) v+ h9 @' L; t# s( W0 ?! s8 n

/ g4 H1 e+ M3 d};( I$ U$ {# ^7 S

* V9 D% _2 J# b$ e2 s  y. y" H6 M有兴趣的朋友可以下下来改改玩玩。9 ?0 h6 P: v$ ]# p! E

/ \6 ?! q" F* d# W6 E+ MThat’s all!# `0 F& \* |" F  k- f
0 g) w; K. ~( k  C
Peter ( O  w" S9 h7 f# y# u7 o

- D$ Y) `; ~6 K6 r[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-6-29 04:39 , Processed in 0.257907 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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