C++小游戏——攻守战

做题时的智商:monkey

编游戏的智商:爱因斯坦*100

呵呵呵~~~

回归正题,今天我们来用C++写MC的偏经典联机游戏:攻守战!

顺便宣传一下我的洛谷首页,有一些我自己出的题、题单和团队!

个人中心 - 洛谷

#include <bits/stdc++.h>
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <cmath>
#include <windows.h>
#include <cstdlib>
#include <cstdio>
#include <stdio.h>
#include <algorithm>
#include <conio.h>
#include <string>
#include <string.h>
#include <math.h>
#define w(x) while(x)
#define cl system("cls")
#define Sl(x) Sleep(x)

using namespace std;

char a[50][50] = {"OOOOOOOOOOOOOOOOOOOOOOOOO",
                  "O                      WO",
                  "O           O           O",
                  "OH        OOOOO      R WO",
                  "O           O           O",
                  "O                      WO",
                  "OOOOOOOOOOOOOOOOOOOOOOOOO",
                 };

struct Player {
	int shengming, gongji, fangyu;
};

Player P1, P2;

bool W1 = true, W2 = true, W3 = true;

int x = 3, y = 1, p = 3, q = 21, n = 1, m = 23, c = 3, b = 23, f = 5, j = 23, sx = 30, sy = 30, gx = 30, gy = 30, fx = 30, fy = 30;

int ttt;

void out() {
	cl;
	for (int i = 0; i <= 7; i++) {
		for (int j = 0; j <= 24; j++) {
			printf ("%c", a[i][j]);
		}
		printf ("	");
		switch (i) {
			case 0:
				printf ("H:玩家1(WASD移动)");
				break;
			case 1:
				printf ("R:玩家2(IJKL移动)");
				break;
			case 2:
				printf ("W:R的床");
				break;
			case 3:
				printf ("O:墙壁");
				break;
			case 4:
				printf ("N:增加攻击");
				break;
			case 5:
				printf ("F:增加防御");
				break;
			case 6:
				printf ("S:增加生命");
				break;
		}
		printf ("\n");
	}
	printf ("H:\n生命:%d\n攻击:%d\n防御:%d\n\n", P1.shengming, P1.gongji, P1.fangyu);
	printf ("R:\n生命:%d\n攻击:%d\n防御:%d\n\n", P2.shengming, P2.gongji, P2.fangyu);
	if (W1) {
		printf ("床W1:YES\n");
	} else {
		printf ("床W1:NO\n");
	}
	if (W2) {
		printf ("床W2:YES\n");
	} else {
		printf ("床W2:NO\n");
	}
	if (W3) {
		printf ("床W3:YES\n");
	} else {
		printf ("床W3:NO\n");
	}
	printf ("剩余时间(毫秒):%d\n", 100000 - clock() + ttt);
}

void SetFont(int size) {
	CONSOLE_FONT_INFOEX cfi;
	cfi.cbSize = sizeof cfi;
	cfi.nFont = 0;
	cfi.dwFontSize.X = 0;
	cfi.dwFontSize.Y = size;//设置字体大小
	cfi.FontFamily = FF_DONTCARE;
	cfi.FontWeight = FW_NORMAL; //字体粗细
	wcscpy_s(cfi.FaceName, L"宋体");//设置字体
	SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), FALSE, &cfi);
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_FONT_INFO consoleCurrentFont;
	GetCurrentConsoleFont(handle, FALSE, &consoleCurrentFont);
}

void xuan() {
	for (int i = 1; i <= 2; i++) {
		if (i == 1) {
			printf ("请H选择!(输入前面的序号)\n");
		} else {
			printf ("请R选择!(输入前面的序号)\n");
		}
		printf ("1.战士\n生命:200\n攻击:50\n防御:50\n");
		printf ("2.铠甲人\n生命:150\n攻击:40\n防御:80\n");
		printf ("3.X原型机\n生命:250\n攻击:40\n防御:40\n");
		printf ("4.H原型机\n生命:130\n攻击:45\n防御:85\n");
		printf ("5.X束光机\n生命:135\n攻击:65\n防御:40\n");
		int d;
		scanf ("%d", &d);
		switch (d) {
			case 1:
				if (i == 1) {
					P1.shengming = 200;
					P1.gongji = 50;
					P1.fangyu = 50;
				} else {
					P2.shengming = 200;
					P2.gongji = 50;
					P2.fangyu = 50;
				}
				break;
			case 2:
				if (i == 1) {
					P1.shengming = 150;
					P1.gongji = 40;
					P1.fangyu = 80;
				} else {
					P2.shengming = 150;
					P2.gongji = 40;
					P2.fangyu = 80;
				}
				break;
			case 3:
				if (i == 1) {
					P1.shengming = 250;
					P1.gongji = 40;
					P1.fangyu = 40;
				} else {
					P2.shengming = 250;
					P2.gongji = 40;
					P2.fangyu = 40;
				}
				break;
			case 4:
				if (i == 1) {
					P1.shengming = 130;
					P1.gongji = 45;
					P1.fangyu = 85;
				} else {
					P2.shengming = 130;
					P2.gongji = 45;
					P2.fangyu = 85;
				}
				break;
			case 5:
				if (i == 1) {
					P1.shengming = 135;
					P1.gongji = 65;
					P1.fangyu = 40;
				} else {
					P2.shengming = 135;
					P2.gongji = 65;
					P2.fangyu = 40;
				}
				break;
		}
		system("cls");
	}
}

