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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
& }8 o5 [% N. @+ y
1
. V; n4 ]0 R+ h1 A; W$ ]: }完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
: d+ g4 |3 R' n" |6 m1 P$ R" y6 [: P9 z3 }1 l  r3 E+ ?& d0 `
5 e6 a4 W% D6 m5 q3 K4 P
Factorycode如下:
2 D8 ~5 w' ~. N# y- u0 _  }
* ?% ?! W  b7 j9 G' y, E/*************************************+ ~, l8 W' r* ]0 {( S  q/ T. J5 Q

! H1 Q0 I& i4 P* author:hgf_starlovecpp@hotmail.com
6 @, l$ k/ n) ^7 h7 d" j( P( s

% v. F( F8 D; v- p( }! z* D* J* version:1.0

6 f8 e3 l6 K) D6 p) v5 t
% W8 N  `, Y1 v0 l' x$ T* description: just for fun
5 [6 O' V' J; y; n6 b& N

' {# J" ~9 R/ w; R* todo: hard code exists need to fixed
8 l8 D& E* c9 v5 h
& O; \& b: ?2 a  e1 b  g
**************************************/
/ C+ q& N9 K- S7 h

4 ?' `: |3 |- \- a#pragma once
% u  n% ]8 r' W( s* _6 a7 S#include <map>
# v! x2 E9 E  x3 y#include "Tetris.h". {1 R4 y! Y* a, B
#include "OneTetris.h"  i( ^. R: i4 [
#include "TwoTetris.h"1 U8 k1 _1 M4 A- R/ t
#include "ThreeTetris.h". O: ^0 O' S) S' s# b9 x
#include "FourTetris.h"
" t7 [5 G! l; U0 j8 ?8 e+ K" o#include "FiveTetris.h"
* ]" j& B1 L) M8 g$ t; o1 j- C#include "SixTetris.h"
, b, M8 H" C( Y#include "SevenTetris.h"
) u9 K" E- t# i; }
3 S+ L" ~' J/ m' p, a  }$ a: \/ Zclass TetrisFactory
1 |0 P! A  Z+ q0 n# s# F6 B6 @; ~8 m; A: v{4 Y9 v* ~2 _) E
public:
3 ^( G7 J- n: N: H
/ N7 Q+ @* P% m8 q- y! Q
) m' _( i: h) Z: ~% ?2 C# }* I& eTetrisFactory(
void)

. h* Y3 }3 [) C# {, Z/ n+ D& c3 z' K1 a4 ^0 s# l* A( M# {- y5 q
{
4 K( H) e/ c% I

1 N) u+ J! b0 T& [m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
: c) ^; ^% r7 v5 _2 ]
: t7 r/ E9 _/ }9 [
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

3 G0 X) G' U+ l. L" ?
2 }7 l2 s0 L$ y0 s2 `m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
0 b; o( E, e* D+ R

3 Y8 D# v7 L9 |m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
8 {3 b- T6 k4 a; D

4 G2 M$ W! M+ r  f4 B  Z# ^- fm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
7 q+ b9 X8 y8 @* y
/ w0 x9 J' b0 F  Z* C
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

  I# |. `0 n3 |1 y' T: S$ t. Q# F5 A
7 y! k9 l0 k+ _6 B9 tm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

1 ~) j" c+ m# w4 X
4 k. V; f. Z3 g0 |3 s. c}
2 d. _& k( n0 _& j, ]
public:
+ O5 h, ~, X( `: O( r: M4 W5 A2 R
+ l0 B3 s2 O2 y% V
$ }3 S- p, i+ s$ E~TetrisFactory(
void)

) J# G' i' S( e5 d8 ~  A9 S4 b
2 o' g& _0 W0 R2 T4 s" P6 @$ g{

) H+ ]) `& \. R$ t! [2 q& T9 R+ S. t0 x
}
' X: m6 X- e* q& {/ W

6 e3 N6 d- V, f$ r5 K8 {Tetris* CreateTetris(
char sel)
7 ]' c& O( F, T5 X( S
* P. @' V! w% A! w8 e. a
{

6 t' Q9 r6 v4 E0 f6 O6 K2 P3 s                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
* }# e  [0 d/ ~- g, s! B6 D) U) g  h, t* I$ M7 l# X+ H
}

) c5 ^; x" S. |: w: M9 i& m- r- _private:
( H8 @4 T. u' k0 \: j- P( v
3 @! C/ o3 o  t9 b

  {5 Y$ ?" x( x+ B( J9 O" q9 T+ G6 |$ u% Y8 Q
Tetris* CreateOneTetris()

' s+ \+ k* M" Z' r2 q( \9 d) M, ^% y$ i( Q
{
8 y  _; G, a+ w. r
                        static OneTetris tetris;% G0 v& {0 m! i3 L  S2 ^* |( h
7 h% E  I  n1 ?4 o% d! X
tetris.InitPos();
6 S. k: c* Z$ R* Z
                        return & tetris;# w, s6 N6 @( @, }: {1 B
! m! y. E) W1 E
}

$ l6 w9 ~) ]0 U, P: t  F# d; {; W0 D+ c8 i% `

' e. G7 E7 z( E4 c+ o" W" W  X7 r/ h. h6 k# I/ J: ~# Y
Tetris* CreateTwoTetris()
7 \0 \3 I9 V8 o# i6 t: l

+ q0 @3 Y, t, ]4 j$ y: k{

6 b) Y9 R, Z- X9 |" N                        static TwoTetris tetris;
1 `8 W+ e* u( v- z% D
7 E5 a/ [  u7 F0 H3 ^. rtetris.InitPos();

4 |1 U  U) A2 N" a# a8 s/ k                        return & tetris;, [" B6 \  K$ f: p2 [! W% o( I
' _" D5 E0 Q; m) h) W
}

* |% W1 `+ y! T: A/ y9 v. {- N- R9 p: R9 x, s  h! P

$ O' B' w6 s" C1 K
8 g6 V9 e# \, e$ ?5 MTetris* CreateThreeTetris()

* R. |4 `8 J; s5 J$ s) D' W( Q( \- @2 B3 }
{
/ W) P& B1 V1 z
                        static ThreeTetris tetris;- @) o3 A  G7 ?5 A* R6 V# F

" S: h! J5 r4 F8 x$ d6 J% m4 Htetris.InitPos();

" r, ~# Y* e& ~: H. n( U
, {* x8 Z$ k# U6 P( T
4 I9 v: O+ P$ B+ x1 B! E
return & tetris;

! [) P. w+ Z, s1 O1 X0 {- }* V5 \  F, H' }) j3 o
}

( e+ m, i3 D% N7 z6 i, q0 m3 e+ e1 \' f* `3 ~

+ B  N) l9 T% c. a$ v- I" b- y- M) b/ R+ @& S3 _
Tetris* CreateFourTetris()
# G- x2 y% h' _. U- M

( S( J! f- H! B" i{

0 d- ^6 j) v% O+ p                        static FourTetris tetris;- H8 a. }$ K* ~, a% B
4 G6 S9 b8 Z5 W4 }
tetris.InitPos();

