简单三子棋1.0

三子棋是一种受众比较广泛的一种传统民俗类游戏,三字棋又名井字棋或者九宫棋。这篇博客主要介绍的是三子棋的C语言实现。

目标:

打印出类似棋盘,并实现玩家与人机的博弈。

思路

1.打印菜单。

void menu()
{
	printf("****************************\n");
	printf("******* 1. 开始游戏  *******\n");
	printf("******* 0. 退出游戏  *******\n");
	printf("******* 2.   设置    *******\n");
	printf("****************************\n");
}

2.打印游戏模式。

void gametapy()
{
	printf("****************************\n");
	printf("******* 1. 玩家先手  *******\n");
	printf("******* 2. 人机先手  *******\n");
	printf("****************************\n");
}

3.棋盘初始化。

void initboard(char arr[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

4.打印或者说是显示棋盘。

void printboard(char arr[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ",arr[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

5.玩家落子。

void playermove(char arr[ROW][COL], int row, int col)
{
	while (1)
	{
		printf("请输入坐标:>");
		scanf("%d%d", &row, &col);
		if (arr[row-1][col-1] == ' ')
		{
			arr[row-1][col-1] = '#';
			break;
		}
		else
		{
			printf("该位置已有棋子请重新落子\n");
		}
		if (row<1 && row>ROW && col<1 && col>COL)
		{
			printf("坐标非法,请重新输入!\n");
		}
	}
}

6.电脑落子。

void computermove(char arr[ROW][COL], int row, int col)
{
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
		if (arr[x][y] == ' ')
		{
			printf("电脑落子\n");
			arr[x][y] = '*';
			break;
		}
	}
}

7.判断输赢。

char judge(char arr[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][2] != ' ')
		{
			return arr[i][0];
		}
	}
	for (j = 0; j < col; j++)
	{
		if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[2][j] != ' ')
		{
			return arr[0][j];
		}
	}
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
	{
		return arr[0][0];
	}
	if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[1][1] != ' ')
	{
		return arr[1][1];
	}
	full(arr, ROW, COL);
}
char full(char arr[ROW][COL], int row, int col)
{
	int i = 0, j = 0,count=0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] != ' ')
			{
				count++;
			}
		}
	}
	if (count == row * col)
	{
		return '=';
	}
	else
	{
		return '_';
	}
}

上述代码均使用C语言来实现。

现在来具体讲解一下过程:1.菜单,菜单就是游戏界面,这个直接暴力打印就行了,2.游戏模式也一样。

3.棋盘初始化,在这个C程序中,主要用的知识点是二维数组和一些常见的库函数。而整个棋盘的打印就是利用二维数组来打印的,棋盘初始化是为了方便把棋盘中的棋子初始化为空格,这样可以使得打印棋盘更加方便。

 

 4.打印棋盘:利用二维数组和分支循环语句实现棋盘的打印。我们要利用‘ ’(空格),‘---’(减号)和‘|’(按位或)来打印棋盘,首先我们把棋盘分为5个单元行列:第一行为" %c | %c | %c "。第三行第五行同上。而我们又把第一行分为5个单元" %c ","|"," %c ","|"," %c ";第二行与第四行为"---|---|---",而第二行的5个单元分别为"---","|","---","|","---"。这样分单元的方法更容易打印棋盘,但是值得注意的是在每一行的最后没有“|”。

5.玩家落子:玩家落子其实就是把已经初始化为数组元素“ ”的进行重新赋值,把数组元素重新赋值成你想的那样,如:“#”,“*”等。但要注意的是数组的类型记得初始化为你想要的类型,千万别设置了一个int类型的数组却把数组元素设置成‘#’‘w’这样的字符。