int zhan() {
	system("cls");
	printf ("交战中......\n");
	Sleep(2500);
	int P1s = P1.shengming, P1g = P1.gongji, P1f = P1.fangyu, P2s = P2.shengming, P2g = P2.gongji, P2f = P2.fangyu;
	while (1) {
		if (P2g - P1f > 0) {
			P1s = P1s - (P2g - P1f);
		}
		if (P1g - P2f > 0) {
			P2s = P2s - (P1g - P2f);
		}

		if (P1.gongji <= P2.fangyu && P1.fangyu >= P2.gongji) {
			printf ("无法交战!\n");
			Sl(1000);
			a[p][q] = ' ';
			p = 3, q = 21;
			a[p][q] = 'R';
			a[x][y] = ' ';
			x = 3, y = 1;
			a[x][y] = 'H';
			return 100;
		}

		if (P1s <= 0 && P2s > 0) {
			printf ("H狗带了!\n");
			Sl(3000);
			a[x][y] = ' ';
			x = 3, y = 1;
			a[x][y] = 'H';
		}
		if (P2s <= 0 && P1s > 0) {
			printf ("R狗带了!\n");
			Sl(3000);
			if (W1 || W2 || W3) {
				a[p][q] = ' ';
				p = 4, q = 17;
				a[p][q] = 'R';
				if (p == x && q == y) {
					x = 3, y = 9;
					a[x][y] = 'H';
				}
				return 99;
			} else {
				return 2;
			}
		}
		if (P2s <= 0 && P1s <= 0) {
			printf ("都狗带了!\n");
			Sl(3000);
			if (W1 || W2 || W3) {
				a[x][y] = ' ';
				x = 3, y = 1;
				a[x][y] = 'H';
				a[p][q] = ' ';
				p = 4, q = 17;
				a[p][q] = 'R';
				if (p == x && q == y) {
					a[x][y] = ' ';
					x = 3, y = 9;
					a[x][y] = 'H';
				}
				return 99;
			} else {
				return 2;
			}
		}
	}
}

void win(int g) {
	if (g == 1) {
		printf("R赢了!\n");
		Sl(3000);
		system("pause");
	} else {
		printf("H赢了!\n");
		Sl(3000);
		system("pause");
	}
}

void rans() {
	int f = rand() % 2;
	a[sx][sy] = ' ';
	sx = 35, sy = 35;
	switch (f) {
		case 0:
			sx = 5, sy = 1;
			break;
		case 1:
			sx = 1, sy = 15;
			break;
	}
	a[sx][sy] = 'S';
}

void rang() {
	int ff = rand() % 3;
	a[gx][gy] = ' ';
	gx = 35, gy = 35;
	switch (ff) {
		case 0:
			gx = 2, gy = 13;
			break;
		case 1:
			gx = 2, gy = 11;
			break;
		case 2:
			gx = 4, gy = 11;
			break;
	}
	a[gx][gy] = 'N';
}

void ranf() {
	int fff = rand() % 3;
	a[fx][fy] = ' ';
	fx = 35, fy = 35;
	switch (fff) {
		case 0:
			fx = 2, fy = 10;
			break;
		case 1:
			fx = 4, fy = 17;
			break;
		case 2:
			fx = 4, fy = 13;
			break;
	}
	a[fx][fy] = 'F';
}

void Start() {
	puts("欢迎来玩攻守战!!!");
	Sl(1000);
	puts("yuexingfei出品,必属精品!");
	Sl(1000);
	puts("请按任意键开始游戏...");
	getch();
	cl;
	puts ("Loading......");
	Sl(2000);
	cl;
	int o = 0;
	for (int i = 1; i <= 200; i++) {
		printf ("已加载%d个文件,进度%d", i, o);
		cout << "%\n";
		if (i % 2 == 0) {
			o++;
		}
		Sl(1);
		if (rand() % 15 == 9) {
			Sl(4);
		}
		cl;
	}
}

