c++实现俄罗斯方块游戏代码

俄罗斯方块c++

1.创建项目
2.总共需要创建两个文件,一个main.cpp,一个是elsfk2.h。本人使用的编译器是vs2019.

3.在项目的源文件夹下创建一个文件夹image

4.把下面两张图片重命名好放进刚创建的文件夹

elsfk.jpg

elsfk_block.jpg

5.把下列代码分别复制到对应文件中

-----------------------------------------------------------------------------------
以下是main.cpp 文件的内容

#include"elsfk2.h"

int main() {

	srand((int)time(0));
	//创建游戏窗口
	RenderWindow window(VideoMode(COL*18/*+100*/, ROW*18-36),"ELSFK");

	//添加游戏背景
	Texture t1,t2;
	t1.loadFromFile("image/elsfk.jpg");
	t2.loadFromFile("image/elsfk_block.jpg");
	Sprite sprite_Bg(t1);
	Sprite sprite_block(t2);

	NewBlock();

	Clock begin;
	float time1 = 0, time2 = 0;

	while (window.isOpen()) {

		time2 = begin.getElapsedTime().asSeconds();
		begin.restart();
		time1 += time2;
		//等待用户按下按键
		keyEvent(&window);

		if (time1 > delay) {

			time1 = 0;
			blockDrop();

		}

		delay = SPEED_NOM;

		window.draw(sprite_Bg);

		drawBlock(&sprite_block, &window);

		window.display();

	}

}

--------------------------------------------------------------------------------
以下为elsfk2.cpp

#pragma once
#include<SFML/Graphics.hpp>				//图像处理头文件
//#include<SFML/Audio.hpp>
#include<time.h>
using namespace sf;
#define ROW 22							//行
#define COL 10							//列
#define SPEED_NOM 0.5					//不加速运动的时间间隔
#define SPEED_QIK 0.05					//加速运动的时间间隔

int map[ROW][COL] = { 0 };				//游戏区域大小
int blocktype;							//方块类型
int Delete=0;							//删除的行数
float delay = SPEED_NOM;				//时间间隔

void Move_x(int);
void Rotate();
void ClearBlock();
void NewBlock();
void blockDrop();
void keyEvent(RenderWindow*);
void drawBlock(Sprite*, RenderWindow*);
bool check();

//存放7种方块的二维数组
int a[7][4] = {
	1,3,5,7,
	2,4,5,7,
	3,5,4,6,
	3,5,4,7,
	2,3,5,7,
	3,5,7,6,
	2,3,4,5,
};

//点的结构体
struct point {

	int x, y;

};

//当前方块
point block[4];
//方块的备份
point bakblock[4];

//处理按键
void keyEvent(RenderWindow *w) {
	Event e;
	bool rotate = 0;
	int x = 0;
	while (w->pollEvent(e)) {

		if (e.type == Event::Closed) {
			w->close();
		}

		if (e.type == Event::KeyPressed) {
			switch (e.key.code) {
			case Keyboard::Up:
				rotate = 1;
				break;
			case Keyboard::Left:
				x = -1;
				break;
			case Keyboard::Right:
				x = 1;
				break;
			default:
				break;
			}
		}
		if (Keyboard::isKeyPressed(Keyboard::Down)) {
			delay = SPEED_QIK;

		}

		if (x) {
			Move_x(x);
		}

		if (rotate) {
			Rotate();
		}

	}

}

//消除完成的行
void ClearBlock() {
	int k = ROW - 1;
	for (int i = ROW - 1; i > 0; i--) {
		int count = 0;
		for (int j = 0; j < COL; j++) {
			if (map[i][j]) {
				count++;
			}
			map[k][j] = map[i][j];

		}
		if (count < COL) {
			k--;
		}

	}

}

//检查移动合理性
bool check() {

	for (int i = 0; i < 4; i++){
		if(	  block[i].x<0||block[i].x>=COL||block[i].y>=ROW||
		map[block[i].y][block[i].x]){
			return 0;
		}
	}
	return 1;

}

//方块降落
void blockDrop() {

	for (int i = 0; i < 4; i++) {
		bakblock[i] = block[i];
		block[i].y++;

	}

	if (!check()) {
		for (int j = 0; j < 4; j++){
			map[bakblock[j].y][bakblock[j].x] = blocktype;
		}

		NewBlock();
		ClearBlock();
	}

}

//左右移动
void Move_x(int x) {

	for (int  i = 0; i < 4; i++){
		bakblock[i] = block[i];
		block[i].x += x;

	}
	if (!check()) {
		for (int i = 0; i < 4; i++) {
			block[i] = bakblock[i];

		}
	}

}

