实现功能

生成棋盘玩家1与玩家2对战,哪个玩家率先有连续5子连线,哪个玩家赢。

如何实现

组成:

二维数组:board[ROW][COL],定义一个ROW*COL的棋盘。

主要逻辑:

显示棋盘,提示用户下子,下子后判断,
1.显示棋盘很简单,慢慢凑棋盘就好
2. 用户下子,注意两个条件:棋子在棋盘里,下子位置未被占用。
3.判断是最难的,
方法:从下子位置的8个方向(上,下,左,右,右上,右下,左上,左下)计算相同棋子数目,然后将对角的棋子数相加,等于5说明有5子连线

主要函数中用到三个主要实现函数:

Showboard(board, ROW, COL);//展示棋盘
Playermove(board, ROW, COL, cur);//玩家下注,cur表示哪个玩家下子
Judge(board, ROW, COL);//判断5子连线
Getcount(board[][COL], row, col, dir)//计算方向dir相同棋子数

代码

头文件

#ifndef __FIVECHREE_H__
#define __FIVECHREE_H__#include<stdio.h>
#include<windows.h>
#pragma warning(disable:4996)#define ROW 10//棋盘行数
#define COL 10//棋盘列数
#define INIT '*'//棋盘初始化#define PLAYER1 1
#define PLAYER2 2
#define NEXT 3//继续往下下
#define DRAW 4//棋盘下满 平局//8个方向
#define UP 10
#define RIGHT_UP 11
#define RIGHT 12
#define RIGHT_DOWN 13
#define DOWN 14
#define LEFT_DOWN 15
#define LEFT 16
#define LEFT_UP 17extern void Menu();
extern void Game();#endif

main函数源文件

#include"fivechree.h"
int main(){int quit = 0;while (!quit){Menu();int select = 0;scanf("%d", &select);switch (select){case 1:Game();break;case 2:quit = 1;break;default:printf("Enter Error!\n");break;}}printf("Byebye\n");system("pause");return 0;
}

函数定义源文件

#include"fivechree.h"static int x = 0;
static int y = 0;void Menu(){printf("+---------------------+\n");printf("+- 1.Play    2.Exit  -+\n");printf("+---------------------+\n");printf("Please Enter Your Select#");}
static void Showboard(int board[][COL], int row, int col){//展示棋盘 o玩家1棋子,x玩家2棋子system("cls");for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){switch (board[i][j]){case PLAYER1:board[i][j] = 'o';break;case PLAYER2:board[i][j] = 'x';break;case 0:board[i][j] = INIT;break;default:break;}}}printf("  ");for (int i =1; i <= row; i++){printf("%2d ", i);}printf("\n");for (int i = 1; i <= row; i++){printf("%-2d", i);for (int j = 1; j <= col; j++){printf(" %c ", board[i - 1][j - 1]);}printf("\n");}
}static void Playermove(int board[][COL], int row, int col, int who){//玩家下子,who 为哪个玩家下子while (1){printf("Please Enter PLAYER%d Postion<x,y>#", who);scanf("%d %d", &x, &y);if (x<1 || x>row || y<1 || y>col){  //超过棋盘范围printf("Postion is error!\n");continue;}if (board[x - 1][y - 1] == INIT){//判断位置是否已被下子board[x - 1][y - 1] = who;break;}printf("Postion is not empty\n");}}static int Getcount(int board[][COL], int row, int col, int dir){//判断8个方向相同棋子的数目int _x = x;//_x,_y变化,后面与x,y棋子相比较int _y = y;int count = 0;while (1){switch (dir){case UP:_x--;break;case DOWN:_x++;break;case LEFT:_y--;break;case RIGHT:_y++;break;case RIGHT_UP:_x--, _y++;break;case RIGHT_DOWN:_x++, _y++;break;case LEFT_DOWN:_x++, _y--;break;case LEFT_UP:_x--, _y--;break;default:break;}if (_x>=1 || _x<=row || _y>=1 || _y<=col){//棋子不能越界if (board[x-1][y-1] == board[_x-1][_y-1]){//printf("yes\n");count++;}else{//printf("no\n");break;}}else{return count;}}return count;
}
//如何判断:从下子位置的8个方向(上,下,左,右,右上,右下,左上,左下)
//计算相同棋子数目,然后将对角的棋子数相加,等于5说明有5子连线
static int Judge(int board[][COL], int row, int col){int count1 = Getcount(board, row, col, UP)\+ Getcount(board, row, col, DOWN);//printf("%d\n", count1);if (count1 >= 4){return board[x-1][y-1];}count1 = Getcount(board, row, col, RIGHT_UP)\+ Getcount(board, row, col, LEFT_DOWN);//printf("%d\n", count1);if (count1 >= 4){return board[x-1][y-1];}count1 = Getcount(board, row, col, RIGHT)\+ Getcount(board, row, col, LEFT);//printf("%d\n", count1);if (count1 >= 4){return board[x-1][y-1];}count1 = Getcount(board, row, col, RIGHT_DOWN)\+ Getcount(board, row, col, LEFT_UP);if (count1 >= 4){return board[x-1][y-1];}for (int i = 0; i < row; i++){//判断棋盘是否下满for (int j = 0; j < col; j++){if (board[i][j] == INIT){return NEXT;}}}return DRAW;
}void Game(){int board[ROW][COL] = { 0 };//memset(board, INIT, ROW*COL);int result = 0;int cur = PLAYER1;Showboard(board, ROW, COL);//先展示棋盘while (1){//Showboard(board, ROW, COL);Playermove(board, ROW, COL, cur);Showboard(board, ROW, COL);//棋盘将board数组变化,所以要在判断前将数组变化result = Judge(board, ROW, COL);if (result != NEXT){break;}cur = (cur == PLAYER1 ? PLAYER2 : PLAYER1);//三目表达式,注意不是 PLAYER1 ? PLAYER2 : PLAYER1}Showboard(board, ROW, COL);switch (result){case 'o':printf("Player1 Win!\n");break;case 'x':printf("Player2 Win!\n");break;case DRAW:printf("Tie Game!\n");break;default://printf("%c\n", result);printf("BUG\n");break;}
}