void SetConsoleWindowSize( SHORT width, SHORT height ) {
	HANDLE hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	SMALL_RECT wrt = { 0, 0, width - 1, height - 1 };
	SetConsoleWindowInfo( hStdOutput, TRUE, &wrt );
	COORD coord = { width, height };
	SetConsoleScreenBufferSize( hStdOutput, coord );
}

int main() {
	system("title 起床战争");
	SetFont(25);
	SetConsoleWindowSize(53, 25);
	srand(time(NULL));
	system("color 0a");
	Start();
	cl;
	printf ("规则:\n有时间限制\n攻方在规定时间内破坏守方的三个床就算赢\n守方要在规定时间内守住三个床,只要规定时间结束后还有床没有被攻方破坏就算赢\n");
	system("pause");
	cl;
	xuan();
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO CursorInfo;
	GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
	CursorInfo.bVisible = false; //隐藏控制台光标
	SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
	ttt = clock();
	out();
	ranf();
	rang();
	rans();
	w(1) {
		if (GetAsyncKeyState('S')) {
			if (a[x + 1][y] != 'O') {
				a[x][y] = ' ';
				x++;
				a[x][y] = 'H';
			}
		}
		if (GetAsyncKeyState('D')) {
			if (a[x][y + 1] != 'O') {
				a[x][y] = ' ';
				y++;
				a[x][y] = 'H';
			}
		}
		if (GetAsyncKeyState('A')) {
			if (a[x][y - 1] != 'O') {
				a[x][y] = ' ';
				y--;
				a[x][y] = 'H';
			}
		}
		if (GetAsyncKeyState('W')) {
			if (a[x - 1][y] != 'O') {
				a[x][y] = ' ';
				x--;
				a[x][y] = 'H';
			}
		}

		if (GetAsyncKeyState('K')) {
			if (a[p + 1][q] != 'O') {
				a[p][q] = ' ';
				p++;
				a[p][q] = 'R';
			}
		}
		if (GetAsyncKeyState('L')) {
			if (a[p][q + 1] != 'O') {
				a[p][q] = ' ';
				q++;
				a[p][q] = 'R';

			}
		}
		if (GetAsyncKeyState('J')) {
			if (a[p][q - 1] != 'O') {
				a[p][q] = ' ';
				q--;
				a[p][q] = 'R';
			}
		}
		if (GetAsyncKeyState('I')) {
			if (a[p - 1][q] != 'O') {
				a[p][q] = ' ';
				p--;
				a[p][q] = 'R';
			}
		}

		if (clock() - ttt >= 100000) {
			if (W1 || W2 || W3) {
				win(2);
			} else {
				win(1);
			}
			break;
		}

		if (x == p && y == q) {
			int jie = zhan();
			if (jie == 2) {
				win(2);
				break;
			}
		}

		if (x == n && y == m) {
			W1 = false;
			n = 48, m = 49;
		}
		if (x == c && y == b) {
			W2 = false;
			c = 48, b = 49;
		}
		if (x == f && y == j) {
			W3 = false;
			f = 48, j = 49;
		}

		if (p == n && q == m && W1) {
			a[n][m] = 'R';
			while (1) {
				if (!(p == n && q == m))
					a[n][m] = 'W';
				break;
			}
		} else {
			a[n][m] = 'W';
		}

		if (p == c && q == b && W2) {
			a[c][b] = 'R';
			while (1) {
				if (!(p == c && q == b))
					a[c][b] = 'W';
				break;
			}
		} else {
			a[c][b] = 'W';
		}

		if (p == f && q == j && W3) {
			a[f][j] = 'R';
			while (1) {
				if (!(p == f && q == j))
					a[f][j] = 'W';
				break;
			}
		} else {
			a[f][j] = 'W';
		}

		if (sx == x && sy == y) {
			P1.shengming += 5;
			rans();
		}
		if (sx == p && sy == q) {
			P2.shengming += 5;
			rans();
		}

		if (gx == x && gy == y) {
			P1.gongji += 5;
			rang();
		}
		if (gx == p && gy == q) {
			P2.gongji += 5;
			rang();
		}

		if (fx == x && fy == y) {
			P1.fangyu += 5;
			ranf();
		}
		if (fx == p && fy == q) {
			P2.fangyu += 5;
			ranf();
		}

		out();
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值