//旋转******************************    important
void Rotate() {
	if (blocktype == 7) {
		return;
	}
	point p = block[1];
	for (int i = 0; i < 4; i++) {
		bakblock[i] = block[i];
		block[i].x = p.x - bakblock[i].y + p.y;
		block[i].y = bakblock[i].x - p.x + p.y;
	}
	if (!check()) {
		for (int i = 0; i < 4; i++) {
			block[i] = bakblock[i];
		}
	}

}

//生成方块
void NewBlock() {

	blocktype = 1 + rand() % 7;

	for (int i = 0; i < 4; i++) {
		block[i].x = a[blocktype-1][i] % 2+4;
		block[i].y = a[blocktype-1][i] / 2;
	}

}

//绘制方块
void drawBlock(Sprite *b, RenderWindow *w) {

	//完成的方块
	for (int i = 0; i < ROW; i++) {
		for (int j = 0; j < COL; j++) {
			if (map[i][j] != 0) {
				b->setTextureRect(IntRect(map[i][j]*18,0,18,18));
				b->setPosition(j * 18, i * 18);
				b->move(0, -36);
				w->draw(*b);
			}

		}

	}

	for (int j = 0; j < 4; j++)
	{
		b->setTextureRect(IntRect(blocktype * 18, 0, 18, 18));
		b->setPosition(block[j].x * 18, block[j].y * 18);
		b->move(0, -36);
		w->draw(*b);
	}

}

