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

俄罗斯方块

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

0 `( ~/ Y# X6 I1 V! `5 j/ b' U 19 q- w( E- N# h+ }% m2 d/ l4 r' P
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
5 H8 D$ o% Y$ ~  T' E$ K6 d
% M, ^6 x/ J6 }' g5 i! x

9 }6 T) d; D9 r; J' DFactorycode如下:' [9 O9 z' P- k8 s# @7 T6 \" x

  ]. }2 [) v# G6 r/ u3 V" Z/*************************************
7 E9 N) O7 h  m# l- d# n' A+ |$ g/ F, N) ]
* author:hgf_starlovecpp@hotmail.com

$ z2 s7 A8 v' z: |4 F, ]* T& w/ P/ W5 ~, b% ?; X  O  e
* version:1.0

. j+ f8 F0 r* L
+ N( H% w/ v, K) v7 `! L* description: just for fun
( h  I, I1 ~. _0 W
2 H& U9 w# J8 v0 R  A3 F/ \
* todo: hard code exists need to fixed
$ M& g6 B0 w# L1 s. N
5 u3 n% g3 }* h0 h; Z; O
**************************************/

3 y+ i% b; F7 o
& F, v! [) {' ~9 a9 W- s#pragma once
1 E# d0 h8 `: t1 {1 f7 ]#include <map>: A: A0 `! a) N/ i- h& @! n
#include "Tetris.h"
% D3 c3 M# B0 n( A#include "OneTetris.h"4 Y* [& w* x7 N( G9 u) D
#include "TwoTetris.h"! ]# \5 \: o, }
#include "ThreeTetris.h"; V) P0 V+ @& v2 m" U4 L: j
#include "FourTetris.h"
( c6 }0 [  V8 q# k#include "FiveTetris.h"  g8 z8 x# v4 u& f
#include "SixTetris.h"
6 b5 E  u; M  s% v2 T0 B9 P#include "SevenTetris.h"3 g% c; K  a" ^& s& v9 p
3 t) X/ K2 q/ ^! c% T3 K
class TetrisFactory
* M& t" U6 g$ i5 R# H{
: p5 d$ |) ?3 ]5 P& K: Bpublic:
1 l4 y" d5 v! {2 Q* B3 E ! x4 Z. I" ]3 @
* j. R5 y$ |' B9 G4 c
TetrisFactory(
void)
  o/ x1 P& B- l" l8 P( f/ w
. n6 n& [+ \9 {5 B; }  ?+ G& S
{
$ Z) J9 z1 ]6 H. e% C

" u3 }9 h) q1 h7 F, o1 ym_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

