網站首頁 編程語言 正文
本文實例為大家分享了C語言實現三子棋小游戲的具體代碼,供大家參考,具體內容如下
1、實現原理
采用二位數組保存棋盤信息,棋盤上面的任何一個位置,里頭可以放三個信息:
1、空
2、用戶落子
3、電腦落子
下三子棋就是在二維數組種找對應的空位置,進行落子,落完之后立即就要判斷落子位置是否有三字連珠,從而判斷誰數輸誰贏。每走一次棋會有四種情況:
*用戶1贏
*用戶2贏
*平局(棋盤被沾滿)
**沒有出結果 繼續下棋
2、實現模塊
文件名 ? ? ? ? ? ? ? ? ? ? ? 作用
three_chress.h ? ? ? 三子棋的函數聲明,頭文件聲明等
three_chress.c ? ? ? 三子棋函數接口的實現
main.c? ? ? ? ? ? ? ? ? ? ?三子棋函數測試功能
3、實現邏輯
一、我們要先在main.c這個文件,還是一樣把框架構建好,再去分別實現他們的功能。實現菜單以及游戲的開始結束都在main函數里面,再從里面拿出游戲開始函數去具體實現游戲的進行。并把每次用到的頭文件包含再three_chress.h里面。
main.c
#include"three_chress.h"
void menu()
{
?? ?printf("###### ? 1、開始游戲 ? #######\n");
?? ?printf("###### ? 2、退出 ? ? ? #######\n");
}
void game()
{
?? ?char ret = 0;
?? ?srand((unsigned int)time(NULL));
?? ?char a[ROW][COL] = { 0 };
?? ?init_a(a,ROW,COL);//初始化
?? ?show(a, ROW, COL);//可視化
?? ?while (1)
?? ?{
?? ??? ?play_move(a, ROW, COL);//用戶走
?? ??? ?show(a, ROW, COL);
?? ??? ?ret = Is_over(a,ROW,COL);//判斷是否結束
?? ??? ?if (ret != 'N')//N這個字符表示繼續的意思
?? ??? ?{
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?computer_move(a, ROW, COL);//電腦走
?? ??? ?show(a, ROW, COL);
?? ??? ?ret = Is_over(a,ROW, COL);//判斷是否結束
?? ??? ?if (ret != 'N')//N這個字符表示繼續的意思
?? ??? ?{
?? ??? ??? ?break;
?? ??? ?}
?? ?}
?? ?if (ret == '*')
?? ?{
?? ??? ?printf("用戶贏\n");
?? ?}
?? ?else if (ret =='#')
?? ?{
?? ??? ?printf("電腦贏\n");
?? ?}
?? ?else if (ret ='D')//D表示為平局
?? ?{
?? ??? ?printf("平局\n");
?? ?}
?? ?show(a, ROW, COL);
}
int main()
{
?? ?int input = 0;
?? ?do{
?? ??? ?menu();
?? ??? ?printf("請選擇-> ?");
?? ??? ?scanf("%d", &input);
?? ??? ?switch (input)
?? ??? ?{
?? ??? ?case 1:
?? ??? ??? ?game();
?? ??? ??? ?break;
?? ??? ?case 2:
?? ??? ??? ?printf("退出");
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?printf("不存在,請重新輸入");
?? ??? ??? ?break;
?? ??? ?}
?? ?} while (input);
?? ?return 0;
}
three_chress.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
void init_a(char a[][COL], int row, int col);//初始化
void show(char a[][COL], int row , int col);//可視化
void play_move(char a[][COL],int row,int col);//用戶下
void computer_move(char a[][COL], int row, int col);//電腦下
char Is_over(char a[][COL],int row,int col);//判斷是否結束
int is_full(char a[][COL],int row, int col);
二、那么游戲怎么進行?我們要先實現這樣的邏輯:構建二維數組并初始化——>顯示棋盤信息即可視化——>讓用戶走并顯示棋盤信息而且要立即判斷用戶是否贏,在判斷時候我們用字符N來取表示游戲繼續,如果返回的不是N說明游戲結束。——>如果沒贏讓電腦走并顯示棋盤信息且判斷電腦是否贏。最后我們用返回字符方式去判斷誰贏或者平局。
三、把以上用到的邏輯用函數去一步一步實現,重點說幾個函數:
1、在play_move函數里面需要注意的是 ,下棋所輸入的坐標要先去判斷其合法性以及多重性也就是重復。之后再賦棋子。
2、在computer_move實現比較簡單,讓電腦自動走、隨機走 ,就要想到rand函數,而rand函數又和srand函數有,再用他們的性質讓是X,Y隨機生成0到2的值,去賦棋子即可。
3、而Is_over函數去判斷輸贏就是四種情況:用戶贏;電腦贏;平局;繼續。
直接比較四個方向上下兩個對角線上的每個位置是否相等,且不為空。再寫個判斷是否滿的函數去判斷是否是平局,最后返回繼續。這里面返回的都是字符。
如下代碼:
three_chree.c
#include"three_chress.h"
static int is_full(char a[][COL], int row, int col)
{
?? ?for (int i = 0; i < row; i++)
?? ?{
?? ??? ?for (int j = 0; j < col; j++)
?? ??? ?{
?? ??? ??? ?if (a[i][j]== ' ')
?? ??? ??? ?{
?? ??? ??? ??? ?return 0;
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ?}
?? ?}
?? ?return 1;
}
void init_a(char a[][COL], int row, int col)
{
?? ?int i = 0;
?? ?for (i = 0; i < row; i++)
?? ?{
?? ??? ?for (int j = 0; j < col; j++)
?? ??? ?{
?? ??? ??? ?a[i][j] = ' ';
?? ??? ?}
?? ??? ?
?? ?}
}
void show(char a[][COL], int row, int col)
{
?? ?int i = 0;
?? ?for (i = 0; i < row; i++)
?? ?{
?? ??? ?for (int j = 0; j < col; j++)
?? ??? ?{
?? ??? ??? ?printf(" %c ", a[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");
?? ??? ?}
?? ?}
}
void play_move(char a[][COL], int row, int col)
{
?? ?int x = 0;
?? ?int y = 0;
?? ?printf("用戶下\n");
?? ?while (1)
?? ?{
?? ??? ?printf("用戶請輸入:\n");
?? ??? ?scanf("%d %d", &x, &y);
?? ??? ?if (x >= 1 && x <= row && y >= 1 && y <= col)
?? ??? ?{
?? ??? ??? ?if (a[x - 1][y - 1] == ' ')
?? ??? ??? ?{
?? ??? ??? ??? ?a[x - 1][y - 1] = '*';
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?printf("已被占用,請重新輸入");
?? ??? ?
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?printf("非法輸入");
?? ?
?? ??? ?}
?? ?}
}
void computer_move(char a[][COL], int row, int col)
{
?? ?printf("電腦走\n");
?? ?int x = 0;
?? ?int y = 0;
?? ?x = rand() % row;
?? ?y = rand() % col;
?? ?while (1)
?? ?{
?? ??? ?if (a[x][y] == ' ')
?? ??? ?{
?? ??? ??? ?a[x][y] = '#';
?? ??? ??? ?break;
?? ??? ?}
?? ?}
}
char Is_over(char a[][COL], int row, int col)//判斷是否結束
{
?? ?for (int i = 0; i < row; i++)
?? ?{
?? ??? ?if (a[i][0] == a[i][1] && a[i][1] == a[i][2] && a[i][0] != ' ')
?? ??? ?{
?? ??? ??? ?return a[i][0];
?? ??? ?}
?? ?}
?? ?for (int j = 0; j < col; j++)
?? ?{
?? ??? ?if (a[0][j] == a[1][j] && a[1][j] == a[2][j] && a[0][j] != ' ')
?? ??? ?{
?? ??? ??? ?return a[0][j];
?? ??? ?}
?? ?}
?? ?if (a[0][0] == a[1][1] && a[1][1] == a[2][2] && a[0][0] != ' ')
?? ?{
?? ??? ?return a[0][0];
?? ?}
?? ?if (a[0][2] == a[1][1] && a[1][1] == a[2][0] && a[0][2] != ' ')
?? ?{
?? ??? ?return a[0][2];
?? ?}
?? ?if ( is_full(a, ROW, COL) == 1)
?? ?{
?? ??? ?return 'D';
?? ?}
?? ?return 'N';//表示游戲繼續
}
4、實現結果
原文鏈接:https://blog.csdn.net/m0_59292239/article/details/126043048
相關推薦
- 2022-07-22 使用@ControllerAdvice和@ExceptionHandler構建全局異常處理器
- 2022-05-26 基于Flutter實現風車加載組件的制作_Android
- 2022-03-19 .NET6使WebApi獲取訪問者IP地址_基礎應用
- 2022-11-06 pandas?dataframe?drop函數介紹_python
- 2022-04-25 C++的靜態類型檢查詳解_C 語言
- 2022-02-02 css 旋轉 animation動畫
- 2022-10-14 Spring AOP之3種增強方式簡單示例
- 2022-09-22 描述Servlet生命周期,Servlet是線程安全的嗎? 為什么?
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支