目录
飞机大战
#include<iostream>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<string>
using namespace std;
/*=============== all the structures ===============*/
typedef struct Frame
{
COORD position[2];
int flag;
}Frame;
/*=============== all the functions ===============*/
void SetPos(COORD a)// set cursor
{
HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(out, a);
}
void SetPos(int i, int j)// set cursor
{
COORD pos={i, j};
SetPos(pos);
}
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
//把第y行,[x1, x2) 之间的坐标填充为 ch
void drawRow(int y, int x1, int x2, char ch)
{
SetPos(x1,y);
for(int i = 0; i <= (x2-x1); i++)
cout<<ch;
}
//在a, b 纵坐标相同的前提下,把坐标 [a, b] 之间填充为 ch
void drawRow(COORD a, COORD b, char ch)
{
if(a.Y == b.Y)
drawRow(a.Y, a.X, b.X, ch);
else
{
SetPos(0, 25);
cout<<"error code 01:无法填充行,因为两个坐标的纵坐标(x)不相等";
system("pause");
}
}
//把第x列,[y1, y2] 之间的坐标填充为 ch
void drawCol(int x, int y1, int y2, char ch)
{
int y=y1;
while(y!=y2+1)
{
SetPos(x, y);
cout<<ch;
y++;
}
}
//在a, b 横坐标相同的前提下,把坐标 [a, b] 之间填充为 ch
void drawCol(COORD a, COORD b, char ch)
{
if(a.X == b.X)
drawCol(a.X, a.Y, b.Y, ch);
else
{
SetPos(0, 25);
cout<<"error code 02:无法填充列,因为两个坐标的横坐标(y)不相等";
system("pause");
}
}
//左上角坐标、右下角坐标、用row填充行、用col填充列
void drawFrame(COORD a, COORD b, char row, char col)
{
drawRow(a.Y, a.X+1, b.X-1, row);
drawRow(b.Y, a.X+1, b.X-1, row);
drawCol(a.X, a.Y+1, b.Y-1, col);
drawCol(b.X, a.Y+1, b.Y-1, col);
}
void drawFrame(int x1, int y1, int x2, int y2, char row, char col)
{
COORD a={x1, y1};
COORD b={x2, y2};
drawFrame(a, b, row, col);
}
void drawFrame(Frame frame, char row, char col)
{
COORD a = frame.position[0];
COORD b = frame.position[1];
drawFrame(a, b, row, col);
}
void drawPlaying()
{
drawFrame(0, 0, 48, 24, '=', '|');// draw map frame;
drawFrame(49, 0, 79, 4, '-', '|');// draw output frame
drawFrame(49, 4, 79, 9, '-', '|');// draw score frame
drawFrame(49, 9, 79, 20, '-', '|');// draw operate frame
drawFrame(49, 20, 79, 24, '-', '|');// draw other message frame
SetPos(52, 6);
cout<<"得分:";
SetPos(52, 7);
cout<<"称号:";
SetPos(52,10);
cout<<"操作方式:";
SetPos(52,12);
cout<<" a,s,d,w 控制战机移动。";
SetPos(52,14);
cout<<" p 暂停游戏。";
SetPos(52,16);
cout<<" e 退出游戏。";
}
//在[a, b)之间产生一个随机整数
int random(int a, int b)
{
int c=(rand() % (a-b))+ a;
return c;
}
//在两个坐标包括的矩形框内随机产生一个坐标
COORD random(COORD a, COORD b)
{
int x=random(a.X, b.X);
int y=random(a.Y, b.Y);
COORD c={x, y};
return c;
}
bool judgeCoordInFrame(Frame frame, COORD spot)
{
if(spot.X>=frame.position[0].X)
if(spot.X<=frame.position[1].X)
if(spot.Y>=frame.position[0].Y)
if(spot.Y<=frame.position[0].Y)
return true;
return false;
}
void printCoord(COORD a)
{
cout <<"( "<<a.X<<" , "<<a.Y<<" )";
}
void printFrameCoord(Frame a)
{
printCoord(a.position[0]);
cout <<" - ";
printCoord(a.position[1]);
}
int drawMenu()
{
SetPos(30, 1);
cout<<"P l a n e W a r";
drawRow(3, 0, 79, '-');
drawRow(5, 0, 79, '-');
SetPos(28, 4);
cout<<"w 和 s 选择, k 确定";
SetPos(15, 11);
cout<<"1. 简单的敌人";
SetPos(15, 13);
cout<<"2. 冷酷的敌人";
drawRow(20, 0, 79, '-');
drawRow(22, 0, 79, '-');
SetPos(47, 11);
cout<<"简单的敌人:";
SetPos(51, 13);
cout<<"简单敌人有着较慢的移动速度。";
SetPos(24, 21);
cout<<"制作:<bits/stdc++.h>";
int j=11;
SetPos(12, j);
cout<<">>";
//drawFrame(45, 9, 79, 17, '=', '|');
while(1)
{ if( _kbhit() )
{
char x=_getch();
switch (x)
{
case 'w' :
{
if( j == 13)
{
SetPos(12, j);
cout<<" ";
j = 11;
SetPos(12, j);
cout<<">>";
SetPos(51, 13);
cout<<" ";
SetPos(47, 11);
cout<<"简单的敌人:";
SetPos(51, 13);
cout<<"简单敌人有较慢的移动速度,比较容易对付";
}
break;
}
case 's' :
{
if( j == 11 )
{
SetPos(12, j);
cout<<" ";
j = 13;
SetPos(12, j);
cout<<">>";
SetPos(51, 13);
cout<<" ";
SetPos(47, 11);
cout<<"冷酷的敌人:";
SetPos(51, 13);
cout<<"冷酷的敌人移动速度较快,不是很好对付哟。";
}
break;
}
case 'k' :
{
if (j == 8) return 1;
else return 2;
}
}
}
}
}
/*
DWORD WINAPI MusicFun(LPVOID lpParamte)
{
//DWORD OBJ;
sndPlaySound(TEXT("bgm.wav"), SND_FILENAME|SND_ASYNC);
return 0;
}
*/
/*================== the Game Class ==================*/
class Game
{
public:
COORD position[10];
COORD bullet[10];
Frame enemy[8];
int score;
int rank;
int rankf;
string title;
int flag_rank;
Game ();
//初始化所有
void initPlane();
void initBullet();
void initEnemy();
//初始化其中一个
//void initThisBullet( COORD );
//void initThisEnemy( Frame );
void planeMove(char);
void bulletMove();
void enemyMove();
//填充所有
void drawPlane();
void drawPlaneToNull();
void drawBullet();
void drawBulletToNull();
void drawEnemy();
void drawEnemyToNull();
//填充其中一个
void drawThisBulletToNull( COORD );
void drawThisEnemyToNull( Frame );
void Pause();
void Playing();
void judgePlane();
void judgeEnemy();
void Shoot();
void GameOver();
void printScore();
};
Game::Game()
{
initPlane();
initBullet();
initEnemy();
score = 0;
rank = 25;
rankf = 0;
flag_rank = 0;
}
void Game::initPlane()
{
COORD centren={39, 22};
position[0].X=position[5].X=position[7].X=position[9].X=centren.X;
position[1].X=centren.X-2;
position[2].X=position[6].X=centren.X-1;
position[3].X=position[8].X=centren.X+1;
position[4].X=centren.X+2;
for(int i=0; i<=4; i++)
position[i].Y=centren.Y;
for(int i=6; i<=8; i++)
position[i].Y=centren.Y+1;
position[5].Y=centren.Y-1;
position[9].Y=centren.Y-2;
}
void Game::drawPlane()
{
for(int i=0; i<9; i++)
{
SetPos(position[i]);
if(i!=5)
cout<<"O";
else if(i==5)
cout<<"|";
}
}
void Game::drawPlaneToNull()
{
for(int i=0; i<9; i++)
{
SetPos(position[i]);
cout<<" ";
}
}
void Game::initBullet()
{
for(int i=0; i<10; i++)
bullet[i].Y = 30;
}
void Game::drawBullet()
{
for(int i=0; i<10; i++)
{
if( bullet[i].Y != 30)
{
SetPos(bullet[i]);
cout<<"^";
}
}
}
void Game::drawBulletToNull()
{
for(int i=0; i<10; i++)
if( bullet[i].Y != 30 )
{
COORD pos={bullet[i].X, bullet[i].Y+1};
SetPos(pos);
cout<<" ";
}
}
void Game::initEnemy()
{
COORD a={1, 1};
COORD b={45, 15};
for(int i=0; i<8; i++)
{
enemy[i].position[0] = random(a, b);
enemy[i].position[1].X = enemy[i].position[0].X + 3;
enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
}
}
void Game::drawEnemy()
{
for(int i=0; i<8; i++)
drawFrame(enemy[i].position[0], enemy[i].position[1], '-', '|');
}
void Game::drawEnemyToNull()
{
for(int i=0; i<8; i++)
{
drawFrame(enemy[i].position[0], enemy[i].position[1], ' ', ' ');
}
}
void Game::Pause()
{
SetPos(61,2);
cout<<" ";
SetPos(61,2);
cout<<"暂停中...";
char c=_getch();
while(c!='p')
c=_getch();
SetPos(61,2);
cout<<" ";
}
void Game::planeMove(char x)
{
if(x == 'a')
if(position[1].X != 1)
for(int i=0; i<=9; i++)
position[i].X -= 2;
if(x == 's')
if(position[7].Y != 23)
for(int i=0; i<=9; i++)
position[i].Y += 1;
if(x == 'd')
if(position[4].X != 47)
for(int i=0; i<=9; i++)
position[i].X += 2;
if(x == 'w')
if(position[5].Y != 3)
for(int i=0; i<=9; i++)
position[i].Y -= 1;
}
void Game::bulletMove()
{
for(int i=0; i<10; i++)
{
if( bullet[i].Y != 30)
{
bullet[i].Y -= 1;
if( bullet[i].Y == 1 )
{
COORD pos={bullet[i].X, bullet[i].Y+1};
drawThisBulletToNull( pos );
bullet[i].Y=30;
}
}
}
}
void Game::enemyMove()
{
for(int i=0; i<8; i++)
{
for(int j=0; j<2; j++)
enemy[i].position[j].Y++;
if(24 == enemy[i].position[1].Y)
{
COORD a={1, 1};
COORD b={45, 3};
enemy[i].position[0] = random(a, b);
enemy[i].position[1].X = enemy[i].position[0].X + 3;
enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
}
}
}
void Game::judgePlane()
{
for(int i = 0; i < 8; i++)
for(int j=0; j<9; j++)
if(judgeCoordInFrame(enemy[i], position[j]))
{
SetPos(62, 1);
cout<<"坠毁";
drawFrame(enemy[i], '+', '+');
Sleep(1000);
GameOver();
break;
}
}
void Game::drawThisBulletToNull( COORD c)
{
SetPos(c);
cout<<" ";
}
void Game::drawThisEnemyToNull( Frame f )
{
drawFrame(f, ' ', ' ');
}
void Game::judgeEnemy()
{
for(int i = 0; i < 8; i++)
for(int j = 0; j < 10; j++)
if( judgeCoordInFrame(enemy[i], bullet[j]) )
{
score += 5;
drawThisEnemyToNull( enemy[i] );
COORD a={1, 1};
COORD b={45, 3};
enemy[i].position[0] = random(a, b);
enemy[i].position[1].X = enemy[i].position[0].X + 3;
enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
drawThisBulletToNull( bullet[j] );
bullet[j].Y = 30;
}
}
void Game::Shoot()
{
for(int i=0; i<10; i++)
if(bullet[i].Y == 30)
{
bullet[i].X = position[5].X;
bullet[i].Y = position[5].Y-1;
break;
}
}
void Game::printScore()
{
if(score == 120 && flag_rank == 0)
{
rank -= 3;
flag_rank = 1;
}
else if( score == 360 && flag_rank == 1)
{
rank -= 5;
flag_rank = 2;
}
else if( score == 480 && flag_rank == 2)
{
rank -= 5;
flag_rank = 3;
}
int x=rank/5;
SetPos(60, 6);
cout<<score;
if( rank!=rankf )
{
SetPos(60, 7);
if( x == 5)
title="初级飞行员";
else if( x == 4)
title="中级飞行员";
else if( x == 3)
title="高级飞行员";
else if( x == 2 )
title="王牌飞行员";
cout<<title;
}
rankf = rank;
}
void Game::Playing()
{
//HANDLE MFUN;
//MFUN= CreateThread(NULL, 0, MusicFun, NULL, 0, NULL);
drawEnemy();
drawPlane();
int flag_bullet = 0;
int flag_enemy = 0;
while(1)
{
Sleep(8);
if(_kbhit())
{
char x = _getch();
if ('a' == x || 's' == x || 'd' == x || 'w' == x)
{
drawPlaneToNull();
planeMove(x);
drawPlane();
judgePlane();
}
else if ('p' == x)
Pause();
else if( 'k' == x)
Shoot();
else if( 'e' == x)
{
//CloseHandle(MFUN);
GameOver();
break;
}
}
/* 处理子弹 */
if( 0 == flag_bullet )
{
bulletMove();
drawBulletToNull();
drawBullet();
judgeEnemy();
}
flag_bullet++;
if( 5 == flag_bullet )
flag_bullet = 0;
/* 处理敌人 */
if( 0 == flag_enemy )
{
drawEnemyToNull();
enemyMove();
drawEnemy();
judgePlane();
}
flag_enemy++;
if( flag_enemy >= rank )
flag_enemy = 0;
/* 输出得分 */
printScore();
}
}
void Game::GameOver()
{
system("cls");
COORD p1={28,9};
COORD p2={53,15};
drawFrame(p1, p2, '=', '|');
SetPos(36,12);
string str="Game Over!";
for(int i=0; i<str.size(); i++)
{
Sleep(80);
cout<<str[i];
}
Sleep(1000);
system("cls");
drawFrame(p1, p2, '=', '|');
SetPos(31, 11);
cout<<"击落敌机:"<<score/5<<" 架";
SetPos(31, 12);
cout<<"得 分:"<<score;
SetPos(31, 13);
cout<<"获得称号:"<<title;
SetPos(30, 16);
Sleep(1000);
cout<<"继续? 是(y)| 否(n)制作:<bits/stdc++.h>";
as:
char x=_getch();
if (x == 'n')
exit(0);
else if (x == 'y')
{
system("cls");
Game game;
int a = drawMenu();
if(a == 2)
game.rank = 20;
system("cls");
drawPlaying();
game.Playing();
}
else goto as;
}
/*================== the main function ==================*/
int main()
{
//游戏准备
srand((int)time(0)); //随机种子
HideCursor(); //隐藏光标
Game game;
int a = drawMenu();
if(a == 2)
game.rank = 20;
system("cls");
drawPlaying();
game.Playing();
}
贪吃蛇
/************************贪吃蛇***********************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include <cmath>
#include <windows.h>
using namespace std;
/*** 光标定位 ***/
HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
void locate(int x,int y) {
coord.X=y;
coord.Y=x;
SetConsoleCursorPosition(hout,coord);
};
/*** 隐藏光标 ***/
void hide() {
CONSOLE_CURSOR_INFO cursor_info= {1,0};
SetConsoleCursorInfo(hout, &cursor_info);
}
/*** 生成随机数 ***/
double random(double start, double end) {
return start+(end-start)*rand()/(RAND_MAX + 1.0);
}
/*** 定义地图的长宽,蛇的坐标,长度,方向,食物的位置 ***/
int m,n;
struct node {
int x,y;
} snake[1000];
int snake_length,dir;
node food;
int direct[4][2]= {{-1,0},{1,0},{0,-1},{0,1}};
/*** 输出墙 ***/
void print_wall() {
cout << " ";
for (int i=1; i<=n; i++)
cout << "-";
cout << endl;
for (int j=0; j<=m-1; j++) {
cout << "|";
for (int i=1; i<=n; i++) cout << " ";
cout << "|" << endl;
}
cout << " ";
for (int i=1; i<=n; i++)
cout << "-";
}
/*** 首次输出蛇,其中snake[0]代表头 ***/
void print_snake() {
locate(snake[0].x,snake[0].y);
cout << "@";
for (int i=1; i<=snake_length-1; i++) {
locate(snake[i].x,snake[i].y);
cout << "*";
}
}
/*** 判断是否撞墙或者自撞 ***/
bool is_correct() {
if (snake[0].x==0 || snake[0].y==0 || snake[0].x==m+1 || snake[0].y==n+1) return false;
for (int i=1; i<=snake_length-1; i++) {
if (snake[0].x==snake[i].x && snake[0].y==snake[i].y) return false;
}
return true;
}
/*** 随机生成并输出食物位置 ***/
bool print_food() {
srand((unsigned)time(0));
bool e;
while (1) {
e=true;
int i=(int) random(0,m)+1,j=(int) random(0,n)+1;
food.x=i;
food.y=j;
for (int k=0; k<=snake_length-1; k++) {
if (snake[k].x==food.x && snake[k].y==food.y) {
e=false;
break;
}
}
if (e) break;
}
locate(food.x,food.y);
cout << "$";
return true;
}
/*** 蛇的前进 ***/
bool go_ahead() {
node temp;
bool e=false;
temp=snake[snake_length-1];
for (int i=snake_length-1; i>=1; i--)
snake[i]=snake[i-1];
snake[0].x+=direct[dir][0];
snake[0].y+=direct[dir][1];
locate(snake[1].x,snake[1].y);
cout << "*";
/*** 吃到了食物 ***/
if (snake[0].x==food.x && snake[0].y==food.y) {
snake_length++;
e=true;
snake[snake_length-1]=temp;
}
/*** 输出此时蛇状态 ***/
if (!e) {
locate(temp.x,temp.y);
cout << " ";
} else
print_food();
locate(snake[0].x,snake[0].y);
cout << "@";
/*** 如果自撞 ***/
if (!is_correct()) {
system("cls");
cout << "You lose!" << endl << "Length: " << snake_length << endl;
return false;
}
return true;
}
/*** 主函数 ***/
int main() {
cout << "--------------------贪吃蛇---------------------" << endl;
cout << "请先输入两个数,表示地图大小.要求长宽均不小于10." << endl;
cout << "请注意窗口大小,以免发生错位.建议将窗口调为最大." << endl;
cout << "再选择难度.请在1-10中输入1个数,1最简单,10则最难" << endl;
cout << "然后进入游戏画面,以方向键控制方向.祝你游戏愉快!" << endl;
cout << "-----------------------------------------------" << endl;
cin >> m >> n;
if (m<10 || n<10 || m>25 || n>40) {
cout << "ERROR" << endl;
system("pause");
return 0;
}
int hard;
cin >> hard;
if (hard<=0 || hard>100) {
cout << "ERROR" << endl;
system("pause");
return 0;
}
/*** 数据全部初始化,包括蛇长,位置,方向 ***/
snake_length=5;
clock_t a,b;
char ch;
double hard_len;
for (int i=0; i<=4; i++) {
snake[i].x=1;
snake[i].y=5-i;
}
dir=3;
/*** 输出初始地图,蛇与食物 ***/
system("cls");
hide();
print_wall();
print_food();
print_snake();
locate(m+2,0);
cout << "Now length: ";
/*** 开始游戏 ***/
while (1) {
/*** 难度随长度增加而提高 ***/
hard_len=(double)snake_length/(double) (m*n);
/*** 调节时间,单位是ms ***/
a=clock();
while (1) {
b=clock();
if (b-a>=(int)(400-30*hard)*(1-sqrt(hard_len))) break;
}
/*** 接受键盘输入的上下左右,并以此改变方向 ***/
if (kbhit()) {
ch=getch();
if (ch==-32) {
ch=getch();
switch(ch) {
case 72:
if (dir==2 || dir==3)
dir=0;
break;
case 80:
if (dir==2 || dir==3)
dir=1;
break;
case 75:
if (dir==0 || dir==1)
dir=2;
break;
case 77:
if (dir==0 || dir==1)
dir=3;
break;
}
}
}
/*** 前进 ***/
if (!go_ahead()) break;
/*** 在最后输出此时长度 ***/
locate(m+2,12);
cout << snake_length;
}
system("pause");
return 0;
}
打怪游戏
#include<bits/stdc++.h>
#include<conio.h>
#include<windows.h>
using namespace std;
double shanghai[20]= {0.6,1.1,2,3.16,5.5,7,10,20,50,100,146.23,254.13,312,403,601,1023};
double bosshealth[20]= {2,3,4,5.9,8,14,19,32,73,157,200,403,801,1200,3630,20123};
double wj_shanghai=1,wj_health=10,wj_max_health=10,boss,wj_money=0;
void chushihua();
void game();
void gongji();
void goumai();
void shangdian();
void zhujiemian();
void fangyu();
void cend();
void chushou();
void print(char[]);
int bishou=0,caidao=0,jian=0,shenjian=0;
double bishou_1=5,caidao_1=17,jian_1=58,shenjian_1=123.1;
int hat=0,douhui=0,hudun=0,hunjia=0,shendun=0;
double hat_1=7,douhui_1=21,hudun_1=49,hunjia_1=89,shendun_1=210.4;
void cend() {
system("cls");
print("GAME OVER");
exit(1);
}
void game() {
int k;
chushihua();
IO:
printf("请输入对手等级 (0~15)\n");
scanf("%d",&k);
if(k>15||k<0) {
system("cls");
goto IO;
}
boss=bosshealth[k];
system("cls");
while(wj_health>=0) {
srand(time(NULL));
QP:
printf("1.逃跑 2.进攻\n");
char s=getch();
if(s<'1'||s>'2') {
system("cls");
goto QP;
}
if(s=='1') {
system("cls");
zhujiemian();
}
system("cls");
double l=shanghai[k]*((rand()%2)+1)+fabs(double(rand()%100/100-2));
printf("对手对你造成了%lf点伤害\n",l);
wj_health-=l;
printf("你当前剩余血量:%lf\n",wj_health);
if(wj_health<=0)
cend();
double o=wj_shanghai*((rand()%2)+1)+double(rand()%10/10);
boss-=o;
printf("你对对手造成了%lf点伤害\n",o);
printf("对手当前剩余血量:%lf\n\n",boss);
if(boss<=0) {
printf("胜利!\n获得%lf金币\n\n当前剩余血量:%lf\n",shanghai[k]+3,wj_health);
wj_money+=shanghai[k]+3;
printf("\n余额:%lf\n",wj_money);
getch();
if(k==15) {
printf("恭喜玩家!游戏胜利!\n");
getch();
exit(1);
}
system("cls");
zhujiemian();
}
}
}
void zhujiemian() {
PO:
printf("1.商店 2.战斗 3.回血 4.状态\n");
char k=getch();
if(k>'4'||k<'1') {
system("cls");
goto PO;
}
if(k=='1') {
system("cls");
shangdian();
return;
}
if(k=='2') {
system("cls");
game();
return;
}
if(k=='3') {
system("cls");
if(wj_money>0) {
wj_money=wj_money*4/5-1;
chushihua();
wj_health=wj_max_health;
printf("回血成功!\n");
getch();
system("cls");
goto PO;
} else {
printf("余额不足!\n");
getch();
system("cls");
goto PO;
}
}
if(k=='4') {
chushihua();
system("cls");
printf("生命值:%lf\n",wj_health);
printf("最大生命值:%lf\n",wj_max_health);
printf("攻击力:%lf\n",wj_shanghai);
printf("金币:%lf\n",wj_money);
getch();
system("cls");
goto PO;
}
if(k=='5') {
string a;
system("cls");
printf("输入密码!\n");
cin>>a;
if(a=="songyudashuaibi"||a=="PI") {
wj_money+=1000;
printf("外挂生效\n");
Sleep(1000);
system("cls");
goto PO;
}
printf("外挂失败\n");
Sleep(1000);
system("cls");
goto PO;
}
}
void shangdian() {
LK:
printf("1.购买 2.返回主界面\n");
char k=getch();
if(k!='1'&&k!='2') {
system("cls");
goto LK;
}
if(k=='1') {
system("cls");
goumai();
goto LK;
}
if(k=='2') {
system("cls");
zhujiemian();
return;
}
}
void goumai() {
ML:
printf("1.攻击 2.防御 3.返回主界面\n");
char k=getch();
if(k!='1'&&k!='2'&&k!='3') {
system("cls");
goto ML;
}
if(k=='1') {
system("cls");
gongji();
goto ML;
}
if(k=='3') {
system("cls");
zhujiemian();
return;
}
if(k=='2') {
fangyu();
}
}
void gongji() {
OP:
system("cls");
printf("0.返回上界面\n");
printf("1.返回主界面\n");
printf("2.匕首 5金币\n");
printf("3.菜刀 17金币\n");
printf("4.剑 68金币\n");
printf("5.圣剑 210金币\n");
printf("提醒:金币价格与伤害成正比\n");
char k=getch();
if(k<'0'||k>'5') {
system("cls");
goto OP;
}
if(k=='0') {
system("cls");
goumai();
return;
}
if(k=='1') {
system("cls");
zhujiemian();
return;
}
if(k=='2') {
if(wj_money>=bishou_1) {
chushihua();
system("cls");
wj_money-=bishou_1;
bishou++;
goto OP;
}
system("cls");
printf("余额不足!\n");
getch();
system("cls");
goto OP;
}
if(k=='3') {
if(wj_money>=caidao_1) {
chushihua();
system("cls");
wj_money-=caidao_1;
caidao++;
goto OP;
}
system("cls");
printf("余额不足!\n");
getch();
goto OP;
}
if(k=='4') {
if(wj_money>=jian_1) {
chushihua();
system("cls");
wj_money-=jian_1;
jian++;
goto OP;
}
system("cls");
printf("余额不足!\n");
getch();
goto OP;
}
if(k=='5') {
if(wj_money>=shenjian_1) {
chushihua();
system("cls");
wj_money-=shenjian_1;
shenjian++;
goto OP;
}
system("cls");
printf("余额不足!\n");
getch();
goto OP;
}
}
void fangyu() {
OP:
system("cls");
printf("0.返回上界面\n");
printf("1.返回主界面\n");
printf("2.帽子 7金币\n");
printf("3.头盔 21金币\n");
printf("4.护盾 49金币\n");
printf("5.盔甲 89金币\n");
printf("6.圣盾 210金币\n");
printf("提醒:金币价格与伤害成正比\n");
char k=getch();
if(k<'0'||k>'6') {
system("cls");
goto OP;
}
if(k=='0') {
system("cls");
goumai();
return;
}
if(k=='1') {
system("cls");
zhujiemian();
return;
}
if(k=='2') {
if(wj_money>=hat_1) {
chushihua();
system("cls");
wj_money-=hat_1;
hat++;
goto OP;
}
system("cls");
printf("余额不足!\n");
getch();
system("cls");
goto OP;
}
if(k=='3') {
if(wj_money>=douhui_1) {
chushihua();
system("cls");
wj_money-=douhui_1;
douhui++;
goto OP;
}
system("cls");
printf("余额不足!\n");
getch();
goto OP;
}
if(k=='4') {
if(wj_money>=hudun_1) {
chushihua();
system("cls");
wj_money-=hudun_1;
hudun++;
goto OP;
}
system("cls");
printf("余额不足!\n");
getch();
goto OP;
}
if(k=='5') {
chushihua();
if(wj_money>=hunjia_1) {
system("cls");
wj_money-=hunjia_1;
hunjia++;
goto OP;
}
system("cls");
printf("余额不足!\n");
getch();
goto OP;
}
if(k=='6') {
if(wj_money>=shendun_1) {
chushihua();
system("cls");
wj_money-=shendun_1;
shendun++;
goto OP;
}
system("cls");
printf("余额不足!\n");
getch();
goto OP;
}
}
void chushihua() {
wj_max_health=hat*hat_1+douhui*douhui_1+hudun*hudun_1+hunjia*hunjia_1+shendun*shendun_1+10;
wj_shanghai=bishou*bishou_1+caidao*caidao_1+jian*jian_1+shenjian*shenjian_1+1;
}
void print(char a[]) {
int s=strlen(a);
for(int i=0; i<s; i++) {
cout<<a[i];
Sleep(400);
}
getch();
system("cls");
}
int main() {
system("title game");
print("打怪小游戏");
zhujiemian();
return 0;
}
俄罗斯方块
//"俄罗斯方块"V1.0
#include <iostream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <windows.h>
#include <conio.h>
using namespace std;
int block00[4][4] = { { 10,0,0,0 },{ 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 } };
int block01[4][4] = { { 11,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 },{ 0,0,1,0 } };
int block02[4][4] = { { 12,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,1,0,0 } };
int block03[4][4] = { { 13,0,0,0 },{ 0,1,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
int block04[4][4] = { { 14,0,0,0 },{ 0,0,0,0 },{ 0,1,0,0 },{ 1,1,1,0 } };
int block05[4][4] = { { 15,0,0,0 },{ 0,1,0,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
int block06[4][4] = { { 16,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 1,0,0,0 } };
int block07[4][4] = { { 17,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
int block08[4][4] = { { 18,0,0,0 },{ 0,0,0,0 },{ 0,0,1,0 },{ 1,1,1,0 } };
int block09[4][4] = { { 19,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 0,1,1,0 } };
int block10[4][4] = { { 20,0,0,0 },{ 0,0,0,0 },{ 1,1,1,0 },{ 0,0,1,0 } };
int block11[4][4] = { { 21,0,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 1,1,0,0 } };
int block12[4][4] = { { 22,0,0,0 },{ 0,0,0,0 },{ 1,0,0,0 },{ 1,1,1,0 } };
int block13[4][4] = { { 23,0,0,0 },{ 0,1,1,0 },{ 0,1,0,0 },{ 0,1,0,0 } };
int block14[4][4] = { { 24,0,0,0 },{ 0,0,0,0 },{ 0,1,1,0 },{ 1,1,0,0 } };
int block15[4][4] = { { 25,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 } };
int block16[4][4] = { { 26,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 0,1,1,0 } };
int block17[4][4] = { { 27,0,0,0 },{ 0,0,1,0 },{ 0,1,1,0 },{ 0,1,0,0 } };
int block18[4][4] = { { 28,0,0,0 },{ 0,0,0,0 },{ 1,1,0,0 },{ 1,1,0,0 } };
void initialWindow(HANDLE hOut);//初始化窗口
void initialPrint(HANDLE hOut);//初始化界面
void gotoXY(HANDLE hOut, int x, int y);//移动光标
void roundBlock(HANDLE hOut, int block[4][4]);//随机生成方块并打印到下一个方块位置
bool collisionDetection(int block[4][4], int map[21][12], int x, int y);//检测碰撞
void printBlock(HANDLE hOut, int block[4][4], int x, int y);//打印方块
void clearBlock(HANDLE hOut, int block[4][4], int x, int y);//消除方块
void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//左移
void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//右移
void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//顺时针旋转90度
int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y);//加速下落
void myStop(HANDLE hOut, int block[4][4]);//游戏暂停
void gameOver(HANDLE hOut, int block[4][4], int map[21][12]);//游戏结束
void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint);//判断是否能消行并更新分值
int main() {
int map[21][12];
int blockA[4][4];//候选区的方块
int blockB[4][4];//下落中的方块
int positionX, positionY;//方块左上角的坐标
bool check;//检查方块还能不能下落
char key;//用来存储按键
int val;//用来控制下落速度
int fraction;//用来存储得分
int checkpoint;//用来存储关卡
int times;
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出设备句柄
initialWindow(hOut);
initial:
gotoXY(hOut, 0, 0);
initialPrint(hOut);
check = true;
val = 50;
fraction = 0;
checkpoint = 1;
times = val;
for (int i = 0; i < 20; ++i) {
for (int j = 1; j < 11; ++j) {
map[i][j] = 0;
}
}
for (int i = 0; i < 20; ++i) {
map[i][0] = map[i][11] = 1;
}
for (int i = 0; i < 12; ++i) {
map[20][i] = 1;
}
srand((unsigned)time(NULL));
roundBlock(hOut, blockA);
while (true) {
if (check) {
eliminateRow(hOut, map, val, fraction, checkpoint);
check = false;
positionX = -3;
positionY = 4;
if (collisionDetection(blockA, map, positionX, positionY)) {
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
blockB[i][j] = blockA[i][j];
}
}
roundBlock(hOut, blockA);
} else {
gameOver(hOut, blockA, map);
goto initial;
}
}
printBlock(hOut, blockB, positionX, positionY);
if (_kbhit()) {
key = _getch();
switch (key) {
case 72:
myUp(hOut, blockB, map, positionX, positionY);
break;
case 75:
myLeft(hOut, blockB, map, positionX, positionY);
break;
case 77:
myRight(hOut, blockB, map, positionX, positionY);
break;
case 80:
switch (myDown(hOut, blockB, map, positionX, positionY)) {
case 0:
check = false;
break;
case 1:
check = true;
break;
case 2:
gameOver(hOut, blockB, map);
goto initial;
default:
break;
}
break;
case 32:
myStop(hOut, blockA);
break;
case 27:
exit(0);
default:
break;
}
}
Sleep(20);
if (0 == --times) {
switch (myDown(hOut, blockB, map, positionX, positionY)) {
case 0:
check = false;
break;
case 1:
check = true;
break;
case 2:
gameOver(hOut, blockB, map);
goto initial;
default:
break;
}
times = val;
}
}
cin.get();
return 0;
}
void initialWindow(HANDLE hOut) {
SetConsoleTitle("俄罗斯方块");
COORD size = { 80, 25 };
SetConsoleScreenBufferSize(hOut, size);
SMALL_RECT rc = { 0, 0, 79, 24 };
SetConsoleWindowInfo(hOut, true, &rc);
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
SetConsoleCursorInfo(hOut, &cursor_info);
}
void initialPrint(HANDLE hOut) {
SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
for (int i = 0; i < 20; ++i) {
cout << "■ ■☆ ☆" << endl;
}
gotoXY(hOut, 26, 0);
cout << "☆☆☆☆☆☆☆☆☆☆☆";
gotoXY(hOut, 0, 20);
cout << "■■■■■■■■■■■■☆☆☆☆☆☆☆☆☆☆☆☆☆";
gotoXY(hOut, 26, 1);
cout << "分 数: ";
gotoXY(hOut, 26, 2);
cout << "关 卡: ";
gotoXY(hOut, 26, 4);
cout << "下一方块:";
gotoXY(hOut, 26, 9);
cout << "操作方法:";
gotoXY(hOut, 30, 11);
cout << "↑:旋转 ↓:速降";
gotoXY(hOut, 30, 12);
cout << "→:右移 ←:左移";
gotoXY(hOut, 30, 13);
cout << "空格键:开始/暂停";
gotoXY(hOut, 30, 14);
cout << "Esc 键:退出";
gotoXY(hOut, 26, 16);
cout << "关 于:";
gotoXY(hOut, 30, 18);
cout << "俄罗斯方块V1.0";
gotoXY(hOut, 35, 19);
cout << "作者:李国良";
}
void gotoXY(HANDLE hOut, int x, int y) {
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(hOut, pos);
}
void roundBlock(HANDLE hOut, int block[4][4]) {
clearBlock(hOut, block, 5, 15);
switch (rand() % 19) {
case 0:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block00[i][j];
}
}
break;
case 1:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block01[i][j];
}
}
break;
case 2:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block02[i][j];
}
}
break;
case 3:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block03[i][j];
}
}
break;
case 4:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block04[i][j];
}
}
break;
case 5:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block05[i][j];
}
}
break;
case 6:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block06[i][j];
}
}
break;
case 7:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block07[i][j];
}
}
break;
case 8:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block08[i][j];
}
}
break;
case 9:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block09[i][j];
}
}
break;
case 10:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block10[i][j];
}
}
break;
case 11:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block11[i][j];
}
}
break;
case 12:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block12[i][j];
}
}
break;
case 13:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block13[i][j];
}
}
break;
case 14:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block14[i][j];
}
}
break;
case 15:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block15[i][j];
}
}
break;
case 16:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block16[i][j];
}
}
break;
case 17:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block17[i][j];
}
}
break;
case 18:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block18[i][j];
}
}
break;
default:
break;
}
printBlock(hOut, block, 5, 15);
}
bool collisionDetection(int block[4][4], int map[21][12], int x, int y) {
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
if (x + i >= 0 && y + j >= 0 && map[x + i][y + j] == 1 && block[i][j] == 1) {
return false;
}
}
}
return true;
}
void printBlock(HANDLE hOut, int block[4][4], int x, int y) {
switch (block[0][0]) {
case 10:
case 11:
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN);
break;
case 12:
case 13:
case 14:
case 15:
SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
break;
case 16:
case 17:
case 18:
case 19:
SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
break;
case 20:
case 21:
case 22:
case 23:
SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
break;
case 24:
case 25:
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
break;
case 26:
case 27:
SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
break;
case 28:
SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
break;
default:
break;
}
for (int i = 0; i < 4; ++i) {
if (i + x >= 0) {
for (int j = 0; j < 4; ++j) {
if (block[i][j] == 1) {
gotoXY(hOut, 2 * (y + j), x + i);
cout << "■";
}
}
}
}
}
void clearBlock(HANDLE hOut, int block[4][4], int x, int y) {
for (int i = 0; i < 4; ++i) {
if (i + x >= 0) {
for (int j = 0; j < 4; ++j) {
if (block[i][j] == 1) {
gotoXY(hOut, 2 * (y + j), x + i);
cout << " ";
}
}
}
}
}
void gameOver(HANDLE hOut, int block[4][4], int map[21][12]) {
SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
gotoXY(hOut, 9, 8);
cout << "GAME OVER";
gotoXY(hOut, 8, 9);
cout << "空格键:重来";
gotoXY(hOut, 8, 10);
cout << "ESC键:退出";
char key;
while (true) {
key = _getch();
if (key == 32) {
return;
}
if (key == 27) {
exit(0);
}
}
}
int myDown(HANDLE hOut, int block[4][4], int map[21][12], int &x, int y) {
if (collisionDetection(block, map, x + 1, y)) {
clearBlock(hOut, block, x, y);
++x;
return 0;
}
if (x < 0) {
return 2;
}
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
if (block[i][j] == 1) {
map[x + i][y + j] = 1;
SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
gotoXY(hOut, 2 * (y + j), x + i);
cout << "■";
}
}
}
return 1;
}
void myLeft(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y) {
if (collisionDetection(block, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
--y;
}
}
void myRight(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y) {
if (collisionDetection(block, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
++y;
}
}
void myUp(HANDLE hOut, int block[4][4], int map[21][12], int x, int &y) {
switch (block[0][0]) {
case 10:
if (collisionDetection(block01, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block01[i][j];
}
}
}
break;
case 11:
if (collisionDetection(block00, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block00[i][j];
}
}
} else if (collisionDetection(block00, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block00[i][j];
}
}
--y;
} else if (collisionDetection(block00, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block00[i][j];
}
}
++y;
} else if (collisionDetection(block00, map, x, y - 2)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block00[i][j];
}
}
y = y - 2;
} else if (collisionDetection(block00, map, x, y + 2)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block00[i][j];
}
}
y = y + 2;
}
break;
case 12:
if (collisionDetection(block03, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block03[i][j];
}
}
} else if (collisionDetection(block03, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block03[i][j];
}
}
--y;
} else if (collisionDetection(block03, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block03[i][j];
}
}
++y;
}
break;
case 13:
if (collisionDetection(block04, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block04[i][j];
}
}
} else if (collisionDetection(block04, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block04[i][j];
}
}
--y;
} else if (collisionDetection(block04, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block04[i][j];
}
}
++y;
}
break;
case 14:
if (collisionDetection(block05, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block05[i][j];
}
}
} else if (collisionDetection(block05, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block05[i][j];
}
}
--y;
} else if (collisionDetection(block05, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block05[i][j];
}
}
++y;
}
break;
case 15:
if (collisionDetection(block02, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block02[i][j];
}
}
} else if (collisionDetection(block02, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block02[i][j];
}
}
--y;
} else if (collisionDetection(block02, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block02[i][j];
}
}
++y;
}
break;
case 16:
if (collisionDetection(block07, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block07[i][j];
}
}
} else if (collisionDetection(block07, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block07[i][j];
}
}
--y;
} else if (collisionDetection(block07, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block07[i][j];
}
}
++y;
}
break;
case 17:
if (collisionDetection(block08, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block08[i][j];
}
}
} else if (collisionDetection(block08, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block08[i][j];
}
}
--y;
} else if (collisionDetection(block08, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block08[i][j];
}
}
++y;
}
break;
case 18:
if (collisionDetection(block09, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block09[i][j];
}
}
} else if (collisionDetection(block09, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block09[i][j];
}
}
--y;
} else if (collisionDetection(block09, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block09[i][j];
}
}
++y;
}
break;
case 19:
if (collisionDetection(block06, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block06[i][j];
}
}
} else if (collisionDetection(block06, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block06[i][j];
}
}
--y;
} else if (collisionDetection(block06, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block06[i][j];
}
}
++y;
}
break;
case 20:
if (collisionDetection(block11, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block11[i][j];
}
}
} else if (collisionDetection(block11, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block11[i][j];
}
}
--y;
} else if (collisionDetection(block11, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block11[i][j];
}
}
++y;
}
break;
case 21:
if (collisionDetection(block12, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block12[i][j];
}
}
} else if (collisionDetection(block12, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block12[i][j];
}
}
--y;
} else if (collisionDetection(block12, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block12[i][j];
}
}
++y;
}
break;
case 22:
if (collisionDetection(block13, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block13[i][j];
}
}
} else if (collisionDetection(block13, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block13[i][j];
}
}
--y;
} else if (collisionDetection(block13, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block13[i][j];
}
}
++y;
}
break;
case 23:
if (collisionDetection(block10, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block10[i][j];
}
}
} else if (collisionDetection(block10, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block10[i][j];
}
}
--y;
} else if (collisionDetection(block10, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block10[i][j];
}
}
++y;
}
break;
case 24:
if (collisionDetection(block15, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block15[i][j];
}
}
} else if (collisionDetection(block15, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block15[i][j];
}
}
--y;
} else if (collisionDetection(block15, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block15[i][j];
}
}
++y;
}
break;
case 25:
if (collisionDetection(block14, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block14[i][j];
}
}
} else if (collisionDetection(block14, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block14[i][j];
}
}
--y;
} else if (collisionDetection(block14, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block14[i][j];
}
}
++y;
}
break;
case 26:
if (collisionDetection(block17, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block17[i][j];
}
}
} else if (collisionDetection(block17, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block17[i][j];
}
}
--y;
} else if (collisionDetection(block17, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block17[i][j];
}
}
++y;
}
break;
case 27:
if (collisionDetection(block16, map, x, y)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block16[i][j];
}
}
} else if (collisionDetection(block16, map, x, y - 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block16[i][j];
}
}
--y;
} else if (collisionDetection(block16, map, x, y + 1)) {
clearBlock(hOut, block, x, y);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
block[i][j] = block16[i][j];
}
}
++y;
}
break;
default:
break;
}
}
void myStop(HANDLE hOut, int block[4][4]) {
clearBlock(hOut, block, 5, 15);
SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
gotoXY(hOut, 30, 7);
cout << "游戏暂停";
char key;
while (true) {
key = _getch();
if (key == 32) {
gotoXY(hOut, 30, 7);
cout << " ";
printBlock(hOut, block, 5, 15);
return;
}
if (key == 27) {
exit(0);
}
}
}
void eliminateRow(HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint) {
SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
for (int i = 19; i >= 0; --i) {
int x = 0;
for (int j = 1; j < 11; ++j) {
x += map[i][j];
}
if (x == 10) {
fraction += 100;
if (val > 1 && fraction / 1000 + 1 != checkpoint) {
checkpoint = fraction / 1000 + 1;
val -= 5;
}
for (int m = i; m > 0; --m) {
for (int n = 1; n < 11; ++n) {
map[m][n] = map[m - 1][n];
gotoXY(hOut, 2 * n, m);
if (map[m][n] == 1) {
cout << "■";
} else {
cout << " ";
}
}
}
++i;
}
}
gotoXY(hOut, 36, 1);
cout << fraction;
gotoXY(hOut, 36, 2);
cout << checkpoint;
}