使用C語言實(shí)現(xiàn)三子棋小游戲
本文實(shí)例為大家分享了C語言實(shí)現(xiàn)三子棋小游戲的具體代碼,供大家參考,具體內(nèi)容如下
1、實(shí)現(xiàn)原理
采用二位數(shù)組保存棋盤信息,棋盤上面的任何一個(gè)位置,里頭可以放三個(gè)信息:
1、空
2、用戶落子
3、電腦落子
下三子棋就是在二維數(shù)組種找對(duì)應(yīng)的空位置,進(jìn)行落子,落完之后立即就要判斷落子位置是否有三字連珠,從而判斷誰數(shù)輸誰贏。每走一次棋會(huì)有四種情況:
*用戶1贏
*用戶2贏
*平局(棋盤被沾滿)
**沒有出結(jié)果 繼續(xù)下棋
2、實(shí)現(xiàn)模塊
文件名 作用
three_chress.h 三子棋的函數(shù)聲明,頭文件聲明等
three_chress.c 三子棋函數(shù)接口的實(shí)現(xiàn)
main.c 三子棋函數(shù)測(cè)試功能
3、實(shí)現(xiàn)邏輯
一、我們要先在main.c這個(gè)文件,還是一樣把框架構(gòu)建好,再去分別實(shí)現(xiàn)他們的功能。實(shí)現(xiàn)菜單以及游戲的開始結(jié)束都在main函數(shù)里面,再?gòu)睦锩婺贸鲇螒蜷_始函數(shù)去具體實(shí)現(xiàn)游戲的進(jìn)行。并把每次用到的頭文件包含再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);//判斷是否結(jié)束 ?? ??? ?if (ret != 'N')//N這個(gè)字符表示繼續(xù)的意思 ?? ??? ?{ ?? ??? ??? ?break; ?? ??? ?} ?? ??? ?computer_move(a, ROW, COL);//電腦走 ?? ??? ?show(a, ROW, COL); ?? ??? ?ret = Is_over(a,ROW, COL);//判斷是否結(jié)束 ?? ??? ?if (ret != 'N')//N這個(gè)字符表示繼續(xù)的意思 ?? ??? ?{ ?? ??? ??? ?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("請(qǐng)選擇-> ?"); ?? ??? ?scanf("%d", &input); ?? ??? ?switch (input) ?? ??? ?{ ?? ??? ?case 1: ?? ??? ??? ?game(); ?? ??? ??? ?break; ?? ??? ?case 2: ?? ??? ??? ?printf("退出"); ?? ??? ??? ?break; ?? ??? ?default: ?? ??? ??? ?printf("不存在,請(qǐng)重新輸入"); ?? ??? ??? ?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);//判斷是否結(jié)束 int is_full(char a[][COL],int row, int col);
二、那么游戲怎么進(jìn)行?我們要先實(shí)現(xiàn)這樣的邏輯:構(gòu)建二維數(shù)組并初始化——>顯示棋盤信息即可視化——>讓用戶走并顯示棋盤信息而且要立即判斷用戶是否贏,在判斷時(shí)候我們用字符N來取表示游戲繼續(xù),如果返回的不是N說明游戲結(jié)束。——>如果沒贏讓電腦走并顯示棋盤信息且判斷電腦是否贏。最后我們用返回字符方式去判斷誰贏或者平局。
三、把以上用到的邏輯用函數(shù)去一步一步實(shí)現(xiàn),重點(diǎn)說幾個(gè)函數(shù):
1、在play_move函數(shù)里面需要注意的是 ,下棋所輸入的坐標(biāo)要先去判斷其合法性以及多重性也就是重復(fù)。之后再賦棋子。
2、在computer_move實(shí)現(xiàn)比較簡(jiǎn)單,讓電腦自動(dòng)走、隨機(jī)走 ,就要想到rand函數(shù),而rand函數(shù)又和srand函數(shù)有,再用他們的性質(zhì)讓是X,Y隨機(jī)生成0到2的值,去賦棋子即可。
3、而Is_over函數(shù)去判斷輸贏就是四種情況:用戶贏;電腦贏;平局;繼續(xù)。
直接比較四個(gè)方向上下兩個(gè)對(duì)角線上的每個(gè)位置是否相等,且不為空。再寫個(gè)判斷是否滿的函數(shù)去判斷是否是平局,最后返回繼續(xù)。這里面返回的都是字符。
如下代碼:
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("用戶請(qǐng)輸入:\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("已被占用,請(qǐng)重新輸入"); ?? ??? ? ?? ??? ??? ?} ?? ??? ?} ?? ??? ?else ?? ??? ?{ ?? ??? ??? ?printf("非法輸入"); ?? ? ?? ??? ?} ?? ?} } void computer_move(char a[][COL], int row, int col) { ?? ?printf("電腦走\(yùn)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)//判斷是否結(jié)束 { ?? ?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';//表示游戲繼續(xù) }
4、實(shí)現(xiàn)結(jié)果
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(191.位1的個(gè)數(shù))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(191.位1的個(gè)數(shù)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08C基礎(chǔ) mariadb處理的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)硪黄狢基礎(chǔ) mariadb處理的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06詳解c語言中的 strcpy和strncpy字符串函數(shù)使用
strcpy 和strcnpy函數(shù)是字符串復(fù)制函數(shù)。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數(shù)使用,感興趣的朋友跟隨小編要求看看吧2018-10-10詳解C++調(diào)用Python腳本中的函數(shù)的實(shí)例代碼
這篇文章主要介紹了C++調(diào)用Python腳本中的函數(shù) ,需要的朋友可以參考下2018-11-11C語言實(shí)現(xiàn)校園導(dǎo)游系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)校園導(dǎo)游系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03