7 P% M5 z; h" d; x4 ^! Y0 m                        return & tetris;8 ~: Q( y6 c. I
+ k  Z  u* K9 U" V% }7 K
}

& W8 F+ }2 h9 b+ M4 _: f# B' y0 z6 i" I* [4 x8 Q

/ }0 `# t. M# Y8 `0 r+ j
  W# V4 o% ]) z1 P$ T' {Tetris* CreateFiveTetris()
7 y% C- x9 u# g

" j. q6 _& f( o4 Z* m3 s7 n3 H/ [{
' h: M  a" _$ Y
                        static FiveTetris tetris;
) Y+ _: S* g; B3 h' N' W
, o4 W! N1 G0 l% m' S/ _' V* W7 {tetris.InitPos();
+ h& V- `+ K- x' O) K0 s
                        return & tetris;- {1 [4 F7 N4 y& q
0 D$ B, {( ]& ~! p$ `
}
5 H) ]+ E4 W( `, E. Y/ i
) [$ W2 b4 Q2 o, @$ W1 o( y/ ?! {+ W
  R2 M6 R- b' i
Tetris* CreateSixTetris()

) N" D5 }2 Q7 P/ K  @+ Z1 w' l( {+ \* P7 u0 Q# R  N- v( l
{
! j% N4 m9 o$ M: e  f; y; i7 ?
                        static SixTetris tetris;
1 `% d! D, b, {" J- V, H3 a# o% r
5 I9 w) w! Z- _  r  ^tetris.InitPos();

+ D/ Z4 E, V8 f. c                        return & tetris;8 p, Y: a$ {$ O$ ~7 B% Y
6 t( a% x! f9 @$ m5 o
}
0 _, r9 z: [. v! e, K" N: d

' h4 F! r$ Z- C8 |5 y3 N0 b8 V) p$ m; ?! O4 J
, I! g  ?4 L6 Z2 t/ r6 {% z+ n
4 V0 g2 y7 N- I7 `
Tetris* CreateSevenTetris()
$ b1 [+ ?. R. Y& N; h
+ \: F, G" d" n. I# L: [
{
3 q/ D5 U' [# B4 w
                        static SevenTetris tetris;
" Z7 N# d& a8 d2 s6 H
$ v+ h4 |) r3 x0 U9 H# ~tetris.InitPos();
; H1 Z; Z$ ^2 X: F. q/ C. T& |' q% q
                        return & tetris;0 G, A# o" k6 ^# [: Z# P, q4 z
! g% q% ~) L; Y; Y1 W
}
' i8 R9 Q2 I# R7 L4 ?
/ X) V- ~- o1 b8 w4 e) F- [& Z
private:) J. d1 G8 i* b! y4 I2 w3 {

2 n; f. O) g' X, V% x6 @+ E' u2 G- V3 J            typedef Tetris*(TetrisFactory::*PMA)();
1 U+ D) p- }6 [  M
. G! Z) Q' U% @* Ostd::map<
char,PMA> m_sel2TetrisMap;

5 s* C8 z. M& u" k0 O
7 s1 V5 J3 G. y; s1 i

  R! A! s( k5 k1 k- T: N};( q5 ~1 u; d& X0 y$ o
* g0 {: B( R; V' a
有兴趣的朋友可以下下来改改玩玩。
0 w0 I- J$ Y" D& K. R: D5 m
6 Y6 e4 Z* c6 V2 N& TThat’s all!
& o0 ~* t7 R1 B  h  ~6 y
- _( A. A( A: {/ CPeter
9 j3 h  v, f$ ~
3 D5 K1 P3 `; o4 k[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-3-5 12:50 , Processed in 0.083633 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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