#include <iostream>
#include <Windows.h>
#include <string>
#include <conio.h>
#include <time.h>
using namespace std;
void gotoxy(COORD pos) {
HANDLE hout;
hout = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hout, pos);
}
class game {
public:
string Board = "▄▄▄";
string ball = "●";
COORD pos1 = { 35,17 };
COORD pos2;
int spsign, szsign = 1;
void initball() {
srand((unsigned)time(0));
int y = 0, x = rand() % 41 + 20;
COORD temp = { x,y };
pos2 = temp;
spsign = rand() % 2; //如果直接产生1或者-1的话,
if (spsign == 0)
spsign = -1;
}
void drawboard() {
gotoxy(pos1);
cout << Board;
}
void eraseboard() {
gotoxy(pos1);
cout << " ";
}
void drawball() {
gotoxy(pos2);
cout << ball;
}
void eraseball() {
gotoxy(pos2);
cout << " ";
}
void shuipingmove() {
pos2.X = pos2.X + spsign; //优化的结果
if (pos2.X >= 78 || pos2.X <= 0)
spsign = 0 - spsign;
}
void cuizhimove() {
pos2.Y = pos2.Y + szsign;
if (pos2.Y == 16) {
if (pos2.X >= pos1.X&&pos2.X <= pos1.X + 6)
szsign = 0 - szsign;
else gameover();
}
if (pos2.Y == 0)
szsign = 0 - szsign;
}
void boardmove(char x) {
if (x == 'a') {
pos1.X--;
if (pos1.X < 0)
pos1.X = 0;
}
if (x == 'd') {
pos1.X++;
if (pos1.X > 74)
pos1.X = 74;
}
}
void playing() {
begin();
initball();
drawboard();
drawball();
clock_t startx, starty;
startx = starty = clock();
while (1) {
Sleep(8);
if (_kbhit()) {
char x = _getch();
if (x == 'a' || x == 'd') {
eraseboard();
boardmove(x);
drawboard();
}
else if (x == 'p')
{
Pause();
}
}
if (clock()-startx>300) {
eraseball();
shuipingmove();
drawball();
startx = clock();
}
if (clock()-starty>500) {
eraseball();
cuizhimove();
drawball();
starty = clock();
}
}
}
void Pause()
{
COORD temp;
temp = { 61,2 };
gotoxy(temp);
cout << "暂停中...";
char c = _getch();
while (c != 'p')
c = _getch();
gotoxy(temp);
cout << " ";
}
void begin() {
COORD temp = { 20,10 };
gotoxy(temp);
cout << "welcome to game Board And Ball" << endl;
temp = { 25,13 };
gotoxy(temp);
cout << "Press Any To Start...";
getchar();
system("cls");
}
void gameover() {
system("cls");
COORD temp = { 36,12 };
gotoxy(temp);
string str = "Game Over!";
for (int i = 0; i < str.size(); i++)
{
Sleep(200);
cout << str[i];
}
cout << endl;
exit(0);
}
};
int main() {
game test;
test.playing();
}
// 总结
// 在做1.0的时候,总体的思路是分2步走,首先思考的是如何实现板的移动,后来就从网上找了代码,如何通过键盘来实现光标的移动,加入几个输出语句后
// 就能实现板子的移动了,新问题在于如何控制边界问题。在实现小球的移动时,考虑了小球初始位置的随机性,小球移动方向的随机性,小球要怎么能凑够
// 自己去运动呢 实现方案就是运用clock()函数来计数 一开始还分别置了2个标志 分别处理横向的运动和纵向的运动 运动的实质就是坐标的变化 后来还接着
// 处理了反弹的问题 因此也进一步实现的算法的优化
// 为了能够使得小球的运动和板的移动同时运行 考虑了多线程 但是实现的效果很不好 在小球运动的时候 板子就消失了
// 学习别人的程序 首先就是把运动给分为 画 擦除 和移动 对于小球的移动 还要分别考虑水平移动 和垂直移动 然后就把几个移动放在了一个函数里
// 同时也实现了面向对象的编程。
/*
1.0
COORD boardpos = { 35,17 }; //80列 25行 占据6个格子
string board = "▄▄▄";
string s = "●";
//碰到了板子 板子在第17行 小球向下运动 当小球到第16行的时候 如果下方有板子就可以反弹,否则就gameover。
//有没有板子就靠比较横坐标 大于等于最左端且小于等于最右端时反弹
//板子的坐标就需要作为全局变量 板子的最左端就是boardpos.x 最右端就是boardpos.x+5
// 反弹怎么实现? 反弹就是往回走,纵坐标从递增到递减,水平方向的移动改变朝向
//触顶也要反弹
// 两个线程,一个用来实现板子的移动,另一个用来实现小球的移动
void moveball() {
srand((unsigned)time(0));
int y = 0, x = rand() % 41 + 20;
int sign = rand() % 2; //如果直接产生1或者-1的话,
int sign2 = 1;
if (sign == 0)
sign = -1;
gotoxy(x, y);
cout << s;
clock_t start1, start2;
bool flag1, flag2;
flag1 = flag2 = false;
start1 = start2 = clock();
while (true) {
while ((flag1 = (clock() - start1 > 300)) || (flag2 = (clock() - start2 > 1000))) {
if (flag1) {
x = x + sign; //优化的结果
if (x >= 78 || x <= 0)
sign = 0 - sign;
start1 = clock();
flag1 = false;
}
if (flag2) {
y = y + sign2;
if (y == 16) {
if (x >= boardpos.X&&x <= boardpos.X + 6)
sign2 = 0 - sign2;
else {
system("cls");
cout << "game over!!!\n";
system("pause");
}
}
if (y == 0)
sign2 = 0 - sign2;
start2 = clock();
flag2 = false;
}
system("cls");
gotoxy(x, y);
cout << s;
}
}
}
void moveboard() {
HANDLE hout, hin;
hout = GetStdHandle(STD_OUTPUT_HANDLE);
hin = GetStdHandle(STD_INPUT_HANDLE);
for (;;) {
INPUT_RECORD ir;
DWORD r;
ReadConsoleInput(hin, &ir, 1, &r);
if (r == 1 && ir.EventType == KEY_EVENT && ir.Event.KeyEvent.bKeyDown == TRUE) {
switch (ir.Event.KeyEvent.wVirtualKeyCode)
{
case 37:
boardpos.X--;
if (boardpos.X < 0)
boardpos.X = 0;
break;
case 39:
boardpos.X++;
if (boardpos.X > 74)
boardpos.X = 74;
break;
}
}
system("cls");
SetConsoleCursorPosition(hout, boardpos);
cout << board;
}
}
int main() {
gotoxy(20, 10);
cout << "welcome to game Board And Ball" << endl;
gotoxy(25, 13);
cout << "Press Any To Start...";
getchar();
system("cls");
HANDLE h1; //线程句柄
h1= CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)moveball, NULL, 1, 0); //创建子线程
ResumeThread(h1); //启动子线程
moveboard();
}
void gotoxy(COORD pos) {
HANDLE hout;
hout = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hout, pos);
}
*/