C语言实现一条龙小游戏

一条龙小游戏
一、代码构思
全部代码分为三个文件:game.h, game.c, text.c(game.h用来申明所有用到的函数,game.c用来写实现游戏的代码,text.c用来调试代码)
第一步将棋盘初始化为空格;第二步打印棋盘;第三步设计由玩家先走(在棋盘中放入X),然后电脑走(在棋盘中放入*);第四步判断输赢,若有一方有三个相同的子连在一条直线上则赢了,另一方输;若棋盘满了也没有三子连成一线,则为平局。
其中头文件game.h


#ifndef __GAME_H__
#define __GAME_H__

#include <time.h>
#include<stdio.h>
#include <stdlib.h>
#include<time.h>

#define ROW 3//棋盘的行数
#define COL 3//棋盘的列数


void InitBoard(char board[ROW][COL], int row, int col);//初始化棋盘函数
void DisplayBoard(char board[ROW][COL], int row, int col);//打印棋盘函数
void PlayerMove(char board[ROW][COL], int row, int col);//玩家走函数
void ComputerMove(char board[ROW][COL], int row, int col);//电脑走函数

char IsWin(char board[ROW][COL], int row, int col);//判断输赢函数

#endif //__GAME_H__

二、游戏界面构思
设计一个简单的进入游戏菜单及棋盘

void menu()
{
	printf("**************************************\n");
	printf("*************  1.play ****************\n");
	printf("*************  0.exit ****************\n");
	printf("**************************************\n");//游戏菜单
}

菜单效果
菜单效果

void DisplayBoard(char board[ROW][COL], int row, int col)//定义一个二维数组输出函数
{
	int i = 0;
	int j = 0;
	for (i = 0; i<row; i++)
	{
		//printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);有局限性,游戏无法扩展
		for (j = 0; j<col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j<col - 1)
				printf("|");//打印数据行
		}
		printf("\n");
		if (i<row - 1)
		{
			//printf("---|---|---\n");
			for (j = 0; j<col; j++)
			{
				printf("---");
				if (j<col - 1)
					printf("|");//打印分割行
			}
			printf("\n");
		}
	}
}
void InitBoard(char board[ROW][COL], int row, int col)//定义一个二位数初始化函数
{
 memset(&board[0][0], ' ', row*col*sizeof(board[0][0]));//内存设置函数,从二维数组首地址开始将所有值赋‘ ’值
}

游戏刚开始三子棋棋盘效果
三子棋棋盘

三、游戏代码实现
1.玩家走

void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;  //定义两个坐标变量
	int y = 0;
	printf("玩家走:>\n");//提示玩家走

	while (1)
	{
		printf("请输入走的坐标(1-3):>");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)//判断输入坐标的合法性,且游戏面向大众坐标从1开始
		{
			if (board[x - 1][y - 1] == ' ')//数组坐标从0开始,若为空格则可落子
			{
				board[x - 1][y - 1] = 'X';
				break;//只有输入正确时才能跳出while(1)的死循环
			}
			else
			{
				printf("坐标被占用,重新输入!\n");//游戏规则:已经有子则重新输入
			}
		}
		else
		{
			printf("坐标有误,重新输入!\n");
		}
	}
}

2.电脑走

void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑走:>\n");//提示电脑走

	while (1)
	{
		x = rand() % row;//rand()的范围0-32767,取余行列从而随机生成坐标;rand()需要调用srand()函数
		y = rand() % col;
		if (board[x][y] == ' ')//判断是否被占用
		{
			board[x][y] = '*';
			break;
		}
	}
}

3.判断游戏输赢

char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i<row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2]
			&& board[i][0] != ' ')
		{
			return board[i][0];
		}
	}
	for (i = 0; i<col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i]
			&& board[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2]
		&& board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0]
		&& board[1][1] != ' ')
	{
		return board[1][1];
	}

	//判断平局
	if (IsFull(board, row, col) == 1)
	{
		return 'Q';
	}

	//游戏继续
	return ' ';
}

4.游戏效果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43683907/article/details/84311683