一个打砖块的小游戏1.0 KILL THE BLOCKS !


/********************************************
* 程序名称:MR.DUAN 的打砖块(KILL THE BLOCKS !)
* 作 者:WindAutumn <duanxu@outlook.com>
* 最后修改:2012-8-11-PM
* 版 本 号:1.0
*
*// 好像有个BUG。。。间歇性发作,可能是编译器问题吧,不管了。。。
*
* *****************************************/ #include<stdio.h>
#include<Windows.h>
#include<conio.h> #define PI 3.1415926
#define LEFT 0
#define RIGHT34
#define UP 0
#define DOWN24
#define X_OFFSET 2
#define Y_OFFSET 1
#define BLOCK_MAP 0xffff// 砖块地图 unsigned short block[]= {};
char blocks[][]= {};
int arm_head=+X_OFFSET, arm_tail=+X_OFFSET; void HideCursor(HANDLE hBlock);
void GotoXY(HANDLE hBlock, int x, int y);
void InitScreen(HANDLE hBlock);
void GameStart();
void GameOver(HANDLE hBlock, int mode);
void PrintBlock(HANDLE hBlock);
void ChangeArm(HANDLE hBlock);
void PrintBall(HANDLE hBlock);
void KillBlock(HANDLE hBlock, int x, int y); void main()
{
system("color 7b");// 默认颜色,白色底色
SetConsoleTitle("KILL THE BLOCKS !");// 设置控制台标题
GameStart();// 开始游戏
} void GameStart()
{
int i; HANDLE hBlock = GetStdHandle(STD_OUTPUT_HANDLE);
HideCursor(hBlock);// 隐藏光标
InitScreen(hBlock);// 初始化屏幕
for(i=; i<; i++)
block[i]=BLOCK_MAP;
PrintBlock(hBlock);// 绘制砖块地图 GotoXY(hBlock, arm_head, DOWN - );// 以下3行打印托盘
for(i=; i<(arm_tail-arm_head)/+; i++)
printf("□"); PrintBall(hBlock);// 对小球的控制
} void InitScreen(HANDLE hBlock)// 初始化屏幕
{
int i;
SetConsoleTextAttribute(hBlock, FOREGROUND_INTENSITY | FOREGROUND_BLUE | BACKGROUND_BLUE |BACKGROUND_GREEN | BACKGROUND_RED);
// 白的背景色,亮蓝色前景色
GotoXY(hBlock, , );
printf("╔");
for(i=; i<RIGHT/; i++)
printf("═");
//printf("%2d",i);
printf("╗"); for(i=; i< DOWN; i++)
{
GotoXY(hBlock, , i);
//printf("%d",i);
printf("║");
GotoXY(hBlock, RIGHT, i);
printf("║");
} GotoXY(hBlock, , DOWN);
printf("╚");
for(i=; i<RIGHT/; i++)
printf("═");
printf("╝"); GotoXY(hBlock, , ); } void HideCursor(HANDLE hBlock)// 隐藏光标
{
CONSOLE_CURSOR_INFO cursor_info = {, };
SetConsoleCursorInfo(hBlock, &cursor_info);
} void GotoXY(HANDLE hBlock, int x, int y)
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(hBlock, coord);
} void PrintBlock(HANDLE hBlock)
{
int i,j;
for(i=; i<; i++)// 打印右侧数字视图
{
for(j=; j<; j++)
{
if(((block[i]<<j)&0x8000) == (unsigned short)0x8000)
blocks[i][j]=;
else blocks[i][j]=;
GotoXY(hBlock,+j,i);
printf("%d",blocks[i][j]);
}
}
for(i=; i<; i++)// 打印砖块
{
for(j=; j<; j++)
{
if(blocks[i][j]==)
{
GotoXY(hBlock,+*j,+i);
printf("□");
}
}
}
} void ChangeArm(HANDLE hBlock)
{
int key_direct=;
if(_kbhit())
{
key_direct = getch();
if(key_direct == 'a'&&arm_head > LEFT+)// 托盘往左走
{
arm_head -= ;
GotoXY(hBlock, arm_head, DOWN-);
printf("□");
GotoXY(hBlock, arm_tail, DOWN-);
printf(" ");
arm_tail -= ;
}
if(key_direct == 'd'&&arm_tail < RIGHT-)// 托盘向右走
{
arm_tail += ;
GotoXY(hBlock, arm_tail, DOWN-);
printf("□");
GotoXY(hBlock, arm_head, DOWN-);
printf(" ");
arm_head += ;
}
}
} void PrintBall(HANDLE hBlock)
{
int k,flag=;
int x = (arm_head+arm_tail)/, y =DOWN - ;// 球的坐标
int tempx = x,tempy = y;
int degree =;// 初始角度 GotoXY(hBlock, x, y);// 初始球坐标
printf("□");
while()
{
if(x == LEFT+ || x == RIGHT-)
degree = (degree<=)?(-degree):(-degree);// 碰左右边的角度计算
if(y == UP+)
degree = - degree;// 碰上边的角度计算
if(y == DOWN-)
{
if(!(x>=arm_head&&x<=arm_tail))// 没有碰上托盘的情况
GameOver(hBlock,);// 失败
else if(degree > )
{
if(x == (arm_head+arm_tail)/)
degree = - degree;// 计算碰托盘之后角度
else
degree = - degree + * ((arm_head+arm_tail)/ - x);
} }
switch(degree)// 根据角度确定方块移动方向
{
case :
case :
case :
tempx = x+;
tempy = y-;
break;
case :
tempx = x+;
tempy = y-;
break;
case :
tempx = x ;
tempy = y-;
break;
case :
tempx = x-;
tempy = y-;
break;
case :
tempx = x-;
tempy = y-;
break;
case :
case :
tempx = x-;
tempy = y+;
break;
case :
tempx = x-;
tempy = y+;
break;
case :
tempx = x ;
tempy = y+;
break;
case :
tempx = x+;
tempy = y+;
break;
case :
tempx = x+;
tempy = y+;
break;
} GotoXY(hBlock, tempx, tempy);// 下一个点在哪?
printf("□");
GotoXY(hBlock, x, y);// 消除上一个点
printf(" ");
x = tempx;
y = tempy; ChangeArm(hBlock);
KillBlock(hBlock,x,y);
for(k=; k<; k++)// 如果每行非0就置flag为1
if(block[k]!=(unsigned short)0x0000)
flag=;
if(flag==)// 如果flag为0则游戏胜利
GameOver(hBlock,);
flag=;
GotoXY(hBlock,,);// 打印坐标,角度信息
printf("%3d,%2d,%2d",degree,x,y);
Sleep();// 暂停0.1s *********************important
}
} void KillBlock(HANDLE hBlock, int x, int y)
{
int i,j;
unsigned short temp;
i=y-;
j=(x-)/;
if(blocks[i][j] == )
{
blocks[i][j] = ;
temp = ~(0x0001<<j);// 掩码
block[i]=block[i] & temp;// 将block信息与( 1111 1110 1111 1111 )进行与运算,消除bit位
GotoXY(hBlock,+j,i);// 刷新右侧数字区
printf("");
//GotoXY(hBlock,50,12+i);// 打印实时每行信息
//printf("%#x",block[j]);
}
} void GameOver(HANDLE hBlock, int mode)
{
GotoXY(hBlock,,);
if(mode)
printf("you win");
else
printf("you loss"); getch();
exit();
}
一个打砖块的小游戏1.0 KILL THE BLOCKS !的更多相关文章
- 软件工程:黄金G点小游戏1.0
我们要做的是黄金G点小游戏: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值. ...
- python写的battle ship小游戏 - 1.0
最近学python,这是今天写的一个小游戏. from random import randint class Board(object): board = [] def __init__(self, ...
- 一个很有意思的小游戏:Dig2China
最近通关了一个小游戏,游戏故事是这样的:一个美国小男孩想要去中国,他决定从自家后院往下挖,横穿地心去中国,期间经历了很多次失败.但是,每次尝试都能收获一批钱,用这些钱升级钻地机,调整自己的工具,终于在 ...
- 一听就懂:用Python做一个超简单的小游戏
写它会用到 while 循环random 模块if 语句输入输出函数
- HTML5存储(带一个粗糙的打怪小游戏案例)
本地存储localStorage设置存储内容setItem(key,value) localStorage.setItem('leo','23'); 更新存储内容对象[key]=value对象.key ...
- 一个控制台贪吃蛇小游戏(wsad控制移动)
/******************************************** * 程序名称:MR.DUAN 的贪吃蛇游戏(链表法) * 作 者:WindAutumn <flutti ...
- 2D命令行小游戏Beta1.0
前提: 遇到许多问题,没有参考大佬一些方法是敲不出来的...Orz using System; using System.Collections.Generic; using System.Linq; ...
- 简单的鼠标操作<一个填充格子的小游戏>
#include "graphics.h" #include "conio.h" void main(){ // 初始化界面 initgraph(, ); ; ...
- Unity小游戏制作 - 暗影随行
用Unity制作小游戏 - 暗影惊吓 最近玩了一个小游戏,叫做暗影惊吓,虽然是一个十分简单的小游戏,但是感觉还是十分有趣的.这里就用Unity来实现一个类似的游戏. 项目源码:DarkFollow 主 ...
随机推荐
- js在html中的加载执行顺序
1.加载顺序:引入标记<script />的出现顺序,依次加载 页面上的Javascript代码是HTML文档的一部分,所以Javascript在页面装载时执行的顺序就是其引入标记< ...
- php字符串常见面试题
>> 本文固定链接: http://php.ncong.com/mianshi/mianshiti_string.html >> 转载请注明: 恩聪php 2014年09月02 ...
- scrapy1.1入门用例简介
今天将scrapy安装成功,测试了下,倒腾了好长时间,才倒腾成功,特此分享. 其实最好的老师就是scrapy的帮助文档,只要把文档看懂,照着做,也就啥都会儿了! 帮助文档下载见http://downl ...
- sql如何向一个表中批量插入大量数据
--如果是一个表插入另外一个表.insert into tb1 需要的列名 select 按照前面写上需要的列名 from tb2 --如果两表结构一样.insert into tb1 * selec ...
- 转:mysql5.6.12 for Linux安装
原文链接:http://mmicky.blog.163.com/blog/static/1502901542013635317349/ 1:上www.mysql.org下载64位版本mysql5.6. ...
- [转载] $\mathrm{Jordan}$标准型的介绍
本文转载自陈洪葛的博客$,$ 而实际上来自xida博客朝花夕拾$,$ 可惜该博客已经失效 $\mathrm{Jordan}$ 标准形定理是线性代数中的基本定理$,$ 专门为它写一篇长文好像有点多余$: ...
- windows下和linux下 Redis 安装
Redis 是一个高性能的key-value数据库, 使用内存作为主存储,数据访问速度非常快,当然它也提供了两种机制支持数据持久化存储.比较遗憾的是,Redis项目不直接支持Windows,Windo ...
- (转载)偏序集的Dilworth定理学习
导弹拦截是一个经典问题:求一个序列的最长不上升子序列,以及求能最少划分成几组不上升子序列.第一问是经典动态规划,第二问直接的方法是最小路径覆盖, 但是二分图匹配的复杂度较高,我们可以将其转化成求最长上 ...
- java下载csv文件,中文标题
@RequestMapping(value = "/export.do") public void exportpushuserByareacode(HttpServletRequ ...
- DataSet、DataTable、DataRow、DataColumn区别及使用实例
DataSet 表示数据在内存中的缓存. 属性 Tables 获取包含在 DataSet 中的表的集合. ds.Tables["sjxx"] DataTable 表示内存中数据的 ...