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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
7 X% L4 m6 C( A0 r1 H8 w
1- {- ?- {: b( m$ F6 x! s
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:' O3 F  }8 r, l

; d: s; v! q# J: z# s7 I

' O+ {9 r) v5 ]; |* F# K1 v* AFactorycode如下:
& E% l" y5 _+ M$ E5 \9 j" t7 ~
; g4 |5 u1 q* e. C/*************************************
1 Q4 @. v# B4 Y; S" R! F7 J% x1 {3 M  b7 W! r8 B" g
* author:hgf_starlovecpp@hotmail.com
- p* `0 n: v' C& _% K8 t7 E
8 e' \0 z7 o+ `% n
* version:1.0

! K& H$ H% n+ P3 m& ]% N% g6 f0 J# e
8 D* E) E  d' Q* description: just for fun
. F( n3 p. s6 q1 C
1 ]7 ~, D  r# _4 i3 N  Y* @: S
* todo: hard code exists need to fixed

6 t9 |2 p) x- U% @: W5 S) j: R0 i4 D
**************************************/
' X# r" h9 j# c+ ~7 E

  a+ j1 X. S) x# B! q#pragma once9 a9 k3 A- L' x9 Y: W
#include <map>
% G% z& A- _$ Q" X5 I( G6 b#include "Tetris.h"
! x, e% Z3 o8 h1 v% D5 C' u#include "OneTetris.h"; l! k8 a# T# G% m3 G0 P/ ^
#include "TwoTetris.h"7 D* n$ |/ B2 c/ ^
#include "ThreeTetris.h"
6 w# f  f& _- g5 {9 u4 H8 B- A3 M#include "FourTetris.h"
! G2 U. W3 C' A  u( I* Z#include "FiveTetris.h"  a# k3 w7 L/ q0 ~5 ]$ Q
#include "SixTetris.h"
8 H" m0 i: x6 x1 w4 e$ O+ E$ Z. M1 p#include "SevenTetris.h"& Y, S+ O: v" G3 j6 Q: ^
6 t& l/ @( a/ U- T' S. Z
class TetrisFactory
+ b. O! @/ D- a  [{
$ V& q" H, b/ y- T% w$ M" spublic:
- v8 [) P& q  k+ K' L ! W* N9 z9 l" d8 ?1 M$ Y: i& @

: T1 V9 D+ q+ K/ B/ d8 qTetrisFactory(
void)

6 h9 V5 ]4 ]) X) l, ^% W# e( D* T+ P3 T) X7 E( K8 ?2 s7 D6 N5 y
{
) i; v2 y; {0 x; J4 V! m) B

; v, [0 n( k1 \, d$ ^* q; Hm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
4 \6 g& ], ?- G" K2 ~. Z+ B2 h

5 a$ \8 Q! q) ^$ \' X8 ?m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;
3 y9 l1 u7 k/ ]( i3 }

- K- ^% a" ?  e; X3 b% K. P& k. Vm_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

; W: [) y) {7 N" X1 w# J% l: Y7 K" t6 `, ~+ U
m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

: p% l  b, s+ d% k+ I: U' X" x" V1 Q% s$ O
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

/ x0 ]% G1 Z" B5 j' j, _& p2 N/ C; L% |+ S7 m/ S
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;
) c  `. f6 K. \% d# H3 a  v- V

: c# A6 S4 h* Em_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;

" [- d; c7 v3 G4 w/ R4 T$ x) R
7 M5 ~4 H% B6 s: Q/ l}

* Q- O+ `3 O' g& O; s. p: hpublic:6 o; G6 A0 Z3 ~, W+ i4 d
1 u2 U! J: d  s* h6 I7 ^

, c' e+ e; g2 X* X~TetrisFactory(
void)
+ S0 `$ `% }! i- B7 |
, Z+ B) B& E1 t: i$ ?
{

! F; b1 U5 s' e. R
( Y+ [7 P6 C+ V5 ?4 X2 c/ U}
$ o( {( e& G. [
& j& t+ m) u6 s1 I( ?- b
Tetris* CreateTetris(
char sel)
* K( T+ m. `; }7 E

8 A  n" k4 i& l5 N: p2 e% r{

/ b9 t. q4 h/ G) s+ i                        return (this->*(m_sel2TetrisMap.find(sel)->second))();$ I/ V+ C7 r2 f" L; C- ?) f! t
( B2 R+ B% {: X' z9 u
}

/ V% A/ Q* S! h4 H, b5 gprivate:
- k5 N' T5 {& d1 b0 d- c1 L
4 @+ s) F4 v7 j6 N, `
2 x2 |; A4 r& _

' E" M: f* A: o5 n9 RTetris* CreateOneTetris()
3 J/ n3 b$ ]. [* u
! l& j- {1 x/ k$ i5 `; Y
{
8 Z4 l' N! M  ~7 |: \& p
                        static OneTetris tetris;
+ d" b7 i/ d, N
) x. h/ z1 @  R  p5 y3 htetris.InitPos();
/ G( W7 b+ J$ \
                        return & tetris;
7 W6 g0 K+ S# h  L9 F* k5 [$ T1 Y: y+ R' l( J4 k0 i9 d+ l! g# X1 C
}

