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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
: T1 m/ m. z* D* W% }  h0 W+ M
1  Y2 C& G" I. Y1 d' M
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:# r0 g% a$ x9 L! I
5 _/ D# @( d* Y2 ~+ p& V" Z3 U3 u
. ]+ p3 t  L' n/ k/ N* l
Factorycode如下:1 e' {+ T8 d. g, `$ X  K' \

. t8 _, j0 T# c8 Z- E1 j/*************************************
( Z! T: C3 n" U3 q: l0 `
# D7 s, @  {% {* author:hgf_starlovecpp@hotmail.com
* m8 ^7 r  T6 u( u; R' I

9 }2 v  Z" a0 |9 ]) O! O3 p* version:1.0

# m8 f7 ^2 |+ A( ~5 w/ b# L
. V, U5 o" m, n# T* description: just for fun

+ U& C  o  |& q& P* s6 T# A# v! ]( w# u. t: u; g9 @
* todo: hard code exists need to fixed
. ], y4 i$ {; X" {% W. D6 W* d

, S/ K& [/ N6 f; L2 E. G1 }**************************************/

4 i/ `& L7 h" r' m" }4 }* Q
( `- W( F5 B# V0 |4 T  z: P" F/ h#pragma once
- {. Y6 w9 D7 p. w% C#include <map>/ q- R4 Q" b" y9 @, k
#include "Tetris.h"
  a. l8 F% e5 J. `) P: z' p$ c( \#include "OneTetris.h"( Z3 z1 L/ q$ ^% Q0 N, c) W' v
#include "TwoTetris.h"6 X  E  L, v% R2 }
#include "ThreeTetris.h"
" \$ h& f' R/ n; {  a7 h#include "FourTetris.h"
4 V# u1 v7 Y8 y' X#include "FiveTetris.h"
% Z* w4 C' m3 a+ |1 [#include "SixTetris.h"3 f% C! H, [3 l% z
#include "SevenTetris.h"3 Z! E, t3 V, k1 l1 [
, q" _1 H8 R; B( o2 Z8 T7 g, y
class TetrisFactory
+ z& a, V( h. j, M7 W# D{
5 Q) C0 j- |+ `public:
# H* ^# r" V9 \6 ^
7 g6 ^& i9 F9 T4 A% [
6 v9 T9 G8 ?6 e1 n' O- fTetrisFactory(
void)
* l; W4 e' n5 }9 I& |

+ J7 @& Y  S3 W{
: B- Q# D3 a9 d! t7 I/ i) D8 O4 ]

6 o& F! b5 J+ }0 y4 ym_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

7 N( w5 l# U" n: H$ G5 z% f5 i, P- D$ d4 q; D
m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
8 K! I" I) _5 M! d, V+ U
" f$ g- Z- s6 j
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

" N- W9 t. ^, e' Z  ?  D
2 j1 w$ o+ q! X4 D  X3 q# wm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

( k% }0 R/ J/ c) ?2 u. P' S0 \1 A
- k6 r% z9 E* ?: gm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
! T, T  u# q9 L4 Q
. h9 G# ]' I# B4 H! x+ l
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
$ K  b, M' a9 u' Y
8 l/ h. n8 R4 W% L; y
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

# z* p6 f4 K$ Z4 b0 [1 I7 `: U, B1 w# o9 r, L
}
/ t# X- `3 b5 b& Z2 Q: I. G
public:; Z$ a$ E9 Q7 t$ `; f, H
4 `% A: f* L0 R3 v) p. E1 w7 o

0 }! R. ?+ p- y4 Q) _+ [~TetrisFactory(
void)

: k/ Y7 v( a6 j" w6 s1 S" [/ b8 U4 W' f) u& [' D- H4 |
{

3 c0 r8 ~0 h* Y# y! ^
; c1 X# A$ d* ?}
, d1 r1 a, ^' Y" M

! y9 O! n7 x4 S# k$ J+ S; uTetris* CreateTetris(
char sel)

: b% b  r6 a7 L- _' z8 V
7 M6 G& O% J' D" I8 M2 u$ \/ N+ d+ l{
& D- Q9 }# V/ C; a6 D& W: M
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
4 ?/ y' L8 P- G8 a  @" e( B6 a9 M2 K+ P$ b% z+ l
}
8 [& W# Z+ B& b& H8 v$ x
private:
7 X; y. L* B0 `4 }0 O6 i8 F- e7 H/ r* k# i; d; Z/ b, ]

. m( r# [+ c; @. Y. Q& R$ P$ l1 B5 |% }* \- C. h
Tetris* CreateOneTetris()

9 R3 Z* u6 G/ i# o
4 C0 _2 J$ I( w9 z. [* k{

3 d- G3 ^1 |- j                        static OneTetris tetris;( ]$ K+ R- y+ s5 t3 k3 }( m
2 Q) P# S( G/ o
tetris.InitPos();
  d4 O  S% g0 N7 S
                        return & tetris;
$ v$ d, }1 U! Z& S' v4 H# F1 `, ~( d/ k7 Y& t
}

3 D7 E$ `& {3 A2 m1 b$ X: _
& B  L8 d: a5 N- k3 [8 _9 r
8 ~8 u- b+ y& u: G5 @; v* w5 q6 e$ ]

6 y4 B! L% }2 n; lTetris* CreateTwoTetris()

9 [2 n( o4 s# \' m
; Y' {. n' i8 d$ u$ n& s( S) ]{

. W* r& O: ~0 t& [. y9 Q                        static TwoTetris tetris;
/ t" g. }3 D/ X5 L
& @0 p- A2 c) j2 Atetris.InitPos();
8 g' _/ Q& s8 h; q) b! P2 X& q
                        return & tetris;
* I* ^4 m8 z2 O2 U8 X- j& [
1 X( O! i6 x$ X9 k}
& S7 O6 y2 c  P

1 x. o( H6 V$ O% m
+ V5 X/ s; z+ B) c) v* e
" F% U9 u. _4 W
Tetris* CreateThreeTetris()
5 ^- Z  t6 A- Y( p3 z

' q/ B& k: O; c# m- b/ {: ?{

& g- O  E5 @$ U5 f/ J0 U% a                        static ThreeTetris tetris;
; e9 G4 v, h- P4 y5 B
* N# L# k, O4 m0 w* btetris.InitPos();

$ Z( `5 O- Z& u0 f& [! @- ?7 \' B( U6 Z1 \, r/ k- X
8 o9 F) Q- B1 |5 b& J2 `
return & tetris;

1 b( L/ a( t2 H  G9 Z+ z9 G! R
! f. U. f) p' e" X. Y}

: v. l- ^/ _3 J5 ^3 t' u
( S+ Y2 F( w( \# V. G- ~& A
8 a( s+ F- n* ]# y2 W1 U) H  ~
4 k& m$ F  M+ f! m& p! O- x
Tetris* CreateFourTetris()

/ m7 A& p# J4 X2 _! h
3 v5 G% G- x& d: u* ~% w{
6 U& W! `$ }9 d% C$ J% t; w
                        static FourTetris tetris;
, y/ Z3 Y2 v2 I# H6 c! c9 _# l% f9 M$ H7 E4 P5 H
tetris.InitPos();

) ]: K+ U' o. |8 d( o                        return & tetris;4 m3 f7 q/ G  Q3 D, H
& O3 }6 @6 H2 @) M- f
}

