2021-05-15

                                                                                                                                                                                  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();

	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值