简单的三子棋---C语言

学完C语言,我们可以写很多好玩的小游戏。今天就介绍一个用C语言写的简单的小游戏------三子棋。
首先,分析一下:三子棋也就是平常的井字棋,用C语言写的话,界面上应该给玩家的展现的。
首先应该是空的棋牌,这个棋牌如何呈现给玩家呢,可以用二维数组实现。
其次是玩家如何下棋?玩家通过棋盘的坐标,告诉棋子要落在哪里,以我们平时的习惯,应该在棋盘上画x,o.这里和使用宏定义,在以下的代码中将会展示。
最后一个问题:如何判断谁输谁赢?可在玩家或电脑每走完一步,判断每一行、每一列、一撇或者一捺是否相同,如果相同则判断这个棋是玩家的还是电脑的,以判断输赢。(一下的代码中会有具体的介绍)

三子棋的项目的大致思路

这里声明一下:本文的代码是将头文件、源文件分开的,这样思路会比较清晰,书写方便。
这里我们要介绍一下,写一个三子棋,其中的逻辑顺序。

#include"chess.h"
int main(){
	int select = 0;
START:
	Menu();//菜单
	scanf("%d", &select);//输入选择
	switch (select){//以选择打开开关
	case 1:
		Game();
		printf("再玩一次吧!\n");
		goto START;
	case 2:
		break;
	default:
		printf("输入错误\n");
		goto START;
	}
	system("pause");
	return 0;
}

首先,要给玩家一个界面,告诉玩家这个如何玩。所以Menu()就是给玩家呈现界面。然后玩家看到这个界面就需要选择;这里选择1,是开始游戏;选择2则退出,其他的选择就是错误输入(但后期可以再优化一下选择,选择其他的操作)。
所以要玩这个游戏就必须选1。则进入游戏,而这个小游戏的核心就是Game()。假设玩家玩完了一局,这时候有的人还想再玩一局,所以应该给玩家这个选择,所以Game()完成之后,用goto 语句。从菜单开始再来选择一次,如果不想继续,那么就可以选择2,则退出。

三子棋的重要函数实现

现在,就要讲一讲重要函数Game()的实现。
我先把头文件放在这里,因为有些宏定义在这里,可以看得更清楚一点。

#ifndef _CHESS_H_
#include<Windows.h>
#define _CHESS_H_
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#pragma warning(disable:4996)
#define ROW 3
#define COL 3
#define BLACK 'o'
#define WHITE 'x'
void InitBoard(char board[][COL], int row, int col);
void Menu();
void Game();
void ComputerMove(board,  row, col);
void ShowBoard(char board[][COL], int row, int col);
char JudgeResult(char board[][COL], int  row, int col);
int PlayerMove(char board[][COL], int row, int col);
#endif

以下是Game()函数实现

void Game(){
	int board[ROW][COL];//二维数组
	InitBoard(board, ROW, COL);//初始化面板
	char judge = 'N';
	 srand((unsigned long)time(NULL));
	void ShowBoard(char board[][COL], int row, int col);//展示面板
	int  player = 0;
	while (1){
		ShowBoard(board, ROW, COL);
		player = PlayerMove(board, ROW, COL);//玩家走棋
			if (player==2){
			printf("该处已有棋子!\n");
			continue;
			}
			else if (player == 1){
			printf("输入坐标错误!\n");
			continue;
		}
			else{
				printf("玩家已落棋!\n");
		}
			ShowBoard(board, ROW, COL);
			JudgeResult(board, ROW, COL);
			judge = JudgeResult(board ,ROW,COL);
			if (judge != 'N'){
				break;
			}
			ComputerMove(board, ROW, COL);
			judge = JudgeResult(board, ROW, COL);
			if (judge != 'N'){
				break;
			}
		
	}
		ShowBoard(board, ROW, COL);//result = JudgeResult;
		switch (judge){
		case BLACK:
			printf("恭喜你,玩家获胜!\n");
			break;
		case WHITE:
			printf("真遗憾,你输了!\n");
			break;
		case 'E':
			printf("恭喜你,平局!");
			break;
		}
}

看起来代码有点多哦,但是思路清晰就不会乱了。
1.玩家进入游戏后,首先会看到一个棋盘。void ShowBoard(char board[][COL], int row, int col);
2.玩家要开始玩游戏,提示输入玩家的棋子位置。使用PlayerMove(board, ROW, COL)。玩家将棋子输入之后,会有三种情况:棋子的坐标处有棋子;输入的坐标不正确(超出棋子坐标范围);该处没有棋子,即落子成功。
所以PlayerMove(board, ROW, COL)函数带上返回值,分别表示这几种情况。如果有棋子或者棋子坐标错误,都要提醒玩家,然后跳出本次循环,重新输入,直到输入坐标从正确。
3.玩家落棋后展示棋盘,玩家落棋的位置。然后判断是否有三个相同的且连续的棋子,使用JudgeResult(board, ROW, COL)判断,如果有则退出,如果没有则继续下一步。
4.电脑落棋,电脑落棋此处会由电脑产生一个随机数范围在(0-2),这个随机数种子srand((unsigned long)time(NULL))在游戏开始便被种下。随机数在
ComputerMove(board, ROW, COL)中产生。
6.判断电脑落棋后有没有三个相同且连续的棋子。仍然是 JudgeResult(char board[][COL], int row, int col)判断,如果返回值为’N’,则继续while循环。
7.while循环使得一直重复2-6的步骤,直到 JudgeResult(char board[][COL], int row, int col)的返回值为‘E’—平局;或者’BLACK’,‘WHITE’—表示玩家或者电脑获胜。