6.电脑落子:电脑落子其实就是利用随机值(如arr[i][j],让i和j的值进行随机赋值)来进行落子,这一步就要运用时间戳和几个库函数,rand和srand,这两个库函数需要引用一个新的头文件(#include<stdlib.h>),而时间戳是一种真正让随机值随机的工具,时间戳---(srand((unsigned int ) time(NULL))。

7.判断输赢:这你只需要把三子棋获胜的条件一一用if语句打上去就可。但同时也要注意棋盘棋子满了的情况。

ps:在C程序中玩家先手与后手的不同只是playermove()函数与computermove()函数的前后顺序罢了。(接下来是具体代码)

头文件:

#pragma once
//头文件game.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3

void menu();
void gametapy();
void game_1();
void game_2();
void initboard(char arr[ROW][COL], int row, int col);
void printboard(char arr[ROW][COL], int row, int col);
void playermove(char arr[ROW][COL], int row, int col);
void computermove(char arr[ROW][COL], int row, int col);
char judge(char arr[ROW][COL], int row, int col);
char full(char arr[ROW][COL], int row, int col);

游戏内容:

#include "game.h"

void menu()
{
	printf("****************************\n");
	printf("******* 1. 开始游戏  *******\n");
	printf("******* 0. 退出游戏  *******\n");
	printf("******* 2.   设置    *******\n");
	printf("****************************\n");
}

void gametapy()
{
	printf("****************************\n");
	printf("******* 1. 玩家先手  *******\n");
	printf("******* 2. 人机先手  *******\n");
	printf("****************************\n");
}

void game_1()
{
	char ret;
	char arr[ROW][COL] = {0};
	initboard(arr,ROW,COL);
	while (1)
	{
		printboard(arr, ROW, COL);
		playermove(arr, ROW, COL);
		printboard(arr, ROW, COL);
		ret = judge(arr, ROW, COL);
		if (ret != '_')
		{
			break;
		}
		computermove(arr, ROW, COL);
		ret = judge(arr, ROW, COL);
		if (ret != '_')
		{
			break;
		}
	}
	if (ret == '#')
	{
		printf("玩家胜利\n");
	}
	else if (ret == '*')
	{
		printf("电脑胜利\n");
	}
	else
	{
		printf("平局\n");
	}
}

void game_2()
{
	char ret;
	char arr[ROW][COL] = { 0 };
	initboard(arr, ROW, COL);
	while (1)
	{
		printboard(arr, ROW, COL);
		computermove(arr, ROW, COL);
		printboard(arr, ROW, COL);
		ret = judge(arr, ROW, COL);
		if (ret != '_')
		{
			break;
		}
		playermove(arr, ROW, COL);
		ret = judge(arr, ROW, COL);
		if (ret != '_')
		{
			break;
		}
	}
	if (ret == '#')
	{
		printf("玩家胜利\n");
	}
	else if (ret == '*')
	{
		printf("电脑胜利\n");
	}
	else
	{
		printf("平局\n");
	}
}

void initboard(char arr[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

void printboard(char arr[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ",arr[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

void playermove(char arr[ROW][COL], int row, int col)
{
	while (1)
	{
		printf("请输入坐标:>");
		scanf("%d%d", &row, &col);
		if (arr[row-1][col-1] == ' ')
		{
			arr[row-1][col-1] = '#';
			break;
		}
		else
		{
			printf("该位置已有棋子请重新落子\n");
		}
		if (row<1 && row>ROW && col<1 && col>COL)
		{
			printf("坐标非法,请重新输入!\n");
		}
	}
}

void computermove(char arr[ROW][COL], int row, int col)
{
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
		if (arr[x][y] == ' ')
		{
			printf("电脑落子\n");
			arr[x][y] = '*';
			break;
		}
	}
}

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

char full(char arr[ROW][COL], int row, int col)
{
	int i = 0, j = 0,count=0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] != ' ')
			{
				count++;
			}
		}
	}
	if (count == row * col)
	{
		return '=';
	}
	else
	{
		return '_';
	}
}

函数头尾:

//三子棋实现
#include "game.h"

int main()
{
	srand((unsigned int) time (NULL));
	int input_1 = 0;
	do
	{
		menu();
		printf("请输入(1/0/2):>");
		scanf("%d", &input_1);
		switch (input_1)
		{
		case 1:
			int input_2 = 0;
			gametapy();
			printf("请选择游戏模式(1/2):>");
			scanf("%d", &input_2);
			switch (input_2)
			{
again:
			case 1:
				game_1();
				break;
			case 2:
				game_2();
				break;
			default:
				printf("输入错误,请重新输入!\n");
				goto again;
			}
			break;
		case 0:
			printf("退出游戏\n");
			break;
		case 2:
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input_1);
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东辰良月2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值