首页 > 编程 > C > 正文

C语言实现俄罗斯方块

2020-01-26 11:44:45
字体:
来源:转载
供稿:网友

本文实例为大家分享了C语言俄罗斯方块的具体代码,供大家参考,具体内容如下

本代码运行环境是Windows下的VS2013
首先创建tetris.cpp
然后依次创建view.h以及view.cpp、model.h以及model.cpp。

代码如下:

view.h

#pragma once#include <stdio.h>void ShowBackground();void ShowBrick();void ShowGame();void OnLeft();void OnRight();void OnUp();void OnDown();

view.cpp

#include <stdlib.h>#include "view.h"#include "model.h"void OnLeft(){//如果能够左移,则左移 if (IsCanMove(g_nRow, g_nCol - 1)) { g_nCol--; ShowGame(); }}void OnRight(){ if (IsCanMove(g_nRow, g_nCol + 1)) { g_nCol++; ShowGame(); }}void OnUp(){ if (IsCanRotate()) { Rotate(); ShowGame(); }}void OnDown(){ if (IsCanMove(g_nRow+1, g_nCol)) { g_nRow++; ShowGame(); } else { //固定方块至背景,并且产生新方块 CombineBgBrick(); GetNewBrick(); //判断游戏是否结束,并给出对应提示 }}void ShowGame(){ system("cls"); CombineBgBrick(); ShowBackground(); DetachBgBrick();}void ShowBrick(){ for (size_t i = 0; i < 4; i++) { for (size_t j = 0; j < 4; j++) { if (g_chBrick[i][j] == 1) { printf("■"); } } printf("/r/n"); }}void ShowBackground(){ for (size_t nRow = 0; nRow < GAME_ROWS; nRow++) { for (size_t nCol = 0; nCol < GAME_COLS; nCol++) { if (g_chBackground[nRow][nCol] == 1) { printf("■"); } else { printf("□"); } } printf("/r/n"); }}

model.cpp