到此这篇关于c++实现俄罗斯方块游戏代码的文章就介绍到这了,更多相关c++俄罗斯方块内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++实现俄罗斯方块小游戏

    本文实例为大家分享了C++实现俄罗斯方块小游戏的具体代码,供大家参考,具体内容如下 操作说明: D F:左右旋转 J  L:左右移动 E(一堆键都行): 加快下落速度 空格: 开始游戏 与 一落到底 上代码! #include <cstdio> #include <cstdlib> #include <cstring> #include <windows.h> #include <ctime> #include <conio.h> #

  • C++实现俄罗斯方块游戏

    本文实例为大家分享了C++实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 使用VS2017编译 思路: 1.打印出游戏地图,也就是设计游戏地图类game_interdace,包括设计游戏开始界面的函数,游戏地图界面的函数,游戏结束界面的函数,以及设计一些辅助函数如(设置光标为目标点,改变颜色,隐藏光标)来完成上述设计. 2.设计方块图形类,包括生成图形,清理图形,图形移动,图形停止的处理,图形的消失(实质是得分)等. #include <iostream> #include<co

  • C++实现俄罗斯方块

    本文实例为大家分享了C++实现俄罗斯方块的具体代码,供大家参考,具体内容如下 工具:vc++2010,图库:EasyX 先看效果图片 纯手写,没有面向对象思想,看全部源码 #include <stdio.h> #include <graphics.h> #include <time.h> #include <conio.h> #define BLOCK_COUNT 5 #define BLOCK_WIDTH 5 #define BLOCK_HEIGHT 5

  • C++实现俄罗斯方块源码

    本文实例为大家分享了C++实现俄罗斯方块的具体代码,供大家参考,具体内容如下 先是效果图: 主菜单: 游戏: 设置: 错误处理: 代码: #include <iostream.h> #include <conio.h> #include <stdio.h> #include <windows.h> #include <fstream.h> #include <time.h> #include <cstring> #prag

  • C++实现俄罗斯方块(windows API)

    本文分享的这些俄罗斯方块代码是我最近放假在家里自己写的,虽然以前有过看别人写的代码,但是那个游戏代码好像不是很全面,因为无法实现全部的方块和实现随机的产生任意方向的方块,现在也基本上是忘光了当时的代码,下面的这些代码是我最近写的,没有参考其他人的代码,真正写俄罗斯方块起来感觉真的是挺难的,关键是在于方块的旋转.当然下面的代码仅仅是一个框架,只能够实现大致上的功能,还不全面,贴出来和大家交流学习. 编译器是code::block  +  MinGW ,感觉CB这个IDE真的是太强大,太棒了,下面的

  • c++实现俄罗斯方块游戏代码

    俄罗斯方块c++ 1.创建项目2.总共需要创建两个文件,一个main.cpp,一个是elsfk2.h.本人使用的编译器是vs2019. 3.在项目的源文件夹下创建一个文件夹image 4.把下面两张图片重命名好放进刚创建的文件夹 elsfk.jpg elsfk_block.jpg 5.把下列代码分别复制到对应文件中 ----------------------------------------------------------------------------------- 以下是main

  • shell脚本编写的俄罗斯方块游戏代码

    粘贴以下代码到一个空的Shell脚本文件中,并在Bash 中运行即可! 复制代码 代码如下: #!/bin/bash # Tetris Game# 10.21.2003 xhchen<[email]xhchen@winbond.com.tw[/email]> #APP declarationAPP_NAME="${0##*[\\/]}"APP_VERSION="1.0" #颜色定义cRed=1cGreen=2cYellow=3cBlue=4cFuchsi

  • Python使用pygame模块编写俄罗斯方块游戏的代码实例

    文章先介绍了关于俄罗斯方块游戏的几个术语. 边框--由10*20个空格组成,方块就落在这里面. 盒子--组成方块的其中小方块,是组成方块的基本单元. 方块--从边框顶掉下的东西,游戏者可以翻转和改变位置.每个方块由4个盒子组成. 形状--不同类型的方块.这里形状的名字被叫做T, S, Z ,J, L, I , O.如下图所示: 模版--用一个列表存放形状被翻转后的所有可能样式.全部存放在变量里,变量名字如S_SHAPE_TEMPLATE or J_SHAPE_TEMPLATE 着陆--当一个方块

  • 使用JS代码实现俄罗斯方块游戏

    简单的JS俄罗斯方块游戏源码,先给大家展示下效果图,如果大家感觉不错,请参考实现代码, 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>使用JS实现俄罗斯方块游戏</title> <style type="text/css"> .MainFrame { border: 1px

  • JavaScript 俄罗斯方块游戏实现方法与代码解释

    本文实例讲述了JavaScript 俄罗斯方块游戏.分享给大家供大家参考,具体如下: 俄罗斯方块代码说明 /** 名称:Javascript 俄罗斯方块! 作者:Gloot 邮箱:glootz@gmail.com QQ:345268267 网站:http://www.cnblogs.com/editor/ */ OLSFK = {}; 本俄罗斯方块代码采用 JavaScript 脚本代码写成,简单易懂: 全代码采用静态类及静态变量成员组成: 全脚本通过实现代码全局配置 OLSFK.Options

  • Java实现俄罗斯方块游戏的示例代码

    目录 引言 效果图 实现思路 代码实现 创建窗口 画布1 创建菜单及菜单选项 绘制游戏区域 画布2 画布2绘制一个小方块 创建图形 创建模型类 模型旋转变形 方块累计 方块消除和积分 加入自动向下线程,并启动 引言 俄罗斯方块,相信很多80.90后的小伙伴都玩过,也是当年非常火的游戏,当年读中学的时候,有一个同学有这个游戏机,大家都很喜欢玩,这个游戏给当时的我们带来了很多欢乐,时光飞逝,感慨颇多! 人终归是要长大的,回忆再美好,日子也一去不复返了,以前我们只会玩游戏,心里想自己能做一个出来多牛逼

  • 用Python编写一个简单的俄罗斯方块游戏的教程

    俄罗斯方块游戏,使用Python实现,总共有350+行代码,实现了俄罗斯方块游戏的基本功能,同时会记录所花费时间,消去的总行数,所得的总分,还包括一个排行榜,可以查看最高记录. 排行榜中包含一系列的统计功能,如单位时间消去的行数,单位时间得分等. 附源码: from Tkinter import * from tkMessageBox import * import random import time #俄罗斯方块界面的高度 HEIGHT = 18 #俄罗斯方块界面的宽度 WIDTH = 10

  • JavaScript实现俄罗斯方块游戏过程分析及源码分享

    观摩一下<编程之美>:"程序虽然很难写,却很美妙.要想把程序写好,需要写好一定的基础知识,包括编程语言.数据结构与算法.程序写得好,需要缜密的逻辑思维能力和良好的梳理基础,而且熟悉编程环境和编程工具." 学了几年的计算机,你有没有爱上编程.话说,没有尝试自己写过一个游戏,算不上热爱编程. 俄罗斯方块曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事,它看似简单但却变化无穷,令人上瘾.相信大多数同学,曾经为它痴迷得茶不思饭不想. 游戏规则 1.一个用于摆放小型正方形的平

  • 一个MIDP俄罗斯方块游戏的设计和实现

    文章来源:csdn 作者:陈万飞 作者简介 陈万飞,男,中南大学数软系学士,曾任北京长城软件高级程序员,系统分析师.有较为丰富的j2se,j2ee开发经验.目前致力于j2me研究工作.可通过chen_cwf@163.net与他联系 摘要 本文给出了一个基于MIDP1.0的俄罗斯方块游戏的设计方案,并给出全部实现源代码.该游戏的最大特色是屏幕自适应,无论各种手机,PDA的屏幕大小如何,该游戏总是能获得最佳的显示效果.游戏在J2me wireless toolkit 2.1的4种模拟器上测试通过.

  • C++俄罗斯方块游戏 无需图形库的俄罗斯方块

    本文实例为大家分享了C++俄罗斯方块游戏的具体实现代码,供大家参考,具体内容如下. #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<time.h> #include<conio.h> #define MOD 28 #define SIZE_N 19 #define SIZE_M 12 int cur_x,cur_y; int score,mark,next,map

随机推荐