三子棋的各个函数实现

下面我们来看看具体的函数的实现。以下函数的说明将会在函数的顶部使用引用,便于阅读。

#include"chess.h"
void Menu(){//用户选择界面
	printf("*************************************\n");
	printf("********欢迎来到三子棋世界***********\n");
	printf("***1.GAME*************2.QUIT*********\n");
	printf("******** 请输入你的选择:************\n");
	printf("*************************************\n");

}

> 这个函数是用来给棋牌的初始化的,也就是玩家进入游戏后的界面,所以数组的内容为空格,使用双循环,给数组的每一个内容放上空格。

void InitBoard(char board[][COL], int row, int col){//初始化面板
	int i = 0;
	for (; i < col; i++){
		int j = 0;
		for (; j < row; j++){
			board[i][j] = ' ';
		}	
	}
}

> showboard函数是给用户的棋盘更新后展示棋盘使用的。

void ShowBoard(char board[][COL], int row, int col){//展示面板
	printf("   | 1 | 2 | 3 |\n");
	int i = 0;
	for (; i < row; i++){
		printf("__________________\n"); 
		printf(" %d | %c | %c | %c \n", i+1,board[i][0], board[i][1],board[i][2]);
	}printf("__________________\n");
}

> 指引玩家下棋的函数,输入坐标存储起来,先判断坐标是否在范围之内,如果是,则继续判断,该坐标处是否有棋子(是否为空),如果不为空返回2;为空就给该处赋值BLACK(宏定义为 ‘O’)。如果坐标不正确返回1.

int PlayerMove(char board[][COL], int row, int col){//玩家移动
	int x = 0;
	int y = 0;
	printf("please enter your Pos<x,y>\n");
	scanf("%d %d", &x, &y);
	if (x >= 1 && x <= 3 && y >= 1 && y <= 3){
		if (board[x - 1][y - 1] != ' '){
		return 2;
		}//表示该处有棋子
		else{//坐标正确
			board[x - 1][y - 1] = BLACK;
			return 0;
		}
	}
	return 1;//输入错误的坐标;
	
}
//判断棋盘上的棋子。
char JudgeResult(char board[][COL] ,int  row,int col){//判断棋子的情况
	int i = 0;
	for (; i < row; i++){
		if (board[i][0] != ' '&&board[i][0] == board[i][1] && board[i][1] == board[i][2]){
			return board[i][0];
		}
	}
	int j = 0;
	for (; j < col; j++){
		if (board[0][j] != ' '&&board[0][j] == board[1][j] && board[1][j] == board[2][j]){
			return board[0][j];
		}
	}
	if (board[0][0] != ' '&&board[0][0] == board[1][1] && board[1][1] == board[2][2]){
		return board[0][0];
		
	}if (board[0][2] != ' '&&board[0][2] == board[1][1] && board[1][1] == board[2][0]){
		return board[0][2];
	}
	
	for (i = 0; i < 3; i++){
		
		for ( j = 0; j <3; j++){
			if (board[i][j] == ' '){
				return 'N';//检查有坐标为空,继续
			}
		}
	}
	return 'E';//平局
}
void ComputerMove(char board[ROW][COL], int row, int col){
	//电脑移动
	while (1){
		int i = rand() % row;
		int j = rand() % col;
		if (board[i][j] == ' '){
			board[i][j] = WHITE;
			break;
		}
	}printf("电脑已落棋!\n");
	Sleep(100);
}
void Game(){
	int board[ROW][COL];//二维数组
	InitBoard(board, ROW, COL);//初始化面板
	char judge = 'N';
	 srand((unsigned long)time(NULL));
	void ShowBoard(char board[][COL], int row, int col);//展示面板
	int  player = 0;
	while (1){
		ShowBoard(board, ROW, COL);
		player = PlayerMove(board, ROW, COL);
			if (player==2){
			printf("该处已有棋子!\n");
			continue;
			}
			else if (player == 1){
			printf("输入坐标错误!\n");
			continue;
		}
			else{
				printf("玩家已落棋!\n");
		}
			ShowBoard(board, ROW, COL);
			JudgeResult(board, ROW, COL);
			judge = JudgeResult(board ,ROW,COL);
			if (judge != 'N'){
				break;
			}
			ComputerMove(board, ROW, COL);
			judge = JudgeResult(board, ROW, COL);
			if (judge != 'N'){
				break;
			}
		
	}
		ShowBoard(board, ROW, COL);//result = JudgeResult;
		switch (judge){
		case BLACK:
			printf("恭喜你,玩家获胜!\n");
			break;
		case WHITE:
			printf("真遗憾,你输了!\n");
			break;
		case 'E':
			printf("恭喜你,平局!");
			break;
		}
}

以上是三字棋的整个代码实现,如有问题,欢迎指正。

发布了5 篇原创文章 · 获赞 1 · 访问量 128

猜你喜欢

转载自blog.csdn.net/weixin_43815275/article/details/105710238