#include <stdio.h>#include <time.h>#include <stdlib.h>#include "model.h"char g_chBackground[GAME_ROWS][GAME_COLS];char g_chBrick[4][4];int g_nShape = 0; //是长条还是方块,系数为16int g_nRotate = 0; //朝向,系数为4int g_nRow = 0;int g_nCol = 0;char g_chBrickPool[][4] = {// 长条1, 1, 1, 1,0, 0, 0, 0,0, 0, 0, 0,0, 0, 0, 0,1, 0, 0, 0,1, 0, 0, 0,1, 0, 0, 0,1, 0, 0, 0,1, 1, 1, 1,0, 0, 0, 0,0, 0, 0, 0,0, 0, 0, 0,1, 0, 0, 0,1, 0, 0, 0,1, 0, 0, 0,1, 0, 0, 0,// T形1, 1, 1, 0,0, 1, 0, 0,0, 0, 0, 0,0, 0, 0, 0,0, 1, 0, 0,1, 1, 0, 0,0, 1, 0, 0,0, 0, 0, 0,0, 1, 0, 0,1, 1, 1, 0,0, 0, 0, 0,0, 0, 0, 0,1, 0, 0, 0,1, 1, 0, 0,1, 0, 0, 0,0, 0, 0, 0,//L形状1, 0, 0, 0,1, 0, 0, 0,1, 1, 0, 0,0, 0, 0, 0,1, 1, 1, 0,1, 0, 0, 0,0, 0, 0, 0,0, 0, 0, 0,1, 1, 0, 0,0, 1, 0, 0,0, 1, 0, 0,0, 0, 0, 0,0, 0, 1, 0,1, 1, 1, 0,0, 0, 0, 0,0, 0, 0, 0,};int IsCanRotate(){ char chNextShape[4][4] = { 0 }; int nNextRotate = (g_nRotate + 1) % 4; int nPoolRows = g_nShape * 16 + nNextRotate * 4; for (size_t nRow = 0; nRow < 4; nRow++) { for (size_t nCol = 0; nCol < 4; nCol++) { chNextShape[nRow][nCol] = g_chBrickPool[nRow + nPoolRows][nCol]; } } for (size_t nRow = 0; nRow < 4; nRow++) { for (size_t nCol = 0; nCol < 4; nCol++) { if (chNextShape[nRow][nCol] == 1) { if (g_chBackground[nRow + g_nRow][nCol + g_nCol] == 1) {  return 0; //不能移动 } } } } return 1;}void Rotate(){ g_nRotate = (g_nRotate + 1) % 4; int nPoolRows = g_nShape * 16 + g_nRotate*4; for (size_t nRow = 0; nRow < 4; nRow++) { for (size_t nCol = 0; nCol < 4; nCol++) { g_chBrick[nRow][nCol] = g_chBrickPool[nRow + nPoolRows][nCol]; } }}int IsCanMove(int nToRow, int nToCol){ for (size_t nRow = 0; nRow < 4; nRow++) { for (size_t nCol = 0; nCol < 4; nCol++) { if (g_chBrick[nRow][nCol] == 1) { if (g_chBackground[nRow + nToRow][nCol + nToCol] == 1) {  return 0; //不能移动 } } } } return 1;}void GetNewBrick(){ srand((unsigned)time(NULL)); g_nRow = 0; g_nCol = GAME_COLS / 2 - 1; int nShapeCount = sizeof(g_chBrickPool) / sizeof(g_chBrickPool[0]) /16; g_nShape = rand() % nShapeCount; g_nRotate = rand() % 4; int nPoolRows = g_nShape * 16 + g_nRotate * 4; for (size_t nRow = 0; nRow < 4; nRow++) { for (size_t nCol = 0; nCol < 4; nCol++) { g_chBrick[nRow][nCol] = g_chBrickPool[nRow+nPoolRows][nCol]; } }}void DetachBgBrick(){ for (size_t nRow = 0; nRow < 4; nRow++) { for (size_t nCol = 0; nCol < 4; nCol++) { if (g_chBrick[nRow][nCol] == 1) { g_chBackground[nRow + g_nRow][nCol + g_nCol] = 0; } } }}void CombineBgBrick(){//组合块 for (size_t nRow = 0; nRow < 4; nRow++) { for (size_t nCol = 0; nCol < 4; nCol++) { if (g_chBrick[nRow][nCol] == 1) { g_chBackground[nRow+g_nRow][nCol+g_nCol] = 1; } } }}void InitBackground(){//初始化背景 for (size_t nRow = 0; nRow < GAME_ROWS; nRow++) { for (size_t nCol = 0; nCol < GAME_COLS; nCol++) { if (nRow == GAME_ROWS - 1 || nCol == 0 || nCol == GAME_COLS - 1) { g_chBackground[nRow][nCol] = 1; } else { g_chBackground[nRow][nCol] = 0; } } }}

model.h

#pragma once#define GAME_ROWS 20#define GAME_COLS 12extern char g_chBackground[GAME_ROWS][GAME_COLS];extern char g_chBrick[4][4];extern int g_nRow;extern int g_nCol;void InitBackground();void GetNewBrick();void CombineBgBrick();void DetachBgBrick();int IsCanMove(int nToRow, int nToCol);void Rotate();int IsCanRotate();

tetris.cpp

#include "stdafx.h"#include <stdlib.h>#include <conio.h>#include <time.h>#include "model.h"#include "view.h"int main(int argc, char* argv[]){ InitBackground(); GetNewBrick(); CombineBgBrick(); ShowBackground(); DetachBgBrick(); char chInput = 0; clock_t clkStart = clock(); clock_t clkEnd = clock(); while (1) { clkEnd = clock(); if (clkEnd - clkStart > 1000) { clkStart = clkEnd; OnDown(); } if (_kbhit() != 0) { chInput = _getch(); } switch (chInput) { case 'a': OnLeft(); break; case 'w': OnUp(); break; case 's': OnDown(); break; case 'd': OnRight(); break; default: break; } chInput = 0; } return 0;}

更多关于俄罗斯方块的文章,请点击查看专题:《俄罗斯方块》

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选