我的C++之旅—04
(原创)
gobang源代码
功能:
还原经典双人/五子棋/小游戏,两人对局,局数随意。
#define CHECKBOARDSIZE 15
#define _CRT_SECURE_NO_WARNINGS
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<cstdlib>
#include<iostream>
#include<Windows.h>
#include<mmsystem.h>
#include<graphics.h>
#pragma comment(lib, "winmm.lib")
using namespace std;
int g_checkboard[CHECKBOARDSIZE][CHECKBOARDSIZE];
int g_count; //回合数
int g_x, g_y; //标点的位置
int g_game; //当前玩家 1.黑子 2.白子
char g_key;
int g_1, g_2;
HWND hwnd = NULL;
void init() {
g_count = 0;
memset(g_checkboard, 0, sizeof(g_checkboard));
g_x = g_y = CHECKBOARDSIZE / 2;
g_game = 1;
}
void RunGame() {
g_key = _getch();
switch (g_key)
{
case 32:
if (g_checkboard[g_y][g_x] == 0) {
if (g_game == 1) {
g_checkboard[g_y][g_x] = 1;
g_game = 2;
}
else {
g_checkboard[g_y][g_x] = 2;
g_game = 1;
}
}
break;
case 72:
g_y--;
if (g_y < 0) {
g_y = CHECKBOARDSIZE - 1;
}
break;
case 75:
g_x--;
if (g_x < 0) {
g_x = CHECKBOARDSIZE - 1;
}
break;
case 77:
g_x++;
if (g_x > CHECKBOARDSIZE) {
g_x = 0;
}
break;
case 80:
g_y++;
if (g_y > CHECKBOARDSIZE) {
g_y = 0;
}
break;
default:
break;
}
}
void DrawCheckboard() {
system("cls");
int i, j;
for (i = 0;i < CHECKBOARDSIZE;i++) {
for (j = 0;j < CHECKBOARDSIZE;j++) {
if (g_checkboard[i][j] == 1) {
printf("●");
}
else if (g_checkboard[i][j] == 2) {
printf("○");
}
else if (i == g_y && j == g_x) {
printf("╬ ");
}
else if (i == 0 && j == 0) {
printf(" ┏ ");
}
else if (i == 0 && j == CHECKBOARDSIZE - 1) {
printf("┓ ");
}
else if (j == 0 && i == CHECKBOARDSIZE - 1) {
printf(" ┗ ");
}
else if (j == CHECKBOARDSIZE - 1 && i == CHECKBOARDSIZE - 1) {
printf("┛ ");
}
else if (j == 0 && i < CHECKBOARDSIZE - 1 && i > 0) {
printf(" ┣ ");
}
else if (i == 0 && j < CHECKBOARDSIZE - 1 && j > 0) {
printf("┳ ");
}
else if (j == CHECKBOARDSIZE - 1 && i < CHECKBOARDSIZE - 1 && i > 0) {
printf("┫");
}
else if (i == CHECKBOARDSIZE - 1 && j < CHECKBOARDSIZE - 1 && j > 0) {
printf("┻ ");
}
else {
printf("┼ ");
}
}
printf("\n");
}
}
int GameSuccess() {
int i, j;
for (i = 2;i < CHECKBOARDSIZE-2;i++) {
for (j = 2;j < CHECKBOARDSIZE-2;j++) {
if ((g_checkboard[i][j] == 1 && g_checkboard[i][j - 1] == 1 && g_checkboard[i][j - 2] == 1 && g_checkboard[i][j + 1] == 1 && g_checkboard[i][j + 2] == 1)
|| (g_checkboard[i][j] == 1 && g_checkboard[i - 1][j] == 1 && g_checkboard[i - 2][j] == 1 && g_checkboard[i + 1][j] == 1 && g_checkboard[i + 2][j] == 1)
|| (g_checkboard[i][j] == 1 && g_checkboard[i - 1][j - 1] == 1 && g_checkboard[i + 1][j + 1] == 1 && g_checkboard[i - 2][j - 2] == 1 && g_checkboard[i + 2][j + 2] == 1)
|| (g_checkboard[i][j] == 1 && g_checkboard[i + 1][j - 1] == 1 && g_checkboard[i + 2][j - 2] == 1 && g_checkboard[i - 1][j + 1] == 1 && g_checkboard[i - 2][j + 2] == 1)) {
return 1;
}
if ((g_checkboard[i][j] == 2 && g_checkboard[i][j - 1] == 2 && g_checkboard[i][j - 2] == 2 && g_checkboard[i][j + 1] == 2 && g_checkboard[i][j + 2] == 2)
|| (g_checkboard[i][j] == 2 && g_checkboard[i - 1][j] == 2 && g_checkboard[i - 2][j] == 2 && g_checkboard[i + 1][j] == 2 && g_checkboard[i + 2][j] == 2)
|| (g_checkboard[i][j] == 2 && g_checkboard[i - 1][j - 1] == 2 && g_checkboard[i + 1][j + 1] == 2 && g_checkboard[i - 2][j - 2] == 2 && g_checkboard[i + 2][j + 2] == 2)
|| (g_checkboard[i][j] == 2 && g_checkboard[i + 1][j - 1] == 2 && g_checkboard[i + 2][j - 2] == 2 && g_checkboard[i - 1][j + 1] == 2 && g_checkboard[i - 2][j + 2] == 2)) {
return 2;
}
}
}
return 0;
}
int main() {
int e = 0;
int o;
//窗口标题
SetConsoleTitle("五子棋");
//设置窗口大小、颜色
system("mode con cols=32 lines=18");
system("color E0");
//设置音乐
mciSendString("open bkmusic.mp3 alias music", 0, 0, 0);
mciSendString("play music repeat", 0, 0, 0);
printf("请输入想玩多少局?");
cin >> o;
g_1 = g_2 = 0;
while (e++ < o) {
printf("第%d局游戏即将开始", e);
Sleep(1500);
system("cls");
init();
printf("初始化完成");
Sleep(2000);
DrawCheckboard();
while (1) {
if (_kbhit()) {
RunGame();
DrawCheckboard();
}
if (GameSuccess() == 1) {
MessageBox(hwnd, "您完成了游戏!黑子获胜", "游戏结束", 0);
g_1++;
break;
}
else if (GameSuccess() == 2) {
MessageBox(hwnd, "您完成了游戏!白子获胜", "游戏结束", 0);
g_2++;
break;
}
}
printf(" 黑子得分:%d;白字得分:%d。\n",g_1,g_2);
Sleep(3000);
}
system("cls");
if (g_1>g_2) {
printf("黑子获胜!");
}
else if (g_1 < g_2) {
printf("白字获胜!");
}
else {
printf("平局!");
}
system("pause");
return 0;
}