三子棋简单小游戏的详细的实现(C语言和java两种)

2024-02-22 13:30

本文主要是介绍三子棋简单小游戏的详细的实现(C语言和java两种),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

三子棋的实现

  • 三子棋简介
    • 具体实现
    • C语言
      • test.c
      • game.h
      • game.c
      • 演示
    • Java版本:
      • 棋盘类:
      • 玩家类:
      • Ai类
      • 游戏类
      • 测试游戏:

三子棋简介

三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。

具体实现

C语言

需要测试test.c实现游戏主要逻辑

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//测试void menu()//菜单
{printf("###########################################\n");printf("############    1.  玩游戏    #############\n");printf("############    2.   退出     #############\n");printf("###########################################\n");
}//游戏函数
void game()
{char ret = 0;char board[ROW][COL] = { 0 };//初始化数组棋盘InitBoard(board, ROW, COL);//打印棋盘DisplayBroad(board, ROW, COL);while (1){//下棋//用户下棋//用户下棋,将所在棋子修改为‘P'PeoplePlay(board, ROW, COL);DisplayBroad(board, ROW, COL);ret = IsWin(board, ROW, COL);if (ret != 'L'){break;}//电脑下棋ComputerPlay(board, ROW, COL);DisplayBroad(board, ROW, COL);//判断是否输赢ret = IsWin(board, ROW, COL);if (ret != 'L'){break;}}if (ret =='P'){printf("用户赢\n");}else if (ret=='C'){printf("电脑赢了\n");}else if (ret == 'Q'){printf("平局!\n");}
}int main()
{srand((unsigned)time(NULL));int input = 0;do{menu();printf("请输入你的选择:>\n");scanf("%d", &input);switch (input){case 1:game();break;case 2:break;default:printf("输入非法,请重新输入!\n");break;}} while (input!=2);return 0;
}

将需要的头文件放入game.h中

game.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 DisplayBroad(char board[ROW][COL], int row, int col);
//用户下棋\
//用户下棋,将所在棋子修改为'P'
void PeoplePlay(char board[ROW][COL], int row, int col);
//电脑下棋
//电脑下棋,将所在棋子修改为'C'
void ComputerPlay(char board[ROW][COL], int row, int col);
//判断是否输赢,如果用户赢,返回'P',电脑赢,返回'C',平局返回'Q',继续为'L'
char IsWin(char board[ROW][COL], int row, int col);
//返回1,表示棋盘满了,0表示还没满
int IsFull(char board[ROW][COL], int row, int col);

将实现游戏的函数封装在game.c中

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"//初始化棋盘数组
void InitBoard(char board[ROW][COL], int row, int col)
{for (int  i = 0; i < ROW; i++){for (int  j = 0; j < COL; j++){board[i][j] = ' ';}}
}
//打印棋盘
//   |   |   
//---|---|---
//   |   |
//---|---|--- 
//   |   |  
void DisplayBroad(char board[ROW][COL], int row, int col)
{for (int i = 0; i < ROW; i++){for (int  j = 0; j < COL; j++){printf(" %c ", board[i][j]);	if (j<COL-1){printf("|");}			}		printf("\n");if (i < ROW - 1){for (int j = 0; j < COL ; j++){printf("---");if (j<COL - 1){printf("|");}				}printf("\n");}			}
}
//用户下棋
//用户下棋,将所在棋子修改为‘P'
void PeoplePlay(char board[ROW][COL], int row, int col)
{printf("玩家下棋:\n");int x = 0, y = 0;while (1){printf("请输入你要下的坐标:>\n");scanf("%d %d", &x, &y);if ((x - 1) >= ROW || (x - 1) < 0 || (y - 1) < 0 || (y - 1) >= COL){printf("输入非法,请重新输入!\n");}else if (board[x-1][y-1] != ' '){printf("该坐标已有棋子!\n");}else{board[x-1][y-1] = 'P';break;}		}	
}
//电脑下棋
//电脑下棋,将所在棋子修改为'C'
void ComputerPlay(char board[ROW][COL], int row, int col)
{printf("电脑下棋:>\n");while (1){int randx = rand() % ROW;int randy = rand() % COL;if (board[randx][randy] != ' '){continue;}else{board[randx][randy] = 'C';break;}}
}
//判断是否输赢,如果用户赢,返回'P',电脑赢,返回'C',平局返回'Q',继续为'L'int IsFull(char board[ROW][COL], int row, int col)//返回1,表示棋盘满了,0表示还没满
{for (int i = 0; i < ROW; i++){for (int  j = 0; j <COL; j++){if (board[i][j]==' ' ){return 0;}}}return 1;
}
char IsWin(char board[ROW][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] != ' '){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] != ' '){return board[0][j];}}//斜着if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' '){return board[0][0];}if (board[2][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[1][1];}//平局if (1 == IsFull(board, ROW, COL)){return 'Q';}else{return 'L';}
}

演示

几乎将所有的可能都尝试了,结果如下:
在这里插入图片描述
在这里插入图片描述