1 D) r' E1 S5 z& R; h  Z- Q& S6 W  |2 E7 Y
7 r5 r( b: I8 D( b4 ]6 [/ p
% p; P- |: w0 U. F
Tetris* CreateFiveTetris()

, i+ Y0 Z, d1 d: T/ L7 Y* v* v6 A' M1 r" y) C$ c2 O  ]
{
" ]! w7 h7 Z) I. W: Z# f( I
                        static FiveTetris tetris;
( b2 L0 L$ @  D, V6 Z
6 `* K6 [. f) n+ Htetris.InitPos();
7 k& M- D! ^! n" `( e% @
                        return & tetris;; W/ z  q5 ]  {/ |9 k/ S3 ^4 ^
! {% A% @. V5 u1 b! p1 h+ q  y
}
  Z6 x) ?2 T: P- P2 o0 B
7 O7 x* f* H: V! @9 G3 m( W5 ^' n
; G  P& T  Q" {( K3 C
Tetris* CreateSixTetris()
3 `/ b0 `, h6 \1 Q: ?0 W, R

* T2 d, v: `& W0 s{
* X7 c* c1 i% h/ x6 B
                        static SixTetris tetris;; f" E; c/ E) M, Q9 Y( r9 j

* [2 T0 [9 F0 r# W) @tetris.InitPos();
% z9 U% o/ t! [6 Q
                        return & tetris;
" z  \" [6 Z+ M) K+ s
& G1 `% s% p, m' K}

8 g5 U; H+ o7 U( t+ R. [
! @9 y: |& t) K: m3 x" s/ |( s
; ^& o# y! \# W

2 C% r+ f& G' f% K: P! t. x/ g; i  ]
Tetris* CreateSevenTetris()

2 a. E$ M) J' v4 Z9 c
3 \# M$ M  k! x# }3 ?{
; B: ^% Q; I3 X# Z
                        static SevenTetris tetris;
- c( X( ^4 x$ m1 K1 J  Y! q: h2 ~3 Z7 W! P! n4 U$ O/ D9 B
tetris.InitPos();
( w* K5 U# q0 c) b" t. V( A( w
                        return & tetris;
5 }" x; d2 E! L, M# R" Z& ^
# G1 k' M! w, k* ~}
% `8 b5 d; O  U) s0 P9 ]; r* Z% w
# G( E5 I/ V& _( A) D* k) ]( i
private:
5 ]; i4 j5 F4 Q/ y , `5 S" q1 G) V; Z! O) d
            typedef Tetris*(TetrisFactory::*PMA)();0 F  B% s, c" [% O% K6 E9 B

, `8 Q9 g) P' l/ A7 p2 Q8 ^std::map<
char,PMA> m_sel2TetrisMap;

5 i9 n/ F4 I! t1 z/ r/ @! P" R: P3 P8 ?6 x' z" M
  S# i: f% p3 h1 i
};0 r; \" t# e- f$ D
7 h6 X4 m( r8 S1 q5 a
有兴趣的朋友可以下下来改改玩玩。6 }# v5 r2 m2 H& P; ~

# O: _2 c1 s; [5 ]! ]+ U0 g6 @1 eThat’s all!6 r% t5 Z' R  W! y1 E
" |* l: e* |' I1 N4 X
Peter & \) k- O, }- `' C( Q
: ?, C6 `1 ^) M
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-5-26 08:20 , Processed in 0.041734 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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