C++小游戏——边界之争

前言

        今天发了4篇博客了!!

        本游戏为自编!

        粉丝有6个了!(开心)谢谢!!!

        今天发一个数字类战争游戏

        

#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>

using namespace std;

struct Info {
	int num, di; //di:地盘 (1:绿 | 2:黄 | 0:无)
} a[6];

int y = 2, g = 2, w = 1, opt;//y:黄色地盘 |  g:绿色地盘 | w:无人地盘
bool err1, err2;

void init() {
	for (int i = 1; i <= 5; i++) {
		a[i].num = rand() % 6 + 1;
	}
	a[1].di = a[2].di = 1;
	a[3].di =  0;
	a[4].di = a[5].di = 2;
}

void out() {
	system("cls");
	printf ("地图:\n**************\n");
	for (int i = 1; i <= 5; i++) {
		switch (a[i].di) {
			case 1:
				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
				break;
			case 2:
				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
				break;
			default:
				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
				break;
		}
		if (a[i].num < 0)
			a[i].num = 0;
		printf ("%d ", a[i].num);
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
	}
	printf ("\n**************\n");
}

void tian() {
	Sleep(1000);
	printf ("天降神兵!\n");
	Sleep(1500);
	system("cls");
	int cl = rand() % 5 + 1;
	out();
	printf ("降在总第%d个兵营,加三个兵!", cl);
	Sleep(3000);
	a[cl].num += 3;
}

void f1(int n, int l, int m) {//f:绿
	a[n].num -= l;
	a[m].num += l;
}

void f2() {
	if (a[g + 1].di == 0) {
		if (a[g].num > a[g + 1].num) {
			a[g].num -= a[g + 1].num;
			a[g + 1].num = a[g].num;
			a[g].num = 0;
			a[g + 1].di = 1;
			g++;
			w--;
		} else {
			if (a[g].num < a[g + 1].num) {
				a[g + 1].num -= a[g].num;
				a[g].num = a[g + 1].num;
				a[g + 1].num = 0;
				a[g].di = 0;
				g--;
				w++;
			} else {
				a[g].num = 0;
				a[g + 1].num = 0;
			}
		}
	} else {
		if (a[g].num > a[g + 1].num) {
			a[g].num -= a[g + 1].num;
			a[g + 1].num = a[g].num;
			a[g].num = 0;
			a[g + 1].di = 1;
			g++;
			y--;
		} else {
			if (a[g].num < a[g + 1].num) {
				a[g + 1].num -= a[g].num;
				a[g].num = a[g + 1].num;
				a[g + 1].num = 0;
				a[g].di = 2;
				g--;
				y++;
			} else {
				a[g].num = 0;
				a[g + 1].num = 0;
			}
		}
	}
}

void g1(int n, int l, int m) {//g:黄
	n = n + g + w;
	m = m + g + w;
	a[n].num -= l;
	a[m].num += l;
}

void g2() {
	if (a[g + w].di == 0) {
		if (a[g + w + 1].num > a[g + w].num) {
			a[g + w + 1].num -= a[g + w].num;
			a[g + w].num = a[g + w + 1].num;
			a[g + w + 1].num = 0;
			a[g + w].di = 2;
			y++;
			w--;
		} else {
			if (a[g + w + 1].num < a[g + w].num) {
				a[g + w].num -= a[g + w + 1].num;
				a[g + w].num = a[g + w + 1].num;
				a[g + w + 1].num = 0;
				a[g + w + 1].di = 0;
				y--;
				w++;
			} else {
				a[g + w + 1].num = 0;
				a[g + w].num = 0;
			}
		}
	} else {
		if (a[g + w + 1].num > a[g + w].num) {
			a[g + w + 1].num -= a[g + w].num;
			a[g + w].num = a[g + w + 1].num;
			a[g + w + 1].num = 0;
			a[g + w].di = 2;
			y++;
			g--;
		} else {
			if (a[g + w + 1].num < a[g + w].num) {
				a[g + w].num -= a[g + w + 1].num;
				a[g + w].num = a[g + w + 1].num;
				a[g + w + 1].num = 0;
				a[g + w + 1].di = 1;
				y--;
				g++;
			} else {
				a[g + w + 1].num = 0;
				a[g + w].num = 0;
			}
		}
	}
}

