#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <io.h>
#define HIGHT 20
#define WIGHT 80
#define N 8
#define BLACK 1
#define WHITE 2
#define BPOS 3
#define WPOS 4
#define SPACE 0
#define LEFT 75
#define UP 72
#define RIGHT 77
#define DOWN 80
#define ESC 27
using namespace std;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) struct nod {
int x, y;
}point;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int black, white, first, continued, esc;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) int move[4][2] = { {-1, 0}, {0, -1}, {1, 0}, {0, 1}};//up left down right
int map[N][N], tp[N][N]; // 0->NULL 1->black 2->white
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) char mode[16][3] = {"╔","═","╦","╗","╠","╬","╣","╚",
"╩","╝","║", " ", "●", "○", "◆", "◇"};
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) void logo() {
system("cls");
puts("\t _O_ 黑 _____ 白 _<>_ 棋 ___ ");
puts("\t / \\ | | / \\ / _ \\");
puts("\t |==/=\\==| |[/_\\]| |==\\==/==| | / \\ |");
puts("\t | O O | / O O \\ | >< | | |\"| |");
puts("\t \\ V / /\\ - /\\ ,-\\ () /-. \\ X /");
puts("\t ");
puts("\t /`---'\\ /`---'\\ V( `-====-' )V /`---'\\");
puts("\t O'_:_`O O'M|M`O (_____:|_____) O'_|_`O ");
puts("\t -- -- -- -- ---- ---- -- -- ");
puts("\t 请选择先手 \n\n");
puts("\t\t 1、 ● \n");
puts("\t\t 2、 ○ \n");
puts("\t\t 3、 退出 \n");
printf("\t\t 您的选择:");
scanf("%d", &first);
if(first != 1 && first != 2 && first != 3) logo();
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) void draw(char head[], char body[], char cross[], char tail[], int size, int row, int mp[N][N]) {
printf("%s", head);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) for(int i = 1; i < 2 * size; i ++) {
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if(i % 2 == 0) {
printf("%s", cross);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) } else {
int t = (i + 1) / 2 - 1, r = row / 2 - 1;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if(row % 2 == 0 && ((i + 1) % 2 == 0)) {
printf("%s", mode[11 + mp[r][t]]);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) } else {
printf("%s", body);
}
}
}
printf("%s\n", tail);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) void set_map(int size, int mp[N][N]) {
int temp;
system("cls");
temp = (HIGHT - size) / 2;
puts("\n\t\t\t\t黑白棋");
puts("\t\t\t 用ENTER放置棋子 用ESC键退出\n");
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) for(int i = 1; i <= 2 * size + 1; i ++) {
temp = (WIGHT - 2 * size + 1) / 2 - 2 * size + 1;
for(int j = 0; j < temp; j ++) putchar(' ');
if(i == 1) draw(mode[0], mode[1], mode[2], mode[3], size, i, mp);
else if(i == 2 * size + 1) draw(mode[7], mode[1], mode[8], mode[9], size, i, mp);
else if(i % 2) draw(mode[4], mode[1], mode[5], mode[6], size, i, mp);
else draw(mode[10], mode[11], mode[10], mode[10], size, i, mp);
}
printf("\n\t记分牌: ○:%d \t ●:%d\n", white, black);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) void init() {
memset(map, 0, sizeof(map));
map[3][3] = map[4][4] = BLACK;
map[4][3] = map[3][4] = WHITE;
//map[0][0] = WHITE;
//map[1][0] = BLACK;
//map[0][1] = BLACK;
point.x = point.y = 0;
black = 2;
white = 2;
set_map(8, map);
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) int move8[8][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0},
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) bool inmap(int x, int y) {
if(x < 0 || y < 0 || x >= N || y >= N) return false;
return true;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) bool judge(int x, int y, int col, int mp[N][N]) {
if(mp[x][y] == WHITE || mp[x][y] == BLACK) return false;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) for(int dic = 0; dic < 8; dic ++) {
int tx = x + move8[dic][0], ty = y + move8[dic][1], flag = 0;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) while(mp[tx][ty] == 3 - col && inmap(tx, ty)) {
tx += move8[dic][0];
ty += move8[dic][1];
flag = 1;
}
if(!flag) continue;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if( inmap(tx, ty) ) {
if(mp[tx][ty] == col) return true;
}
}
return false;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) void change(int x, int y, int col, int mp[N][N]) {
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) for(int dic = 0; dic < 8; dic ++) {
int tx = x + move8[dic][0], ty = y + move8[dic][1], flag = 0;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) while(mp[tx][ty] == 3 - col && inmap(tx, ty)) {
tx += move8[dic][0];
ty += move8[dic][1];
flag = 1;
}
if(!flag) continue;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if( inmap(tx, ty) ) {
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if(mp[tx][ty] == col) {
int xx = x, yy = y;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) while(xx != tx || yy != ty) {
mp[xx][yy] = col;
xx += move8[dic][0];
yy += move8[dic][1];
}
}
}
}
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) void calc(int mp[N][N]) {
white = black = 0;
for(int i = 0; i < N; i ++)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) for(int j = 0; j < N; j ++) {
if(mp[i][j] == WHITE) white ++;
if(mp[i][j] == BLACK) black ++;
}
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) bool isok(int col, int mp[N][N]) {
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) for(int i = 0; i < N; i ++) {
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) for(int j = 0; j < N; j ++) {
if( judge(i, j, col, mp) ) return true;
}
}
return false;
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) void GameOver() {
system("cls");
cout << "\t\t\t\t黑白棋\n\n" << endl;
cout << "\t\t※※※※※※※※※※※※※※※※※※※※※" << endl;
cout << "\t\t※ ※" << endl;
cout << "\t\t※ ※" << endl;
cout << "\t\t※ ※" << endl;
cout << "\t\t※ ※" << endl;
cout << "\t\t※";
cout <<" GAME OVER ";
cout << "※" << endl;
cout << "\t\t※ ※" << endl;
cout << "\t\t※ ";
printf( "●:%2d ○:%2d ※\n",white, black); ;
cout << "\t\t※ ※" << endl;
cout << "\t\t※ ※" << endl;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if( black < white) {
cout << "\t\t※ ● wins! ※" << endl;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) } else if( black > white) {
cout << "\t\t※ ○ wins! ※" << endl;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) } else {
cout << "\t\t※ TIE ※" << endl;
}
cout << "\t\t※ ※" << endl;
cout << "\t\t※ ※" << endl;
cout << "\t\t※ ※" << endl;
cout << "\t\t※ ※" << endl;
cout << "\t\t※※※※※※※※※※※※※※※※※※※※※" << endl;
cout << endl << endl;
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) void final() {
GameOver();
printf( "\t\t 是否继续(Y/N): ");
char ss[2];
scanf("%s", ss);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if(ss[0] == 'Y') {
system("pause");
return;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) } else {
esc = 1;
return;
}
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) void play() {
int player = 2 + first;
int last = map[0][0];
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) while(true) {
int flag = 0;
map[point.x][point.y] = last;
set_map(8, map);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if( !isok(player - 2, map) && !isok(5 - player, map) ) {
final();
return;
} else
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if( !isok(player - 2, map) ) {
flag = 1;
player = 7 - player;
}
map[0][0] = player;
set_map(8, map);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if(flag) {
printf("本方无棋可走,更换棋手\n");
}
char keyborad;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) while( (keyborad = getch()) != '\x0d') {
keyborad = getch();
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if(keyborad == ESC) {
esc = 1;
return;
}
int dic;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) switch(keyborad) {
case UP:
dic = 0;
break;
case LEFT:
dic = 1;
break;
case DOWN:
dic = 2;
break;
case RIGHT:
dic = 3;
break;
default:
keyborad = getch();
continue;
}
int tx = (point.x + N + move[dic][0]) % N, ty = (point.y + N + move[dic][1]) % N;
map[point.x][point.y] = last;
point.x = tx;
point.y = ty;
last = map[point.x][point.y];
map[point.x][point.y] = player;
set_map(8, map);
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if( judge(point.x, point.y, player - 2, map) && last == SPACE) {
map[point.x][point.y] = player - 2;
change(point.x, point.y, player - 2, map);
calc(map);
player = 3 + WPOS - player;
point.x = point.y = 0;
last = map[0][0];
map[0][0] = player;
set_map(8, map);
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) } else {
set_map(8, map);
puts("\t \t \t 该位置不能放置");
system("pause");
map[point.x][point.y] = last;
last = map[0][0];
point.x = point.y = 0;
}
}
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif) int main() {
logo();
if(first == 3) return 0;
continued = 1; esc = 0;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) while(continued && !esc) {
init();
play();
}
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
|