connect four / tic-tak-toe
来源:互联网 发布:淘宝断码地带是正品吗 编辑:程序博客网 时间:2024/05/16 15:46
在<jump into c++>中有一道课后题P104第三题
另外看到机核网微博里写的一个在美国学习游戏开发的人的课程设计里面也提到了这个东西
觉得有必要自己实现一下
这里做的是正方形棋盘
开发环境为vs2015
#include <iostream>#include <ctime>#include <iomanip>const int maximum = 10;int custom_size = 5;void show(char arr[], int size) {std::cout << " ";for (int i = 0; i < size; ++i) {std::cout << i << " ";}std::cout << std::endl;std::cout << " ";for (int i = 0; i < size * 2 + 1; ++i) {std::cout << "-";}std::cout << std::endl;for (int i = 0; i < size; ++i) {std::cout << i << "| ";for (int j = 0; j < size; ++j) {std::cout << arr[i*size + j] << " ";}std::cout << "|" << std::endl;}std::cout << " ";for (int i = 0; i < size * 2 + 1; ++i) {std::cout << "-";}std::cout << std::endl;}bool isValidInput(char arr[], int x, int y) {if (x > custom_size || y > custom_size || x < 0 || y < 0)return false;return arr[x + y*custom_size] == ' ';}bool checkWin(char arr[], int x , int y, char mark) {bool bContinuous = true;int left_count = 4;int adjacent_count = 0;// \ orientationadjacent_count = 0;// out directionbContinuous = true;for (int i = 0; i < 4 && x - i >= 0 && x - i < custom_size && y - i >= 0 && y - i < custom_size; ++i) {if (arr[x - i + (y - i) * custom_size] == mark) {--left_count;if (++adjacent_count == 4) {return true;}} else {bContinuous = false;}}if (bContinuous) {// in direction, i start from 1, to avoid calculating the original point twicefor (int i = 1; i <= left_count && x + i >= 0 && x + i < custom_size && y + i >= 0 && y + i < custom_size; ++i) {if (arr[x + i + (y + i) * custom_size] == mark) {if (++adjacent_count == 4) {return true;}}else {bContinuous = false;}}}if (bContinuous && adjacent_count >= 4) { return true; }// | orientationleft_count = 4;adjacent_count = 0;// out directionbContinuous = true;for (int i = 0; i < 4 && x >= 0 && x < custom_size && y - i < custom_size && y - i >= 0; ++i) {if (arr[x + (y - i) * custom_size] == mark) {--left_count;if (++adjacent_count == 4) {return true;}}else {bContinuous = false;}}if (bContinuous) {// in direction, i start from 1, to avoid calculating the original point twicefor (int i = 1; i <= left_count && x >= 0 && x < custom_size && y + i >= 0 && y + i < custom_size; ++i) {if (arr[x + (y + i) * custom_size] == mark) {if (++adjacent_count == 4) {return true;}}else {bContinuous = false;}}}if (bContinuous && adjacent_count >= 4) {return true;}// / orientationleft_count = 4;adjacent_count = 0;// out directionbContinuous = true;for (int i = 0; i < 4 && x + i >= 0 && x + i < custom_size && y - i < custom_size && y - i >= 0; ++i) {if (arr[x + i + (y - i) * custom_size] == mark) {--left_count;if (++adjacent_count == 4) {return true;}}else {bContinuous = false;}}if (bContinuous) {// in direction, i start from 1, to avoid calculating the original point twicefor (int i = 1; i <= left_count && x - i >= 0 && x - i < custom_size && y + i >= 0 && y + i < custom_size; ++i) {if (arr[x - i + (y + i) * custom_size] == mark) {if (++adjacent_count == 4) {return true;}}else {bContinuous = false;}}}if (bContinuous && adjacent_count >= 4) {return true;}// - orientationleft_count = 4;adjacent_count = 0;// out directionbContinuous = true;for (int i = 0; i < 4 && x + i >= 0 && x + i < custom_size && y >= 0 && y < custom_size; i++) {--left_count;if (arr[x + i + y * custom_size] == mark) {++adjacent_count;}else {bContinuous = false;}}if (bContinuous) {// in directionfor (int i = 0; i <= left_count && x - i >= 0 && x - i < custom_size && y >= 0 && y < custom_size; i++) {if (arr[x - i + y* custom_size] == mark) {++adjacent_count;}else {bContinuous = false;}}}if (bContinuous && adjacent_count >= 4) {return true;}return false;}int main() {bool bInputOk = false;char arr[maximum*maximum];while (!bInputOk) {std::cout << "Please set the size of game(maximum 10):" << std::endl;std::cin >> custom_size;if (custom_size > 0 && custom_size <= maximum) {bInputOk = true;}}for (int i = 0; i < maximum*maximum; ++i) {arr[i] = ' ';}show(arr, custom_size);std::cout << "<<<<game start>>>>" << std::endl;bool bGameover = false;while (!bGameover) {int p1x, p1y, p2x, p2y;bInputOk = false;while (!bInputOk) {std::cout << "player1 input x and y(maxsize:" << custom_size << ")" << std::endl;std::cin >> p1x >> p1y;std::cin.ignore();bInputOk = isValidInput(arr, p1x, p1y);}arr[p1x + p1y*custom_size] = 'X';show(arr, custom_size);bGameover = checkWin(arr, p1x, p1y, 'X');if (bGameover) {std::cout << "player1 win" << std::endl;break;}bInputOk = false;while (!bInputOk) {std::cout << "player2 input x and y(maxsize:" << custom_size << ")" << std::endl;std::cin >> p2x >> p2y;std::cin.ignore();bInputOk = isValidInput(arr, p2x, p2y);}arr[p2x + p2y*custom_size] = 'O';show(arr, custom_size);bGameover = checkWin(arr, p2x, p2y, 'O');if (bGameover) {std::cout << "player2 win" << std::endl;break;}}std::cin.get();return 0;}
阅读全文
0 0
- connect four / tic-tak-toe
- Tic-Tac-Toe
- [cf]Tic-tac-toe
- C - Tic-tac-toe
- Minimax-Tic Tac Toe
- Design Tic-Tac-Toe
- Design Tic-Tac-Toe
- Design Tic-Tac-Toe
- FZU Tic-Tac-Toe
- Tic-Tac-Toe FZU
- FZU2283-Tic-Tac-Toe
- tic-tac-toe游戏
- Analysis On Tic-Tac-Toe
- poj 3075 Tic-Tac-Toe
- checkio (tic-tac-toe)
- AOJ 0066 Tic Tac Toe
- UVa 10363 - Tic Tac Toe
- poj 2361 Tic Tac Toe
- 写在开博之前
- What's the difference of name scope and a variable scope in tensorflow?
- 最近也许会用的可能对作图有用的工具整理
- Eclipse 高亮显示选中的相同变量
- 微服务体系下如何快速构建一个服务
- connect four / tic-tak-toe
- 055 不定积分概念与性质
- Xcode9学习笔记1
- samohyes的心情随笔(3)
- Java中的final关键字
- pads layout 9.5笔记2-多层板设计要点
- 【BZOJ2118】墨墨的等式(dijkstra)
- bzoj 1005: [HNOI2008]明明的烦恼
- 【BZOJ2287】【POJChallenge】消失之物(权限题)