void welcome() {
	MessageBox(NULL, TEXT("边	界 	之	争"), TEXT("进入"), MB_OK);
	MessageBox(NULL, TEXT("本游戏需要两个人互相对抗"), TEXT("提示"), MB_OK);
}

void xin() {
	printf ("			新");
	Sleep(1500);
	printf ("			手");
	Sleep(1500);
	printf ("			教");
	Sleep(1500);
	printf ("			程\n");
	Sleep(1500);
}

void zheng() {
	system("cls");
	printf ("			正");
	Sleep(1500);
	printf ("			式");
	Sleep(1500);
	printf ("			游");
	Sleep(1500);
	printf ("			戏\n");
	Sleep(1500);
	system("cls");
}

bool erro1(int n, int l, int m) {
	if (n > g || m > g || a[n].num < l ) {
		err1 = false;
		return false;
	}
	return true;
}

bool erro2(int n, int l, int m) {
	if (g + w > n + g + w || g + w > m + g + w || a[n + g + w].num < l ) {
		err2 = false;
		return false;
	}
	return true;
}

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

int main() {
	SetFont(21);
	system("color 17");
	welcome();
	char c;
	while (1) {
		printf ("是否跳过新手教程?(y/n)\n");
		scanf ("%c", &c);
		if (c == 'n' || c == 'N' || c == 'y' || c == 'Y')
			break;
		else
			printf ("输入错误!\n");
		Sleep(1500);
		system("cls");
	}
	system("color 07");
	//新手教程
	if (c == 'n' || c == 'N') {
		system("cls");
		xin();
		printf ("一:布局\n");
		Sleep(1000);
		printf ("共5个地盘,初始绿、黄双方各2个地盘,中间的无人领地1个地盘\n");
		Sleep(1000);
		printf ("兵营号为本队从左到右数的第几个兵营,数字代表本兵营的兵力,颜色代表阵营(绿色为绿队,灰色为无人领地,黄色为黄色)\n");
		system("pause");
		system("cls");

		printf ("二:输入类型\n");
		Sleep(1000);
		printf ("输入1:换兵\n");
		Sleep(1000);
		printf ("输入2:进攻\n");
		Sleep(1000);
		printf ("输入其他数字:不操作\n");
		Sleep(1000);
		printf ("提示:要先输入表示操作类型的数字哦~\n");
		system("pause");
		system("cls");

		printf ("三:操作输入\n");
		while (1) {
			printf("操作输入\"1\":换兵\n");
			Sleep(1000);
			printf ("首先,输入1表示你要换兵;其次,输入需要调动的兵营号;然后,输入想要调动的兵力的数量;最后,输入要调往的兵营号。\n");
			Sleep(2000);
			printf("地图:\n**************\n");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
			printf ("9 5 ");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
			printf ("6 ");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
			printf ("6 5");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
			printf ("\n**************\n请绿操作!\n\n");
			Sleep(2000);
			printf ("试着在绿队1号兵营中抽出6个兵移到2号兵营吧!\n");
			printf("提示:要先输入数字1,表示你要换兵哦!\n");
			int a, b, c, d;
			scanf ("%d%d%d%d", &a, &b, &c, &d);
			if (a == 1 && b == 1 && c == 6 && d == 2)
				break;
			else {
				printf("输入错误!");
				Sleep(1000);
				system("cls");
			}
		}
		system("cls");
		printf("地图:\n**************\n");
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
		printf ("3 11 ");
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
		printf ("6 ");
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
		printf ("6 5");
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
		printf ("\n**************\n");
		Sleep(1002);
		printf ("很好!\n");
		Sleep(2500);
		system("cls");
		while (1) {
			printf("操作输入\"2\":进攻\n");
			Sleep(1000);
			printf("效果:让本队最靠近敌方(包括无人领地)的兵营进攻\n");
			Sleep(2000);
			printf("分三种情况:\n一:我多敌少,夺得一格地盘,消耗兵力为对方兵力\n");
			printf("地图:\n*****\n");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
			printf ("5 ");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
			printf ("3");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
			printf ("\n*****\n请绿操作!\n\n");
			Sleep(2000);
			printf("请输入\"2\"进攻!\n");
			int x;
			scanf ("%d", &x);
			if (x == 2) {
				break;
			} else {
				printf("输入错误!");
				Sleep(1000);
				system("cls");
			}
		}
		printf("地图:\n*****\n");
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
		printf ("2 0");
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
		printf ("\n*****\n");
		Sleep(1000);
		printf ("很好!\n");
		Sleep(1000);
		system("cls");
		while (1) {
			printf("二:敌多我少,失去一格地盘,本兵营兵力归零,对方兵力消耗为我方兵力\n");
			printf("地图:\n*****\n");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
			printf ("2 ");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
			printf ("5");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
			printf ("\n*****\n请绿操作!\n\n");
			Sleep(2000);
			printf("请输入\"2\"进攻!\n");
			int x;
			scanf ("%d", &x);
			if (x == 2) {
				break;
			} else {
				printf("输入错误!");
				Sleep(1000);
				system("cls");
			}
		}
		printf("地图:\n*****\n");
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
		printf ("0 3");
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
		printf ("\n*****\n");
		Sleep(1000);
		printf ("很好!\n");
		Sleep(1000);
		system("cls");
		while (1) {
			printf("三:敌我相等,地盘不变,双方兵力都归零\n");
			printf("地图:\n*****\n");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
			printf ("11 ");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
			printf ("11");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
			printf ("\n*****\n请绿操作!\n\n");
			Sleep(2000);
			printf("请输入\"2\"进攻!\n");
			int x;
			scanf ("%d", &x);
			if (x == 2) {
				break;
			} else {
				printf("输入错误!");
				Sleep(1000);
				system("cls");
			}
		}
		printf("地图:\n*****\n");
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);
		printf ("0 ");
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
		printf ("0");
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
		printf ("\n*****\n");
		Sleep(1000);
		printf ("很好!\n");
		Sleep(1000);
		system("cls");

		printf ("四:获胜条件\n");
		Sleep(1000);
		printf("谁先占领所有地盘,谁就赢了!\n");
		system("pause");
		system("cls");

		printf("恭喜你,完成了新手教程!\n祝游玩愉快!\n");
		system("pause");
	}

	//正式
	system("cls");
	zheng();

	srand(time(0));
	init();
	while (1) {
		int t = rand() % 4;
		if (t == 1)
			tian();
		while (1) {
			err1 = true;
			out();
			printf ("请绿操作!\n");
			scanf ("%d", &opt);
			switch (opt) {
				case 1://移兵
					int n, m, l;
					scanf("%d%d%d", &n, &l, &m);
					if (erro1(n, l, m))
						f1(n, l, m);
					break;
				case 2://攻击
					f2();
					break;
			}
			if (!err1) {
				printf ("操作错误!\n");
				Sleep(1000);
			} else
				break;
		}

		//判断1
		if (g == 5) {
			out();
			Sleep(1000);
			system("cls");
			MessageBox(NULL, TEXT("恭喜绿胜利了!!!"), TEXT("胜利了!!!"), MB_OK);
			break;
		} else {
			if (y == 5) {
				out();
				Sleep(1000);
				system("cls");
				MessageBox(NULL, TEXT("恭喜黄胜利了!!!"), TEXT("胜利了!!!"), MB_OK);
				break;
			}
		}

		system("cls");
		while (1) {
			err2 = true;
			out();
			printf ("请黄操作!\n");
			scanf ("%d", &opt);
			switch (opt) {
				case 1://移兵
					int n, m, l;
					scanf("%d%d%d", &n, &l, &m);
					if (erro2(n, l, m))
						g1(n, l, m);
					break;
				case 2://攻击
					g2();
					break;
			}
			if (!err2) {
				printf ("操作错误!\n");
				Sleep(1000);
			} else
				break;
		}

		//判断2
		if (g == 5) {
			out();
			Sleep(1000);
			system("cls");
			MessageBox(NULL, TEXT("恭喜绿胜利了!!!"), TEXT("胜利了!!!"), MB_OK);
			break;
		} else {
			if (y == 5) {
				out();
				Sleep(1000);
				system("cls");
				MessageBox(NULL, TEXT("恭喜黄胜利了!!!"), TEXT("胜利了!!!"), MB_OK);
				break;
			}
		}
	}
	system("pause");
	return 0;
}

加油更!

求关(会回关)

-------------------------------------------分割线-------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值