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

俄罗斯方块

[复制链接]
发表于 2009-5-11 14:01:46 | 显示全部楼层 |阅读模式
TETRIS
大概一年半以前闲着无聊,于是就写了一个俄罗斯方块自娱自乐,程序运行如下图1所示:
. l) L' q  e# R  [
1- w1 {- u- B5 v( Q7 E0 y
完整的source code可以在附件下载。该程序使用WTL实现的,代码本身非常简单,无非是一些碰撞,变形等情况的判断调整。比较有意思的是程序使用了Factory Method用于创建方块,控制方块的变形。创建方块部分的设计类图如下所示:
/ `1 D/ v, D7 {
  L( x3 J5 b! t3 U+ {- O
4 w" T0 o4 i: J9 O! Z% y+ ~2 S
Factorycode如下:
, n2 }1 @% W" Q; s3 E% E
9 b$ `5 R' L) N3 l1 D: N3 f/*************************************
- C5 [3 E8 `9 E2 j8 l
3 q- y/ C0 n: y* author:hgf_starlovecpp@hotmail.com

& ?+ \1 w2 y+ g0 M. v" a9 A4 I4 C* R- m8 O
* version:1.0

0 V! X! h3 ~1 z
$ V/ G4 }7 H/ c* description: just for fun

' l+ ~' @- r1 n1 X# x8 X6 i8 s  Z1 F1 k4 ~  j- Z- x+ x
* todo: hard code exists need to fixed

8 \7 \4 E' z) S; l7 F. i: m  y2 |/ {
**************************************/

. J, @0 t4 _" x$ x' x7 h8 _: Q
' }' T& Y2 v( m; y  W#pragma once
1 B6 _- M6 T1 t9 c! \6 @/ O#include <map>) i' F1 H% C. M/ Z* K8 p$ {
#include "Tetris.h", Y$ g* @/ c& r, {! \. r" A4 `
#include "OneTetris.h"
+ b2 s: ~% ?3 n0 I  |% r#include "TwoTetris.h"2 c2 g: b/ s; ]8 q- {  N
#include "ThreeTetris.h"4 H) y% @' B0 ?, Q1 R' M  r
#include "FourTetris.h"
. c( G  z$ Q9 T5 T* {% g/ k, i% P  j# S#include "FiveTetris.h"
# I8 q" H8 K3 ^8 V& z* v#include "SixTetris.h"' ]2 R0 @5 b( A/ \. y- c3 o
#include "SevenTetris.h"
& Y) H' F7 P- d* b! E. ] $ {4 _9 l+ N+ r6 `
class TetrisFactory1 P) O: E: b' ?0 Y
{+ Y$ `; V5 E1 r  Q1 D, Z
public:
# T4 M- ]& _6 P- `4 M
- w5 `8 i/ ^- N, F6 B( J
. }' `$ \$ h0 D2 K. [TetrisFactory(
void)
" T* G+ f0 a& @; @" ]( {
1 K8 q1 y5 I+ B9 P1 T% f' J7 s5 C
{

/ `1 ]5 z2 p2 |2 T+ I- X6 A4 d5 P3 \& e
m_sel2TetrisMap[0] = &TetrisFactory::CreateOneTetris;

4 I* ^5 F# J4 q5 B
# l% a1 T" I1 Q$ K1 p, K$ R7 }% J' Gm_sel2TetrisMap[1] = &TetrisFactory::CreateTwoTetris;

  ?  i. c' r4 d! w! X) V, e* x7 E9 o4 d- |# A4 F
m_sel2TetrisMap[2] = &TetrisFactory::CreateThreeTetris;

( P/ g; j+ {) J; p# M0 @9 q, m) b% g
! j* m  c- j# |2 M4 I- u3 _m_sel2TetrisMap[3] = &TetrisFactory::CreateFourTetris;
7 K; R# K& e( S( }+ w, ]
7 j' N& P9 N7 [5 M7 ]! s
m_sel2TetrisMap[4] = &TetrisFactory::CreateFiveTetris;
% e% b( j3 r* s4 i7 y6 g
2 Z6 l5 N$ I6 b& Y( V9 D5 U
m_sel2TetrisMap[5] = &TetrisFactory::CreateSixTetris;

0 ~3 F$ O2 n. I3 K/ o6 J3 c# B( t3 O# a% R& _2 r* ~' j
m_sel2TetrisMap[6] = &TetrisFactory::CreateSevenTetris;
( l7 X& h0 z  v8 h- h. H2 [

% _4 D2 J' f9 W! }' b}

8 k7 L; ~2 j1 ^* b2 A# |9 Hpublic:
+ C2 l- H% f+ ~) L% @/ |8 p  [. \
. w2 m' H. c7 ~$ i6 ?: A: i/ s8 A/ d
7 d" p9 t( c* B$ D% E~TetrisFactory(
void)
' S/ f% n+ D0 p! e8 y" {/ C

3 D2 j0 C  }6 G) T! I( _{
/ q4 z! e! }4 B5 n$ J
1 Q9 J( B7 v6 ^' w8 D3 L
}

2 x9 P4 k. l/ K: J/ w
) }1 U+ j0 W9 g  @9 [4 ~Tetris* CreateTetris(
char sel)

) P; ^7 `" H* b
1 ]. Q$ K0 G% G, P4 `5 \{
# G$ v% r$ U, ]3 `
                        return (this->*(m_sel2TetrisMap.find(sel)->second))();
( h3 ~1 d* ~" Z8 `, p
. E6 _) f1 V- n! @+ S) T7 `}

; v6 M+ V% W9 k4 vprivate:
3 W: D- K4 ]& G/ R2 T  a# t7 x3 M0 U  ?) @: `: X8 c3 T/ j# j- N
3 z+ v% q5 ]3 j- [% Y4 b
" A2 F4 ~. R' W
Tetris* CreateOneTetris()
) B5 e/ q5 ]1 j+ O
& F: G+ j* r+ V5 h7 n' A! {7 e, T: e% f6 Y' w
{

: y, E8 q0 f9 z                        static OneTetris tetris;$ C: r9 n5 e5 P. t
2 M5 s9 C4 ?4 W; \' {: @
tetris.InitPos();
" Q3 Z* J4 I2 T9 F& s
                        return & tetris;( E/ n& o. F  C% N

4 P8 U$ f2 P7 T! ~}

0 b7 v( d* H+ G2 Y9 l
9 z" r& g4 \+ `3 t, ]" D" `* P
( E9 T# n, s  X7 M4 V' F

. @  }, r  E' z6 B* e7 A+ g1 P7 hTetris* CreateTwoTetris()

' K7 y& o2 F# e6 j& K1 `$ Y
% ?8 f8 W% D/ S: B$ ?5 M- G8 Z{

7 j( ~. E; s+ @- y" n4 z; c                        static TwoTetris tetris;% o" U: t2 L3 C- ^( b( e0 u
; y. U8 [8 J- M- c. F1 u
tetris.InitPos();

  t4 |, \- n' v                        return & tetris;
" b) D5 j. w7 ~5 r2 C
' x, b+ C. ^, r' {  |}
  f* e0 F  L/ K

5 J# a, {/ ?$ U1 q  n# H- s# b

. H/ i( }" a! S1 I. ^5 m* d! G' z# C5 I5 c/ \7 p
Tetris* CreateThreeTetris()

, l, b+ ~- ]# P& X9 Z  A# `- _- X- ?5 Z! t- N  M. d
{

; c2 `! M% Z9 x/ m, j. L; L                        static ThreeTetris tetris;  [0 g& B2 J9 i- Z

% n; @" u  x( v0 d9 ^# ftetris.InitPos();

( N( O0 r4 L5 f# J. z9 j$ y, R& h
+ A, T! {& f# Q" E
8 V, C# v9 a7 K& u3 a/ p2 L
return & tetris;
8 d' Y: S& I# e3 i) }

; h( k% }; r- Z8 W}
' c& f: _$ |- c# {" o8 N% Q* u) p3 ]
  B6 c& j& s" M

6 d$ U& u" _0 I) ~& V* a( H' S8 M, [3 Y7 ?
Tetris* CreateFourTetris()
* N4 ^3 G% Q6 R" D6 X7 R& M9 A( u. P
+ y7 l1 r6 \! x5 E7 |  y
{

) u+ @, q& A  L$ w                        static FourTetris tetris;
2 x5 R+ ^5 f' A! f  t' Y% V  V- R$ B/ d8 G! J7 @% W
tetris.InitPos();
' h) {' o$ W8 v. ?+ o( K
                        return & tetris;; z  R2 ^) u$ W% H0 A- j8 o9 u
" y& s" m  ^$ T' L
}
$ c% Q; ^3 @+ K" k% J& _

8 K; y: d7 ]0 G

9 K+ C$ {& s! t2 T: L/ y1 H  _! U) d6 z
Tetris* CreateFiveTetris()

: d8 @& W6 H( l3 G) Y& T/ R8 `* @" Z! ^$ H; [
{
$ W/ |1 u7 e8 o: h
                        static FiveTetris tetris;
$ _& T& u  R) V
6 r6 s2 ~! [7 E4 d) v0 Ytetris.InitPos();
0 w: s3 F3 w9 D4 d. K2 `, m
                        return & tetris;
- b) L# d: H, r2 _( ?
, }1 w/ C, x# t9 Q3 X1 E5 h}

4 C6 k  g6 a( W* o / L& ^6 W% \/ S* E

# F  }% ?/ U7 v% V, E% j/ v4 iTetris* CreateSixTetris()

% `1 I3 x! ~$ C7 k7 V/ d1 j1 L4 G
{

4 T1 Y5 M7 E, Z+ o( j1 O9 {& S                        static SixTetris tetris;
& x# W1 K6 |6 |8 V+ h! \: D" g1 V3 J: Y! R" z# j% P4 N* j/ r, A
tetris.InitPos();

! [" T0 b- I0 ~0 R) |3 N                        return & tetris;3 [8 U1 ~. e6 ~/ I3 V+ i
) U* O6 l% u4 O3 D+ U* u* I6 Z
}

; ~  f0 l8 Z; k3 F 5 Q4 Z9 u: E! ^7 G' [

/ b) z+ W% h" ?( m' P

: R' [- y& C* {% G
' a' ]' |% T# w3 U# J$ a# vTetris* CreateSevenTetris()

* b1 H% E2 T$ m; h6 e) k' `2 _5 ~7 \0 E, B0 O$ E* C6 J7 O: i/ D; y. R# E
{

) ]2 w, Z: p' y. E                        static SevenTetris tetris;% F4 u' N. T0 b

4 E6 z% S. u% L2 J" x% Stetris.InitPos();
, w, M/ {4 u  I. @% d/ g
                        return & tetris;" b! c- `0 r9 j2 V1 V

% C$ v0 O$ q3 p2 F: P3 D}
' s% H/ {5 }1 s6 ^0 Y3 \# E, O

% {. [1 [! M9 V! zprivate:
" z( T, y. [7 H! b$ T / s( l; }1 Y" H  J" b& u
            typedef Tetris*(TetrisFactory::*PMA)();
& A6 p1 q( z2 v& _. o3 X2 D- @2 P" H; W$ W2 J+ J1 T
std::map<
char,PMA> m_sel2TetrisMap;
: f- Q$ u& w3 Z( B' ]2 Y
7 \, K  B/ J  c! c- z1 h: y8 J  d3 F
1 P. K1 |4 }/ R& }( H: c
};
1 B4 f( [- f' b! O0 L( ?
2 z# L& |' d8 u有兴趣的朋友可以下下来改改玩玩。/ O( A7 m8 O; o! F3 r

& [3 s# @* h/ OThat’s all!- z$ f4 }/ U( m: A8 p( @) z1 f0 K4 O
; C* U8 E' h) Z( s  F
Peter - C4 o6 r4 b8 U  K0 u; @
6 S' Z, G( J( \" E  z5 g4 m
[ 本帖最后由 peterhu 于 2009-5-20 09:51 编辑 ]

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-6-3 07:01 , Processed in 0.033080 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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