' b4 a0 Y/ Q; d1 C( K- `" O, B2 u
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

) s( u3 T2 P$ j* f6 [! }; F
$ A- m6 k, B# W. n) Xm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
6 L4 d6 E% Y8 R
/ \1 A0 {9 Y2 Q3 l; I8 ~
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

; t/ W. Q9 D4 D4 C: `0 l
; w: B/ B: o3 L* K% a! Tm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
; _8 U7 Q) s* ~  r" e

5 w3 [% t! u  V6 N, L0 gm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

5 W( J, `5 Y% k: J& W0 g% s/ J! \- E
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

- V! x* H& c' D* W+ q) K% z; a* Y" B  k" ~
}
. T3 P( Q1 {. t6 s: Y2 A! S
public:2 B2 [7 r( ?: H

2 u; g6 m0 n: H! e' O2 ]9 l6 c6 @- c# A6 j4 c" t% ~6 x
~TetrisFactory(
void)
# u. I: ^% A  i0 N

& v" I. y& [1 P8 b{
9 n9 d+ U& i9 d+ V* l
% j7 z. Y0 {+ B$ e
}

5 h7 @2 H7 O1 W) @8 `. ]: S. n/ V  }9 \0 x1 O9 s4 m! i
Tetris* CreateTetris(
char sel)

: ]$ J& x4 p  ]! I, h9 H- P
! ^( H# z2 r$ H( ~* i9 [* P{
+ p- s2 H5 c+ S5 _# U, c' u
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();$ f, V; [  {7 B* U0 P$ Q

2 P7 ^/ Q- T+ w}
# A* \$ q, l7 L  ~# L+ p/ Q& S
private:3 {' E' L' g# X* G  X

8 q9 j2 O& b/ @1 O2 f2 k

0 q3 I4 \0 Y8 W/ N4 s# m* [6 n# w' W" d  {' [" a; K
Tetris* CreateOneTetris()
4 A! I" t" u: j* {1 Q* Q( m

: R' d( v6 R: ?4 M' ?; G$ ?6 [7 B% o{
! ~" H. b0 C. a8 ^
                        static OneTetris tetris;9 [; V) E" _4 t- j! d7 I+ V; w. y2 E
' L* H7 z: l3 ^: B
tetris.InitPos();

0 u9 Q8 _3 k/ x# i1 K; ]2 i$ w                        return & tetris;5 P4 G6 M& O" O* Q. e* h

- ~6 N1 u$ p6 F; C' P! J' s8 j}
& K" \* l! t9 v1 O" l; M
7 n% u6 A, d3 j; b% T5 I
, a2 Q9 C/ w* t
5 W' o' W; z0 N
Tetris* CreateTwoTetris()
$ ~3 f1 ]+ }$ Q! l& W
& g4 @% U+ T" i6 z
{
, O6 O/ ~( x: `" e
                        static TwoTetris tetris;& a" s+ t: Z& n
* O$ S3 n" ?3 R% B; c
tetris.InitPos();
4 x8 G' n6 Z: `  h$ w% k
                        return & tetris;
7 b; P, V& v% F8 q9 e
) R/ E3 s# ~& _& E4 z& v/ N}

5 ?; {6 b' h9 X+ G# `  E8 k
& ^- D4 M) ^  }- K: C7 L. |
% ]- u- |& k* `

; w1 D+ r+ p2 PTetris* CreateThreeTetris()

- l4 F: }# O; M# L
# I) Y) \0 Z8 c5 X7 G" Y$ H{

: p5 m! k# z/ S# @3 d& E! j0 B2 _                        static ThreeTetris tetris;
: y, y, x1 ?! Z) k
3 _- h' x3 l! m' i, n: O+ N9 Wtetris.InitPos();

6 ~' H: e, N9 H' g* ?2 y5 `
! J0 ]7 |/ r8 z3 H! r3 X/ u6 ?, x4 z+ _# u+ C8 u$ V/ a6 y
return & tetris;
( E4 U8 C/ l/ s' w3 ^9 E) F! e

0 {, _& X+ n; \) {9 W7 z( K}

& M+ ?, t6 a3 g( j: s* n8 O# s9 N+ @( p5 C/ N
- n9 x, V- `( S. {( ]7 f) B$ F: A
- L% t0 E/ W. g
Tetris* CreateFourTetris()

! _  o: N. z# t; C
& O0 e! f( H$ h! J$ T- ]* p/ U; e{

: K" C6 v0 x0 h6 D% h6 A% N6 [5 t                        static FourTetris tetris;( z. q0 n' R! `; [& ]+ ]) {6 I

0 J' s0 U8 A& x  C! O3 f! ztetris.InitPos();

( I; @  h5 @/ T, |                        return & tetris;+ g" C" W4 V; t% d3 ~* M& P
$ Z( Y  n4 z0 K% k6 i
}

5 _& _6 K8 ?& Y' n! b
5 d1 }8 {# l1 J7 \
* ?2 t" \+ m) m+ ~" r* C% i
  x8 h4 N$ K( [) N9 G- F& |8 @
Tetris* CreateFiveTetris()
1 K( @+ [1 P1 z+ g9 E( n

: t4 d, E( l% C$ K{
, b" R0 r* q+ K$ l" L" k5 |+ ]* X1 R
                        static FiveTetris tetris;2 |  _( t) b8 |; Y
% L/ c' V$ l/ X  ^- Q' ?
tetris.InitPos();

. N9 V3 h5 z+ z* k% o! ?                        return & tetris;0 w+ q! m! U( i! C! [5 a# h

% M' U% K/ ~% l) v! E# U}

  a0 p$ u& a4 {0 t- w! z   W( b4 d2 X. c+ N9 `4 {& Z/ g
# M3 L* s2 c9 _7 E- P
Tetris* CreateSixTetris()
; K# f) h. F# M0 ~& G7 \$ m2 Q1 Y
3 A; H" ?, A) A. T4 }
{

- g% M8 d0 ?9 W' [                        static SixTetris tetris;) ~0 K8 M4 V0 T& L

) R9 U5 E5 s3 itetris.InitPos();

4 X+ W3 w+ j( ?- D" g; C% C0 X' ^                        return & tetris;  c' B& G$ j0 R' R8 @$ ^

/ p4 q8 b2 K- V1 d# ^6 r( A7 U( f}

7 p; g, `+ }' X, d# Y$ c 9 V3 U* l( S9 H8 m+ P
% Q+ m) x9 g( R- w) d
9 v, r, y7 N7 ]0 v
8 z. F# ~- q# t) F
Tetris* CreateSevenTetris()
% @, ]  n4 Y: W: D' A( E9 g# O% M6 [
  t. c; _; O; F
{
/ `5 ~5 W. ], E
                        static SevenTetris tetris;
2 U: `2 c8 G8 B8 M8 P6 Y1 G/ S# I+ o9 Z4 I& H; g8 U
tetris.InitPos();

/ ?! ]3 u; {& [; y$ B" N: @7 [$ C                        return & tetris;
6 c( m  ~6 P% f! x5 j( R) A2 H# a$ M( n) E* q
}

# R: |" R3 j& U' `/ [! x . U" G& U0 M! U: Y$ Q5 Y
private:
, G* Z1 @$ Q' t8 q
. @) o+ }# D* i9 L" d$ h: C/ R+ V            typedef Tetris*(TetrisFactory::*PMA)();# d2 \# X: I, }* o

) e/ P- d: Q3 P. ~std::map<
char,PMA> m_sel2TetrisMap;

. N8 j7 l7 \( {4 p- L2 I
4 A1 v2 S$ j! I. N/ q

% Z% ~! ?  n9 U- D+ e+ w};# {3 ]$ _* h  m  {, P
: x- E! ]2 m) J' Z* s/ x1 N1 Y
有兴趣的朋友可以下下来改改玩玩。( C' ^4 D; D, v" z

, n+ Q6 z! @7 CThat’s all!% B- `* e6 b9 I. r9 _5 \' c+ _
  a4 ~1 j+ q% N& A& I* k6 Y1 `
Peter ( I7 H$ M. }! N1 c7 B+ Y
) y* a* ^2 k: g( U
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-6-4 22:05 , Processed in 0.047647 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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