Pong 游戏
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <conio.h>
#include <windows.h>
#include <string>
#include <cstdio>
#define width 100
#define height 40
using namespace std;
char* framebuffer;
int ball_x = width / 2-2, ball_y = height / 2-2;
int ball_x_v{ 0 }, ball_y_v{ 0 };
int paddle_w = 4, paddle_h = 10;
int paddle_x1 = 0, paddle_x2 = width - paddle_w;
int paddle_y1 = height / 2 - paddle_h / 2, paddle_y2 = height / 2 - paddle_h / 2;
int paddle_1_v = 3, paddle_2_v = 3;
int score1{ 0 }, score2{ 0 };
int score1_x = paddle_w + 8, score1_y = 2, score2_x = width - 8 - paddle_w, score2_y = 2;
void random_ball() {
srand((unsigned)time(0));
ball_x_v = rand() % 3 + 1;
ball_y_v = rand() % 3 + 1;
if (rand() % 2 == 0)ball_x_v = -ball_x_v;
if (rand() % 2 == 0)ball_y_v = -ball_y_v;
}
int processInput() {
if (_kbhit()) {
char key;
key =_getch();
if (key == 27) return -1;
else {
if ((key == 'w' || key == 'W') && paddle_y1 > paddle_1_v)paddle_y1 -= paddle_1_v;
else if ((key == 's' || key == 'S') && paddle_y1 + paddle_1_v + paddle_h < height)paddle_y1 += paddle_1_v;
else if (key == 72 && paddle_y2 > paddle_2_v)paddle_y2 -= paddle_2_v;
else if ((key == 80) && paddle_y2 + paddle_2_v + paddle_h < height)paddle_y2 += paddle_2_v;
return 0;
}
}
}
void update() {
int flag = 0;
ball_x += ball_x_v;
ball_y += ball_y_v;
if (ball_y < 0 || ball_y >= height)ball_y_v = -ball_y_v;
if (ball_x < paddle_w && ball_y >= paddle_y1 && ball_y < paddle_y1 + paddle_h) {
ball_x_v = -ball_x_v;
score1++;
}
if (ball_x >=paddle_x2 && ball_y >= paddle_y2 && ball_y <paddle_y2 + paddle_h) {
score2++;
ball_x_v = -ball_x_v;
}
if (ball_x <= 0) { score2++; flag = 1; }
if (ball_x >=width -1) { score1++; flag = 1; }
if (flag == 1) {
ball_x = width / 2; ball_y = height / 2; random_ball();
}
}
void setPixel(const int x, const int y, char a) {
framebuffer[y * width + x] = a;
}
void draw_background() {
for (int i = 0; i < height; i++)
for (int t = 0; t < width; t++) {
if (i == 0 || i == height - 1)setPixel(t, i, '=');
else {
if (t == 0 || t == width / 2 - 2 || t == width - 1)setPixel(t, i, '|');
else setPixel(t, i, ' ');
}
}
}
void draw_sprites() {
for (int i = paddle_y1 - 1; i < paddle_y1 + paddle_h; i++)
for (int t = paddle_x1; t < paddle_x1 + paddle_w; t++)setPixel(t, i, 'z');
for (int i = paddle_y2 - 1; i < paddle_y2 + paddle_h; i++)
for (int t = paddle_x2; t < paddle_x2 + paddle_w; t++)setPixel(t, i, 'z');
setPixel(ball_x, ball_y, '0');
string s1{ std::to_string(score1) }, s2{ std::to_string(score2) };
for (int i = 0; i<s1.size(); i++) {
setPixel(score1_x - 1 + i, score1_y, s1[i]);
}
for (int i = 0;i<s2.size(); i++)
{
setPixel(score2_x + i, score2_y, s2[i]);
}
}
void show() {
for (int i = 0; i < height; i++) {
for (int t = 0; t < width; t++)cout << framebuffer[i * width + t];
cout << '\n';
}
}
void gotoxy(int x, int y) {
COORD coord = { x,y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void hideCursor() {
CONSOLE_CURSOR_INFO cursor_info = { 1,0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
void render_scene() {
gotoxy(0, 0);
hideCursor();
draw_background();
draw_sprites();
show();
}
int main() {
framebuffer = new char[height * width];
srand((unsigned)time(0));
ball_x_v = rand() % 3 + 1;
ball_y_v = rand() % 3 + 1;
if (rand() % 2 == 0)ball_x_v = -ball_x_v;
if (rand() % 2 == 0)ball_y_v = -ball_y_v;
while (1) {
if (processInput() < 0)break;
processInput();
update();
render_scene();
}
}