简单的三子棋---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;
		}
}

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
三子棋是一种简单的棋类游戏,下面是一个简单的使用C语言编写的三子棋游戏程序: ``` #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 void Menu() { printf("*****************************\n"); printf("**********三子棋游戏**********\n"); printf("*****************************\n"); } void Init(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { board[i][j] = ' '; } } } void Display(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j != col - 1) { printf("|"); } } printf("\n"); if (i != row - 1) { printf("---|---|---\n"); } } } void PlayerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; while (1) { printf("请输入您要下的位置:"); scanf_s("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("该位置已经有棋子,请重新输入!\n"); } } else { printf("您输入的位置不合法,请重新输入!\n"); } } } void ComputerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } 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][0] == board[i][1] && board[i][1] == board[i][2]) { return board[i][0]; } } for (i = 0; i < col; i++) { if (board[0][i] != ' ' && board[0][i] == board[1][i] && board[1][i] == board[2][i]) { return board[0][i]; } } 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]; } if (IsFull(board, row, col)) { return 'Q'; } return 'C'; } int IsFull(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] == ' ') { return 0; } } } return 1; } void Game() { char board[ROW][COL] = { 0 }; char result = 0; srand((unsigned int)time(NULL)); Init(board, ROW, COL); Display(board, ROW, COL); while (1) { PlayerMove(board, ROW, COL); Display(board, ROW, COL); result = IsWin(board, ROW, COL); if (result != 'C') { break; } ComputerMove(board, ROW, COL); Display(board, ROW, COL); result = IsWin(board, ROW, COL); if (result != 'C') { break; } } if (result == '*') { printf("恭喜您,您赢了!\n"); } else if (result == '#') { printf("很遗憾,电脑赢了!\n"); } else { printf("平局!\n"); } } int main() { int input = 0; do { Menu(); printf("请选择:"); scanf_s("%d", &input); switch (input) { case 1: Game(); break; case 0: printf("退出游戏!\n"); break; default: printf("选择错误,请重新输入!\n"); break; } } while (input); return 0; } ``` 这个程序中,使用了一个二维数组来表示棋盘,其中'*'表示玩家下的棋子,'#'表示电脑下的棋子。程序中实现了玩家下棋、电脑下棋、判断胜负等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值