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

俄罗斯方块

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

$ V8 D+ X" d$ t( z9 m6 n 1
" [" u* a+ J/ `* m完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:- a/ B% m6 Y1 H! K% B. H; b* u

1 f6 A! z, d) [9 Q$ I& F4 k; S
8 S! D$ S2 S; C  V
Factorycode如下:
" `4 g+ o) X0 o  X6 D/ ` 9 [8 B9 u  D5 E/ h9 B$ X+ P
/*************************************
7 p* {/ \9 c4 H# e1 f0 ~, i$ c
2 X, N/ i( Y1 [3 |1 {' L) m* author:hgf_starlovecpp@hotmail.com

" r- \3 g4 a! f! T+ W, O; X/ |( f9 o0 F; U
* version:1.0

0 z9 _. n& H, x  {7 z
! B0 n8 o5 v* Y8 ?6 }5 x: u* description: just for fun

* I+ C+ r- \* v, ?  f7 c3 q, A# J5 v9 [
* todo: hard code exists need to fixed
6 A, g; i3 P0 a. n( X! t' t2 i7 W: y

0 D; n, P# ]" g5 s# G* ?**************************************/
& K) x: R1 c9 i* }0 Q8 K
  x; e: ?" R" r- l, m
#pragma once; ~: i0 M$ k8 }9 C6 Y2 \
#include <map>
4 [' |( N, u2 A, p9 Y+ q#include "Tetris.h"' u/ @! `; o4 ~4 y3 H/ m
#include "OneTetris.h"
  }! |2 P5 M, Z#include "TwoTetris.h": h/ Z8 v. E; F2 w" D
#include "ThreeTetris.h"+ y3 r! H( |; g$ f4 |5 _
#include "FourTetris.h"7 R; T( T' c) l' A
#include "FiveTetris.h"3 i% S- V- ^1 O/ I" m3 r0 H% \
#include "SixTetris.h"
2 a* C/ @/ ~  P#include "SevenTetris.h"
; a/ z' g3 w' S
; |# K$ C5 F$ b4 w9 O& _class TetrisFactory  m; x5 E. g, @
{
$ x! ]" ?; V5 C) r" @" ]public:8 H3 N# Y$ Q5 H& Q  f9 i$ l& Q- D

