程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-05(1)

双人小游戏—五子棋(c语言)

发布于2021-06-07 22:06     阅读(670)     评论(0)     点赞(17)     收藏(1)


实现功能

生成棋盘玩家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 17

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

原文链接:https://blog.csdn.net/weixin_57023347/article/details/117463405



所属网站分类: 技术文章 > 博客

作者:来呀来呀开心吧

链接:http://www.phpheidong.com/blog/article/89659/fa3766471064e8b45eeb/

来源:php黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

17 0
收藏该文
已收藏

评论内容:(最多支持255个字符)