双人小游戏—五子棋(c语言)相关推荐

  1. C语言小游戏-五子棋

    C语言小游戏-五子棋 全部代码如下: #include <easyx.h> #include <graphics.h> #include <conio.h> #in ...

  2. C语言小游戏---------------------五子棋

    这是一个用C语言实现的控制台小游戏--五子棋,棋盘大小和获胜棋子数目是用宏定义的,可以自定义,所以可以轻松改为三子棋.六子棋等等.此游戏设定为人机对战(PVE),电脑走棋是随机的. 编译环境:VS20 ...

  3. C语言简单的双人小游戏

    #include<stdio.h>//双人小游戏 #include<windows.h> int main() {     printf("规则:输1聚气(用于买招式 ...

  4. c++游戏代码坦克大作战_一红一蓝多种模式的双人小游戏:红蓝大作战

    作者有话说:上次推荐的森林冰火人很多小伙伴后台找我要链接,或者搜索不到:首先声明下森林冰火人.同桌大作战都不是辣椒人游戏工作室研发的,小编也是微信小游戏双人栏目下搜索到的,如果想要玩双人小游戏的可以打 ...

  5. Python制作的足球双人小游戏,你确定你不过来看看?

    相关文件 关注小编,私信小编领取哟! 当然别忘了一件三连哟~~ 对了大家可以关注小编的公众号哟~~ Python日志 开发环境 Python版本:3.6.4 相关模块: pygame模块: 以及一些P ...

  6. java小游戏:五子棋人机大战

    一.java小游戏:五子棋人机大战 1.绘制窗口 package wuziqi;import javax.swing.*; import java.awt.event.MouseAdapter; im ...

  7. c语言小游戏代码(c语言小游戏代码简单)

    c语言编写小游戏请提供俄罗斯方块,坦克大战之类的小游戏的程序的c 应该是做出方块函数 然后以 这个方块 为单位 绘制 俄罗斯方块的 积木图形 ,在制作游戏界面的时候 也以方块长度为单位长度绘制 二维数 ...

  8. Java小游戏——五子棋

    Java小游戏--五子棋详细解析

  9. pyhton小游戏-五子棋

    python小游戏 - 五子棋 1.包的下载 此小游戏需要pygame和numpy两个包 pip install pygame pip install numpy 2. 必要图片 三张图片必须放在和p ...

  10. 射击双人小游戏之死亡空间2

    双人小游戏在小游戏里是很手欢迎的哦,可以很朋友一起玩游戏是很快乐的,这款死亡空间2不仅是双人游戏,还能多人联机,最多是4个人,这样玩起来更爽不是吗,而且这款死亡空间是射击小游戏,这种游戏对于男孩子来说 ...

最新文章

  1. Python 使用sys.exc_info自己捕获异常详细信息
  2. 利用js-xlsx.js插件实现Excel文件导入并解析Excel数据成json数据格式
  3. Python学习教程(Python学习路线):Python3之递归函数简单示例
  4. 摄像机丢失信号及偏色的检测思路
  5. java 博客系统_讲解开源项目:5分钟搭建私人Java博客系统
  6. Python入门字符串
  7. 一个用Axure开发的安卓Android智能交通app的mockup
  8. MySQL 管理猿利器: MySQL ODBC for iPhone!
  9. 什么是线程池?(带你初步入门理解线程池)
  10. mysql损坏打不开_mac系统上 MySQL Workbench意外退出,再也打不开
  11. RIME-使用小心得
  12. iptv错误代码2003什么意思_IPTV部分错误代码和原因解释
  13. 爬取大众点评数据经验
  14. Ubuntu 20.4 安装 Notepad++
  15. html 设置日期选择器样式,解决Element UI 日期选择器自定义修改多个样式
  16. 百度识图API教程一:使用百度api识别物体
  17. 李鸿章六百多字参倒豪门重臣,晚清第一奏折,藏尽顶级权谋话术!
  18. 微型计算机装机顺序,小伙子,听说你要装机?这款机箱够你玩好多年
  19. Codeforces Round #827 (Div. 4) D - F
  20. Oracle占用内存过高解决办法

热门文章

  1. 贴片晶振为什么要邻层挖空敷铜,背后的原理原来是这样的!#终南小师傅
  2. cesium-加载天地图影像
  3. 使用逆火日志分析器简单分析日志
  4. RPC框架简析--Pigeon
  5. 局域网中广播风暴产生原因及解决方法
  6. 完美安装运行Xcelsius 2008 SP3解决方案
  7. ES拼音中文智能提示suggest
  8. 算法注册机编写扫盲---第四课
  9. 金色经典图案背景新中式PPT模板
  10. 【Unity】超级坦克大战(九)闯关流程:游戏行为对象模板