6 ]- o+ l5 M3 V
0 R+ d% f; I7 B, {6 pTetrisFactory(
void)
7 S: e" o1 i, N8 n! e
7 V7 _+ T' ~0 j, p3 E, g7 e
{

# A$ y  r$ y9 H7 C) w7 b3 e
; [# u* `' O6 @' `2 Y7 u- W( E7 J+ Pm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
8 u" m( B+ n* o# ]" U+ g: y0 u2 x, L
  T( [* ]1 n4 L
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

: ^( e: Q6 k! |& K  w/ n
( T7 x! ?: @$ J% \3 d7 t8 \% u* Gm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

! ~, ?0 B( i. f9 K% f) h
% ^1 E0 ^/ W& e5 pm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
5 _/ H1 I1 j# r
* l; Q$ w4 t( g) J7 D4 A
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
) S6 h' \. e, i+ z' p+ }

( |* M2 W" E* J% |$ A4 ^% e. Hm_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
3 O  F" p" W: e3 `  Z0 V
7 l* O6 M: r& S2 c
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

9 [# a8 I1 h# m! |: m  B
% d  _: @* I* K2 ~% n! Y}

2 L4 u+ [  M0 ^" r, d. lpublic:
. x8 n8 Z# Y7 x4 Z6 z* W
/ D, X" j* Y( C5 a5 @& x5 D
0 b# D* g. K, J8 V0 g! U! f~TetrisFactory(
void)
0 @$ K/ ~7 ~0 M

8 i& y- Y0 p. N7 S{

' V$ G' t7 z3 i  G$ }% Y9 l2 C+ K# l% _; Y$ \* v: R
}

1 X7 ]0 g' t- a& u# d4 A( Y
1 Z( m- s  z, W; N- M2 n+ tTetris* CreateTetris(
char sel)
' @. O* V1 A& D
- p/ J7 x# Z: S
{

6 }) Q5 _  x4 U' U                        return (this->*(m_sel2TetrisMap.find(sel)->second))();8 p: ?4 R, A' @3 H
* V+ ^2 \/ j# h# J$ r% ~& Y
}

! N* ^+ v; p) \% ]private:3 V, `+ q. |) y* f) Y

& M" n, x- \' B5 I

' E9 J4 ~& ?* A, e- Y; b% I' }- o$ P' w! R3 o. P
Tetris* CreateOneTetris()
# N' w1 R. m/ n0 d
5 U/ H" v! r" Z8 M- O: z% }, x
{

/ T5 V: I5 W2 b4 ?: I4 n  Z0 C, B                        static OneTetris tetris;
) E& ?8 l3 h7 w/ E5 k5 k
" h$ {4 F, a! L2 H1 F0 h2 l, P: G2 Btetris.InitPos();
$ O( q- g. `1 H) ?
                        return & tetris;
) F0 T! p( F! S+ s9 H' ?6 |+ P" @
}

7 j9 `/ a: [* j- s& M% G' V
+ X( I% @/ x3 r* V  F( I

- _5 i$ x. ]4 _8 @' [6 D7 Q4 i; f# l5 [( Q# W" Q/ p9 ?3 m" W
Tetris* CreateTwoTetris()
2 ]. O) r( @9 ^' U1 S$ j

% V* m2 F3 A, {  `2 [{
% U+ n8 G& N! N
                        static TwoTetris tetris;' S7 u7 B" @, b2 _1 F9 r- _* }( L
% g2 N2 E* n! T) l/ F
tetris.InitPos();

6 d8 J4 @9 T: Q5 b1 Y7 z! v7 a                        return & tetris;
" }  i# s& W* Y  Q, O
: a. f- F. Q) T7 L3 a" m}
4 Y3 D4 S2 t  {4 L* U
5 u- J/ c2 j# E* H9 R2 f: I9 C
8 J- H/ R' ~. e
: ~5 U5 N8 M4 t& L& j
Tetris* CreateThreeTetris()
4 v8 R" L" M% _6 B* }

/ Y0 X( Q1 ^' B9 q{
( A% p. ?6 x1 \: [- I
                        static ThreeTetris tetris;  t0 g- M: r9 e# l: {3 `; t
+ S$ ]7 a  p0 s& A$ u: o
tetris.InitPos();

! [8 I6 ?6 p: G2 q$ n( u2 G5 j" c, Q8 Z( a7 h6 W4 J; E

8 J1 c$ ~. v1 s9 b% F4 e+ y0 p3 Y
return & tetris;

! o; y& o3 Z6 e+ \( e7 K4 q/ H! v" m" K
}
5 |9 N& e/ y7 w# h
; d3 O' i8 W% b

9 O+ `8 S% o" ~; Z* V7 N. u
! T  S+ h0 f! t( ~0 NTetris* CreateFourTetris()
  W) y1 d; B0 T1 p

+ d4 j5 i5 O) X% ?1 b{

- x  d: h3 M# v/ C' R: t                        static FourTetris tetris;
! {2 J  c/ @4 @% U3 L. ]; |; M; h$ a
' b$ q. i( X$ ?2 }! rtetris.InitPos();

* ^' d& G% e) O) p& |                        return & tetris;/ b' [; `7 A5 e; E1 ?/ N

6 m4 ?# a5 O# f( [- z& S, F}
. s; R- |& O1 z+ {% M; @  g
8 ^" Y0 m$ X) J
3 K& |* Y" z& ~
5 I3 ?0 T: E) E7 |$ g' ]  I$ t8 d, q
Tetris* CreateFiveTetris()

1 k) i, S* q/ Y7 b4 V0 d/ u2 r5 Y% Y) P2 T3 r# ?
{

; Z6 z+ S7 I5 ]2 w$ A5 t% S5 ]& r                        static FiveTetris tetris;  h  y% h! j/ W  K
# ^* _1 V4 W9 B
tetris.InitPos();
( c) Y  h/ Z# f# t/ @9 `
                        return & tetris;# |8 U. `' K: ?* P" U

1 f" j" r. q# t}
& X9 t0 X7 A$ ?' f/ V) O2 }

+ Q2 P% E2 k; J1 K" y9 V6 }( N4 Y( \4 j: N: s  @. t
Tetris* CreateSixTetris()
0 |$ Y% ~9 w& I$ j+ t6 q7 Y' v
$ ~# N' q( M( O/ K% ~
{
- T. d8 s, y+ N8 B' r4 ?
                        static SixTetris tetris;
& D2 x$ h6 U: r& \% N# `5 U0 l! d) d# s9 r
tetris.InitPos();

8 B- l7 X, O7 x4 ^, J  V" {                        return & tetris;
7 ~  d+ [/ v2 y, O2 c1 a( e" }, p- T. Q- J  Z& D
}

. o: r# A4 W2 \; v& u$ `/ c; R% B
. y$ _* r5 V) P0 b: W+ N$ i9 S: w" e# V) I9 \

6 G+ t: Z- }3 Q# E( J7 j+ s+ {, I3 g& U8 m, x6 P1 M
Tetris* CreateSevenTetris()

, d$ I5 p* j% s8 [2 d3 k* b+ c0 l
{
0 }) F- X+ f5 E8 v
                        static SevenTetris tetris;8 m( k4 i$ L3 E9 `0 y7 D
* T+ k) ~- O/ y) @6 _. E# ?
tetris.InitPos();

& u: c7 G! h  s) d) `, g                        return & tetris;* G4 N+ Y* c1 v0 [* q7 e

  K* \4 w; E9 b7 m  X- }}
. x* O) s% _0 E; J! t9 O
  ~7 M* C" v0 n$ ^, R! W% K' ?' P6 ]
private:  ]2 {2 F) v- C, U0 W- T' V& a5 e
' `3 K- r! D- `, J
            typedef Tetris*(TetrisFactory::*PMA)();; X6 ~. x0 y2 M  T# n6 E

0 \2 h( E8 {' ?1 w: kstd::map<
char,PMA> m_sel2TetrisMap;

* }* p" w+ A2 U3 D$ i' V0 R( U( _* F2 p) h' i; X& L
3 U. k: Z5 C+ q: m7 J" K! q( L
};
) E$ e4 w" i! c6 b- r* U ) X$ K9 w  l; y- s  U: [
有兴趣的朋友可以下下来改改玩玩。
5 V& c2 A) Y3 ~; x- g/ n; `
3 L9 Q8 h. A/ c- ?8 G0 jThat’s all!" y1 X3 G( Z  }4 o

% x2 K8 v# ~( }" Y  j2 gPeter
# N1 o: @! I, z& ^3 J/ R; n0 A& b; o  ^& B  M2 P$ j7 e: U, `
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-4-20 00:22 , Processed in 0.083816 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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