* R% V! b4 v0 Z( [' P- ~1 y+ K" I/ k: t. \

2 b9 E3 X) B! M: q$ {4 }4 \- U7 M7 N6 `/ \) J! z# K
Tetris* CreateTwoTetris()

; ]& [' q; L/ f. ~# m- C" |: c! W) L+ R0 V9 O+ T/ r/ E
{
5 x3 I) ~! F3 J% N) G) v
                        static TwoTetris tetris;
. \8 Y! L; I: \9 ]% ?9 X
9 `& P6 a& H& D' z: c, o0 ^3 vtetris.InitPos();

6 |6 F& z3 f3 E: a1 t                        return & tetris;2 L' O7 D$ G8 g" X

# @0 S: Y. `" X}
: i3 [& f8 M& \2 S5 _  m
* A& J1 E2 [  B5 m

$ |# `0 S3 X1 a7 s! b  ]5 h" t$ c, v( m. n
Tetris* CreateThreeTetris()
8 N/ _; b- W* y8 B1 Y* v) q

6 U; F4 v: W  F- X# t" M{
, i" i  Z2 }. b: |# M! m
                        static ThreeTetris tetris;& a2 Y* E4 p; a4 O

( V  E. g' O* X6 ~# wtetris.InitPos();

4 r# E4 X' U3 N5 e2 q* X3 ?$ }5 P5 ]! h. Y% V5 D, s6 f7 R
( d$ A. x7 v( A/ J& ^2 ?# n
return & tetris;
+ I' F) w: {/ V

" j' S( e/ p7 [8 x/ q$ A}

& g% A: j9 Q$ ]% d" S$ A" K# B; D! K$ }7 j& f

& ~! l6 ^0 r4 t" M/ @2 [0 a3 r' X# i9 e( a
Tetris* CreateFourTetris()
3 U' B; d+ X  o+ A

8 a% L) [% z% s. O4 }{
3 `) S: ]5 @5 @9 x! x( g
                        static FourTetris tetris;# i& s- d$ p0 t. y
$ z6 I) f8 N+ g; d' Z
tetris.InitPos();

/ f' Z! [+ |' c) P# B                        return & tetris;5 w- E4 w5 E$ J& _
/ o: `1 }& p4 x6 _. s6 t
}
. K1 R8 a, R; d6 m; F1 L0 y: r# u% h. {
( _- k% X* E# L
+ w6 `' k$ V/ V) X  w3 O7 G

, Z7 [7 d, |; t0 iTetris* CreateFiveTetris()

$ I( V# `, p, T6 R( t# o0 C' o% g& A7 f) u9 x
{
$ J2 k, N* |9 F3 p3 F$ c
                        static FiveTetris tetris;5 r( C! g, t1 W4 G. b
. f% J& Q( W, j, L$ Y+ Y
tetris.InitPos();

" P2 T" _" S6 [                        return & tetris;
* W5 I& V8 ]1 h- J* T+ B! p3 g! c! \0 ^- [
}
! ^! b- A8 f" ]

3 R0 n% ^. W9 `7 J- \$ P; U+ E/ e: t. l( @+ N
Tetris* CreateSixTetris()
% k* Z% m# U5 L: M2 ]

" W$ Z9 [3 w% c{

7 N& ]% Z# L' n                        static SixTetris tetris;4 e8 ?3 j; F# U+ `4 X6 X9 Y3 V
+ ?* E- Q. {% e. I* E; L6 l; E
tetris.InitPos();

, X3 _+ ?9 o; \6 t9 g                        return & tetris;+ V+ [$ |! C+ e3 u  h. B  Z3 \
4 o3 \; n) x; u  _
}

( g# ~7 }* y! }' d" s% Q
. N' n% l1 Y0 A& j+ }: p" l" ]
; c# F' d3 A  e3 i; ?0 ^$ z6 z

0 C' K" V9 ^) A1 G" D! ~
, d7 b' x0 Q  z5 o7 s+ x# G) y) g8 V* o$ qTetris* CreateSevenTetris()

! |2 W, a4 M0 R1 B& g: V
' I. K; o  O0 n{
1 x& K, P8 d1 W& p+ J8 i, y( g
                        static SevenTetris tetris;
5 |: ~6 ^5 p( ^) h, f$ U9 i. J" h' J+ ]8 k5 M
tetris.InitPos();
0 K6 v. u; S. k) Q% f
                        return & tetris;
6 n" V8 i. U- s6 q* v3 I
  T$ m' \* o3 N7 s}
( p/ X9 {! {' j- S' V& v0 ~

. |0 e0 S# ?+ _! [% y" B* |3 Xprivate:
1 x" y' K! d+ k. t3 i* s! c% @4 ~ : a8 `) `3 [8 V7 o& q2 n. Q
            typedef Tetris*(TetrisFactory::*PMA)();
" H0 b3 _2 |* n7 i& |4 Q
9 q2 I8 E/ z( g, y" a3 |) Tstd::map<
char,PMA> m_sel2TetrisMap;
# f/ \! _( ?, m& _) L1 Y" a/ F) q5 J

: P5 A. E& J- a

+ X5 c; C% G  Q0 U7 Q! T" ^};( G3 F6 i3 o: @2 v

5 g( u$ G. i% p; V/ |1 G" M: k有兴趣的朋友可以下下来改改玩玩。  }. E  T2 |1 y* q+ G) a% H
# V) B5 c4 I1 a4 {7 b# y
That’s all!7 t; D( U8 z5 |! E1 z" p

* r5 o+ M5 i- e* jPeter
. W) Z! ^  ]( G* [! O8 `+ Z- ^+ ?2 a( s, k
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-5-14 11:07 , Processed in 0.043520 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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