C语言实现三子棋小游戏

三子棋

三子棋介绍

   三子棋又叫井字棋,只要将自己的三个棋子走成一条线,对方就算输了。但是,很多时候会出现和棋的情况。

代码设计的基本思路

一.创建一个用户选择菜单

二.创建主函数

三.游戏具体实现

1.创建棋盘并初始化棋盘

2.打印一个棋盘

3.玩家落子

4.判断本局游戏状态

5.电脑落子

6.判断本局游戏状态

7.结果演示
(1)玩家胜利
(2)电脑胜利
(3)和棋

代码具体实现
注:首先我们对常用的字符和变量进行宏定义,提高扩展性,以便我们后期根据不同的要求来维护和修改。

#define ROW 3
#define COL 3
#define WHITE 'x'//person落棋子
#define BLACK 'O'//computer落子
#define INIT ' '//空格表示棋盘上的空白区域
#define NEXT 'N' //继续
#define DRAW 'D'//平局

1.菜单界面
1.开始游戏 0.退出游戏

void Menu()
{
	printf("+--------------------------+\n");
	printf("|  1.play         0.Exit   |\n");
	printf("+--------------------------+\n");
}

2.创建并初始化棋盘

static void InitBoard(char board[][COL], int row, int col)
{
	 for (int i = 0; i < row; i++){
		 for (int j = 0; j < col; j++){
			 board[i][j] = INIT;
		 }
	 }
 }

采用两重循环初始化,将棋盘一开始的每个格子中的元素都置为空格。

3.打印棋盘

 static void ShowBoard(char board[][COL], int row, int col)
 {
	 system("cls");//清屏,让落子始终在一个棋盘里
	 printf(" ");
	 for (int i = 0; i < row; i++)
	 {
		 printf("%4d ",i+1);
	 }
	 printf("\n---------------\n");
	 for (int i = 0; i < row; i++){
		 printf("%-2d", i+1);
		 for (int j = 0; j < col; j++){
			 printf("| %c ", board[i][j]);
		 }
		 printf("\n---------------\n");
	 }
 }

结果:
在这里插入图片描述
4.玩家落子

玩家输入行列坐标表示要落子的具体位置,使用‘X’代表玩家。

static void PlayerMove(char board[][COL], int row, int col)
 { 
	 int x = 0;
	 int y = 0;
	 while (1){
		 printf("Please Enter Position<x,y># ");
		 scanf("%d %d", &x, &y);
		 if (x<1 || y<1 || x>3 || y>3){//判断输入位置是否在棋盘范围内
			 printf("Enter Position Error!\n");
			 continue;//如果输入坐标不满足则要重新输入
		 }
		 if (board[x - 1][y - 1] == INIT){
			 board[x - 1][y - 1] = WHITE;
			 break;
		 }
		 else
		 {
			 printf("Position is not Empty!\n");//输入坐标已有子
		 }

	 }
 }

5.电脑落子
电脑随机产生行列坐标进行落子,‘O’表示电脑落子。
1.要在Game()这个函数中使用srand((unsigned long)time(NULL))
表示将时间作为颗随机数种子,确保得到的行列坐标是真随机值

static void ComputerMove(char board[][COL], int row, int col)
 {
	 while (1){
		 int x = rand() % row;
		 int y = rand() % col;
		 if (board[x][y] == INIT)
		 {
			 board[x][y] = BLACK;
			 break;
		 }
	 }
 }

6.判断状态
约定最后返回结果的含义;
(1)‘X’表示玩家获胜
(2)‘O’表示电脑获胜
(3) ‘NEXT’表示胜负未分,继续下棋
(4)‘DRAW’表示和棋
判定电脑玩家是否胜利:
1.判定所有的行是否相等
2.判定所有的列是否相等
3.判定两条对角线
判定和棋
如果判定不了电脑赢或是人赢,也不是双方一方继续下棋的状态,那么最后便是和棋。

static char IsEnd(char board[][COL], int row, int col)
 {
	 for (int i = 0; i < row; i++){
		 if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != INIT)
		 {
			 return board[i][0];
		 }
	 }
	 for (int j = 0; j < col; j++){
		 if (board[0][j] == board[1][j]&&board[1][j] == board[2][j] && board[0][j] != INIT)
		 {
			 return board[0][j];
		 }
	 }
	 if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != INIT)
	 {
		 return board[1][1];
	 }
	 if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != INIT)
	 {
		 return board[1][1];
	 }
	 for (int i = 0; i < row; i++){
		 for (int j = 0; j < col; j++){
			 if (board[i][j] == INIT)
			 {
				 return NEXT;
			 }
		 }
	 }
	 return DRAW;
 }

Game()函数

void Game()
{
	char board[ROW][COL];//定义二维数组存储棋盘
	InitBoard(board, ROW, COL);//初始化棋盘
	srand((unsigned long)time(NULL));//种一颗随机数种子
	char result = '\0';
	while (1)
	{
		ShowBoard(board, ROW, COL);//显示棋盘
		PlayerMove(board, ROW, COL);//人走
		result = IsEnd(board, ROW, COL);
		if (result != NEXT){
			break;
		}
		ShowBoard(board, ROW, COL);
		ComputerMove(board, ROW, COL);//电脑走
		result = IsEnd(board, ROW, COL);
		if (result != NEXT){
			break;
		}
	}
	switch (result){
	case WHITE:
		printf("You Win!\n");
		break;
	case BLACK:
		printf("YOU Lose!\n");
	case DRAW:
		printf("You==Computer!\n");
		break;
	default:
		printf("BUG!\n");


	}
}

注意:
在Game()函数里,我们要引用以上的棋盘初始化,显示棋盘,人走,电脑走,判定胜负关系等函数。
在玩家和电脑落子时,我们都要对其结果进行判定。

本游戏代码采用多文件实现,别为main.c ,game.c , game.h。
game.h里面包含了各种声明,game.h又包含在main.c和game.c里面。
game.c为以上各种具体游戏函数的实现。
game.h:

#ifndef __GAME_H_
#define __GAME_H_

#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#pragma warning(disable:4996

#define ROW 3
#define COL 3

#define WHITE 'x'//person执棋子
#define BLACK 'O'//computer
#define INIT ' '//空格
#define NEXT 'N' //继续
#define DRAW 'D'//平局
extern void Game();
#endif

main.c:

#include "game.h"
void Menu()
{
	printf("+--------------------------+\n");
	printf("|  1.play         0.Exit   |\n");
	printf("+--------------------------+\n");
}
int main()
{
	int select = 0;
	int quit = 0;
	while (!quit)
	{
		Menu();
		printf("Please Select# ");
		scanf("%d", &select);
		switch (select){
		case 1:
			Game();
			break;
		case 0:
			quit = 1;
			break;
		default:
			printf("Enter Error,Try Again!\n");
			break;
		}
	}
	printf("ByeBye!\n");
	system("pause");
		return 0;
}

最后显示一下其中的一个结果状态:
在这里插入图片描述
OK,文章到此就结束了了!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值