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

俄罗斯方块

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

1 e- x# e% n" S1 t6 I$ }( R$ _ 1% o5 H% w  g; o8 {, q0 D0 E
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
* z3 C+ V& k* W' g8 z  F. T  b0 l  ?8 _' i! q/ i$ [  y0 F

" d6 d% I& T8 y* dFactorycode如下:
7 f5 o7 R% d3 Y7 V , f1 ^1 k, L# h% `" m
/*************************************/ g% P: |1 Z& Y- G9 W1 v) X- I

  m+ I6 {3 F5 K0 Q* author:hgf_starlovecpp@hotmail.com
9 D! Y! f( n+ b5 n$ K" Y  b% y
( f+ {  G! B! h' Z; {3 _' C
* version:1.0

  J! L0 v( Q4 i$ c9 l4 R3 a0 |7 W$ I) @/ y( z; J- n
* description: just for fun

$ R4 i! n3 b9 E. W7 q( R* w2 a3 b( a% w3 q
* todo: hard code exists need to fixed

/ U9 i7 @2 i+ d& Y! {
* b! Y- L' ^  s" ]1 S**************************************/

( Q4 S) M) @( n  E) z 8 Z! j- h( n8 m$ [0 f+ G( k
#pragma once
" z: v+ s1 ~9 V0 r/ l#include <map>% T0 R5 z, J+ ^2 S
#include "Tetris.h"3 E& s+ r; z+ j+ z
#include "OneTetris.h"
* P' u- r8 R/ u% L/ ?; Q# U#include "TwoTetris.h"
2 c9 T% T' g  r# r# k$ p#include "ThreeTetris.h"
9 y2 U, Y. |- H( `2 L& I4 l#include "FourTetris.h"7 A/ @$ g. m" \! ~! ^0 m0 a
#include "FiveTetris.h"0 ^; c. R  ?$ L/ t  b  I% k
#include "SixTetris.h". H. v5 B. c( U# ]$ Q9 E  u  X
#include "SevenTetris.h"
) H. A4 p: g/ L; U5 g  F- q
' m8 v8 Z/ {% g* \7 s- Lclass TetrisFactory: T$ @. p! k6 C6 Q* z
{! ~  O$ ~* j4 @1 l0 @/ {* X* ?
public:0 O) C9 I0 P1 p5 r, ?2 a
! q+ ^9 ~- U, w6 p" P

" d( D. O$ `" L4 S8 f" q0 jTetrisFactory(
void)

% @7 Q+ C6 r. k# R; n
0 x* w3 {  P/ x# z! J2 O% Q' f{
" z2 g* q1 P/ N9 w- G

/ L  g: {, B1 J) c$ ~" [9 sm_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;
3 I$ ^1 n$ l7 k& K* y

: |6 l5 ~2 c9 u, G0 n! _, `% |m_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

. W3 ^2 l( i/ f! W6 o& [& l; i) R! K, h& i: N
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;
& t, [1 L9 H2 n5 U

% |( r2 M0 C; o& Sm_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;

0 Y2 E# f0 u3 r: d2 V7 ]9 O9 f
$ N- C5 |9 ?+ l4 gm_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;

6 F: v7 a  q( y) c0 N7 [! y* F1 H6 g- h: H1 R/ f
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

1 P# m% U  ]; O1 m% k+ q- i' A% U
$ b6 y& u$ w+ @% ]) x+ c! C5 Q; xm_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
% L# m) o7 u: O* d: ?
% u+ `+ m; {. d# R0 H
}
6 Z" M: A% J4 X* n; O' e2 y7 _) f
public:
; O% p0 }/ ~: P
6 }; z8 c( l4 Z4 e  `+ F: C0 Y) B3 Z; [
~TetrisFactory(
void)
2 Y1 h* F7 }5 H' x1 m6 d
1 \& S, P9 F+ j; J+ \% B3 i
{
. d) c& U( B* w$ ?4 S. X, ~

8 Y  c5 n6 H9 R% F1 ^, U- R+ U}

% t% M  \  ?4 M& x) M9 ]# J$ |# y; I! _1 a
Tetris* CreateTetris(
char sel)
8 Y  z0 p3 h0 N$ O, F4 l$ O

+ p7 G3 r$ O! ?{

. n. I& f( z9 M  m. _                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
) L3 \; B1 C9 O+ S" a! w: P, _
5 j  @; a. {# Q% j  T}
8 X8 B" J! C4 I, H! V9 c% o
private:
+ T& P( y% H$ T8 t6 C" y! ^& r: a9 X" Y- d6 Z( p, L- W
& V# I+ D0 K5 R+ ?6 L

' k0 |) b& B- i& y; G+ a: aTetris* CreateOneTetris()
4 Y5 d& b, M2 W& ]! D
3 v  Z7 i& X. }4 m3 L/ D- l
{

; C: I+ P; I- W: b' ~                        static OneTetris tetris;
, @' r5 O, A: {0 Y. @% N
6 N% ?6 t: v# _+ L" }tetris.InitPos();

  W* C! r+ D  D  ~$ l0 b                        return & tetris;5 X+ ?; C+ y7 c6 B$ e/ X& Y7 p

+ E1 C4 k: d# y: q$ m- D! Y6 i}

2 I, `5 s" W' w! L6 G; V! n, x# N! }: u6 O* W) P/ a5 z

! L  v& i" X. ?+ O; ?( k$ l2 ~& ^: B
& s' ?; ~% y- w* r3 _Tetris* CreateTwoTetris()
' g' z: |7 o7 ?* @9 g
  p0 T  ]* f+ ]0 B6 L1 }
{
4 {- k' O9 s* ]* i
                        static TwoTetris tetris;/ w; E. d) M/ v# F/ w5 j9 ?" c$ L2 Z! u

! h+ S) o. M. i- ?) stetris.InitPos();

/ {6 i4 K( N# h  w5 G                        return & tetris;
+ I2 s) I9 n9 \+ Q9 h4 P4 N! \! `5 P( [8 p
}
  n! Q% T+ q* N! P4 v- G

7 q" {/ K9 v3 l

7 J7 S& Q4 O* ~4 k+ {' O: S- x  q: h' @
Tetris* CreateThreeTetris()

- v, x- B" m: T+ G4 @! n6 n8 s! R6 F8 |2 ~' B
{

$ f7 h$ T% v8 y0 A$ \5 N                        static ThreeTetris tetris;
% W4 W1 n% H2 i8 A) `& L5 T/ O' r5 y. ]5 Z, A' U
tetris.InitPos();

7 a, R1 w+ c6 b- b& j
" a  h. j$ Q) N7 P1 u" q) f: o* j( x8 {# E5 L) J% U# `6 I/ P
return & tetris;

8 C5 F% S9 j$ o% v& R! f1 W- r* j5 m$ _! o( Q( c+ y
}
% d1 K0 C1 D1 b& C! V
! H" W% B& [0 @
/ U" T" j' M  b0 w# g8 W8 X6 }1 y

9 y+ ^' @* c8 k8 s9 H1 pTetris* CreateFourTetris()
/ Z2 B" q$ [( A/ Q! H( I4 s
% z4 K" g9 o+ S" a
{

7 Y  @3 Y# F: |# |9 _                        static FourTetris tetris;
- J, B. f8 ], u( C/ d8 s8 _- [# f: G4 l3 w1 q
tetris.InitPos();
! c. ^, c/ g4 T* j% f& t
                        return & tetris;" \+ \( V9 C5 H/ ^) }

3 M, n- j" i. y7 K}
/ G) o" W0 F' T
1 D% T6 x5 X/ v; U. R' `8 E  X
0 N; g' V/ X( U6 N; O# _/ h6 e
5 b3 j. t3 W1 L" |; t0 r. T! F
Tetris* CreateFiveTetris()
5 A! C5 @! o7 @7 u3 d

5 H+ M0 k8 N0 X: }& G{

* J. k: ~; V' f6 j9 T* _                        static FiveTetris tetris;
1 D7 P5 `+ c8 i0 a& Q8 ]
. c) r* S( S1 b: ?9 U" m2 h7 j  Wtetris.InitPos();

- @, z3 }; H1 s* L2 G, w0 m                        return & tetris;
4 ?( b, J' ~# p& e4 F* m- s$ K5 _, P1 d2 @) y, W
}
9 U, g8 \" j2 T- b3 |  L9 y

. `8 l% V' s: b! T+ L5 h7 \6 ?& u' R" p* o- v" {
Tetris* CreateSixTetris()
/ v& f& b$ g$ A' k( ?3 o

0 _( s# W1 Q  c. Y$ l; i  F$ @3 z{

1 B9 \! [' @( R: b" i/ j% y; e                        static SixTetris tetris;8 l  g7 m6 ]2 ?9 d3 B, k0 M
, ~$ k1 s, Y. _6 D5 c
tetris.InitPos();
. A% R4 H, L+ P: Q7 C
                        return & tetris;+ W+ n5 r4 k3 S/ T
  \4 D3 Y# f) Y# C; m5 Y# t; l
}

6 K. v, ^2 `$ z" t7 b: u / ~- \0 ]0 D: c8 I, s
. G2 d' Y/ P! G7 j' w# i# K

* \: O% K0 u% K# [9 ^9 e
7 q" w3 B; c4 H! J' x$ v( wTetris* CreateSevenTetris()
& Y: X# b, U) D1 ?9 Z2 m' a
" G! _* L/ A9 d4 ]4 J
{
/ N: T% }. R- E; d" B
                        static SevenTetris tetris;; q( M$ r0 V2 E6 ~6 _2 h
. {' _: R9 S/ t2 ~! c, ]- V) d
tetris.InitPos();

' y) `) a7 F8 {, k' G; Y                        return & tetris;) |- O% J9 M, d5 v. [, U
; [+ d, u3 F2 c% |4 _  D9 \# U
}

$ z* p; N6 `  v. d ; I$ u" j: T8 q( a0 R
private:
* ]9 Y* s5 A; Q1 m# u& N  I
9 }; I. g" u  ?6 d7 x            typedef Tetris*(TetrisFactory::*PMA)();
2 N, V, ]0 u3 v& s0 k+ D' W1 y& J$ h3 b+ b' Y
std::map<
char,PMA> m_sel2TetrisMap;
6 G- o: Z7 Y. `5 F% w+ O  ]

  {' m/ J$ M- \8 z8 L

% b$ G) x5 l2 i. ~4 ~1 v};! G, E' Z/ X; y3 F  f
# F& H5 r' S! Q% X" O
有兴趣的朋友可以下下来改改玩玩。/ X  m* s) @6 h: B" R" \

+ G  @: h9 D) ~/ S. m& c& tThat’s all!
( F/ g2 X: z! _5 { ) b. W, }) I4 p9 L' i# v1 t; o! N
Peter $ D7 B3 o+ d0 C
+ u% [3 H5 {# z$ D1 O: h3 F
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2026-1-18 19:19 , Processed in 0.061762 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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