这个小游戏中设计很多的知识点,具体想了解更多,请在我的博客中翻找你想具体了解的知识点

Java版本:

棋盘类:

package threeChessGame;import java.util.Arrays;public class Chessboard {private static final int i1 = 0;private static final int p = 1;private static final int a = 2;private final int[][] array = {{i1, i1, i1}, {i1, i1, i1}, {i1, i1, i1}};public boolean moveCircleAt(int row, int column) {if (array[row][column] != i1) {return false;}array[row][column] = p;return true;}public boolean moveCrossAt(int row, int column) {if (array[row][column] != i1) {return false;}array[row][column] = a;return true;}public static final int CIRCLE_WIN = 0;     // p赢public static final int CROSS_WIN = 1;      // a赢public static final int DRAW = 2;           // 平局public static final int CONTINUE = 3;       // 游戏继续public int getState() {//行for (int i = 0; i < 3; i++) {if (array[i][0] == array[i][1] && array[i][1] == array[i][2]) {if (array[i][0] == p) {return CIRCLE_WIN;} else if (array[i][0] == a) {return CROSS_WIN;}}}//列for (int i = 0; i < 3; i++) {if (array[0][i] == array[1][i] && array[1][i] == array[2][i]) {if (array[0][i] == p) {return CIRCLE_WIN;} else if (array[0][i] == a) {return CROSS_WIN;}}}//斜线if (array[0][0] == array[1][1] && array[1][1] == array[2][2]) {if (array[1][1] == p) {return CIRCLE_WIN;} else if (array[1][1] == a) {return CROSS_WIN;}}if (array[0][2] == array[1][1] && array[1][1] == array[2][0]) {if (array[1][1] == p) {return CIRCLE_WIN;} else if (array[1][1] == a) {return CROSS_WIN;}}// 没人获胜for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (array[i][j] == i1) {return CONTINUE;}}}return DRAW;}private static String show(int i) {switch (i) {case i1:return " ";case p:return "X";case a:return "O";default:return " ";}}@Overridepublic String toString() {String s = "-----\n";for (int i = 0; i < 2; i++) {s += String.format("%s|%s|%s\n", show(array[i][0]), show(array[i][1]), show(array[i][2]));s += "-----\n";}s += String.format("%s|%s|%s\n", show(array[2][0]), show(array[2][1]), show(array[2][2]));s += "-----\n";return s;}public void reset() {for (int i = 0; i < 3; i++) {Arrays.fill(array[i], i1);}}
}

玩家类:

package threeChessGame;import java.util.Scanner;/*** 玩家类*/
public class Player {private final Scanner sc = new Scanner(System.in);public int[] getRowColumn() {System.out.println("输入需要下的位置:[0-2]");int r, c;while (true) {System.out.print(">>>");r = sc.nextInt();c = sc.nextInt();if (r >= 0 && r <= 2 && c >= 0 && c <= 2) {break;}System.out.println("范围是0-2,请重新输入:");}return new int[]{r, c};}public boolean queryContinue() {System.out.println("是否再来一局?true/false");System.out.print(">>>");return sc.nextBoolean();}
}

Ai类

package threeChessGame;import java.util.Random;
/*** Ai类*/
public class AI {private final Random random = new Random();public int[] getRowColumn() {int r = random.nextInt(3);int c = random.nextInt(3);return new int[]{r, c};}
}

游戏类

package threeChessGame;/*** 游戏类*/
public class Game {private final Chessboard chessboard;private final Player player;private final AI ai;public Game(Player player) {this.chessboard = new Chessboard();this.player = player;this.ai = new AI();}//进入游戏public void initialize() {System.out.println("欢迎进入《三子棋》游戏");System.out.println("=====================================");System.out.println(chessboard);}//回合制游戏public void play() {while (true) {if (playerTurn()) {break;}if (aiTurn()) {break;}}}//游戏完成,收尾public void destoroy() {chessboard.reset();}private boolean playerTurn() {System.out.println("玩家下棋:");while (true) {int[] rc = player.getRowColumn();int row = rc[0];int column = rc[1];if (chessboard.moveCircleAt(row, column)) {break;}System.out.println("已有棋子,从新选择!");}System.out.println(chessboard);return chessboard.getState() != chessboard.CONTINUE;}private boolean aiTurn() {System.out.println("Ai下棋:");while (true) {int[] rc = ai.getRowColumn();int row = rc[0];int column = rc[1];if (chessboard.moveCrossAt(row, column)) {break;}}System.out.println(chessboard);return chessboard.getState() != chessboard.CONTINUE;}
}

测试游戏:

package threeChessGame;/*** 三子棋游戏测试*/
public class Test {public static void main(String[] args) {Player player = new Player();Game game = new Game(player);while (true) {//打印棋盘game.initialize();//进行游戏game.play();//结束前处理game.destoroy();//是否继续boolean b = player.queryContinue();if (!b) {System.out.println("欢迎下次游戏!");break;}}}
}

这篇关于三子棋简单小游戏的详细的实现(C语言和java两种)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/735396

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个